연습 - 매개 변수 파일 및 보안 매개 변수 추가
이 연습에서는 이전에 만든 Bicep 파일에 대한 값을 제공하는 매개 변수 파일을 만듭니다. 또한 동일한 매개 변수 파일에서 Azure Key Vault 참조를 추가하여 중요한 정보를 안전하게 제공합니다.
프로세스 중에 다음 작업을 수행합니다.
- 몇 가지 보안 매개 변수를 추가합니다.
- 매개 변수 파일을 만듭니다.
- 배포를 테스트하여 매개 변수 파일이 유효한지 확인합니다.
- 키 자격 증명 모음 및 비밀을 만듭니다.
- 키 자격 증명 모음 비밀을 참조하도록 매개 변수 파일을 업데이트합니다.
- 배포를 다시 테스트하여 매개 변수 파일이 여전히 유효한지 확인합니다.
App Service 요금제 SKU의 기본값 제거
템플릿이 전체 환경에서 작동하도록 Azure App Service 요금제의 SKU 정보가 기본값이 아닌 매개 변수 파일에 제공됩니다.
Visual Studio Code의 main.bicep 파일에서 그 기본값이 제거되도록 appServicePlanSku
매개 변수를 업데이트합니다.
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
새 매개 변수 추가
이제 SQL Server 및 데이터베이스를 추가해야 합니다. 먼저, 관리자 로그인과 암호 그리고 데이터베이스 SKU에 대한 매개 변수를 추가합니다. 나중에 해당 값을 설정합니다.
Visual Studio Code의 main.bicep 파일에서 sqlServerAdministratorLogin
, sqlServerAdministratorPassword
및 sqlDatabaseSku
매개 변수를 현재 매개 변수 선언 아래에 추가합니다. 완료 후 매개 변수 선언이 다음 예제와 같아야 합니다.
@description('The name of the environment. This must be dev, test, or prod.')
@allowed([
'dev'
'test'
'prod'
])
param environmentName string = 'dev'
@description('The unique name of the solution. This is used to ensure that resource names are unique.')
@minLength(5)
@maxLength(30)
param solutionName string = 'toyhr${uniqueString(resourceGroup().id)}'
@description('The number of App Service plan instances.')
@minValue(1)
@maxValue(10)
param appServicePlanInstanceCount int = 1
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
@description('The Azure region into which the resources should be deployed.')
param location string = 'eastus'
@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string
@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorPassword string
@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object
sqlServerAdministratorLogin
및 sqlServerAdministratorPassword
매개 변수의 기본값은 지정하지 않습니다. 보안 매개 변수의 기본값을 추가하는 것은 잘못된 보안 관행입니다. 또한 sqlDatabaseSku
의 기본값도 지정하지 않습니다. 매개 변수 파일에서 값을 지정합니다.
새 변수 추가
Visual Studio Code의 main.bicep 파일에서 sqlServerName
및 sqlDatabaseName
변수를 기존 변수 아래에 추가합니다. 완료 후 변수 선언이 다음 예제와 같아야 합니다.
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
SQL 서버 및 데이터베이스 리소스 추가
Visual Studio Code의 main.bicep 파일에서 다음 코드를 파일의 맨 아래에 추가합니다.
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = { name: sqlServerName location: location properties: { administratorLogin: sqlServerAdministratorLogin administratorLoginPassword: sqlServerAdministratorPassword } } resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = { parent: sqlServer name: sqlDatabaseName location: location sku: { name: sqlDatabaseSku.name tier: sqlDatabaseSku.tier } }
변경 내용을 파일에 저장합니다.
Bicep 파일 확인
위의 모든 변경을 완료한 후에는 Bicep 파일이 다음 예제와 같아야 합니다.
@description('The name of the environment. This must be dev, test, or prod.')
@allowed([
'dev'
'test'
'prod'
])
param environmentName string = 'dev'
@description('The unique name of the solution. This is used to ensure that resource names are unique.')
@minLength(5)
@maxLength(30)
param solutionName string = 'toyhr${uniqueString(resourceGroup().id)}'
@description('The number of App Service plan instances.')
@minValue(1)
@maxValue(10)
param appServicePlanInstanceCount int = 1
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
@description('The Azure region into which the resources should be deployed.')
param location string = 'eastus'
@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string
@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorPassword string
@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: appServicePlanName
location: location
sku: {
name: appServicePlanSku.name
tier: appServicePlanSku.tier
capacity: appServicePlanInstanceCount
}
}
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
name: appServiceAppName
location: location
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: sqlServerAdministratorLogin
administratorLoginPassword: sqlServerAdministratorPassword
}
}
resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
parent: sqlServer
name: sqlDatabaseName
location: location
sku: {
name: sqlDatabaseSku.name
tier: sqlDatabaseSku.tier
}
}
아닌 경우 예제를 복사하거나 예제와 일치하도록 템플릿을 조정합니다.
매개 변수 파일 만들기
Visual Studio Code를 열고 main.bicep 파일이 있는 폴더를 엽니다. 이 폴더에서 이름이 main.parameters.dev.json인 새 파일을 만듭니다.
main.parameters.dev.json 파일에서 다음 코드를 추가합니다.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "appServicePlanSku": { "value": { "name": "F1", "tier": "Free" } }, "sqlDatabaseSku": { "value": { "name": "Standard", "tier": "Standard" } } } }
변경 내용을 파일에 저장합니다.
매개 변수 파일을 사용하여 Bicep 템플릿 배포
터미널에서 다음 Azure CLI 명령을 실행합니다. 배포에 대한 매개 변수 파일을 제공하는 것입니다.
az deployment group create \
--template-file main.bicep \
--parameters main.parameters.dev.json
터미널에서 다음 Azure PowerShell 명령을 실행합니다. 배포에 대한 매개 변수 파일을 제공하는 것입니다.
New-AzResourceGroupDeployment `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
배포를 실행할 때 sqlServerAdministratorLogin
및 sqlServerAdministratorPassword
매개 변수의 값을 입력하라는 메시지가 표시됩니다. 템플릿에 기본값이 지정되어 있으므로 solutionName
을 지정할 필요가 없습니다. 나머지 다른 매개 변수 값은 매개 변수 파일에 지정되므로 지정할 필요가 없습니다.
팁
보안 매개 변수를 입력할 때 선택하는 값은 다음 몇 가지 규칙을 따라야 합니다.
sqlServerAdministratorLogin
은admin
또는root
같이 쉽게 추측할 수 있는 로그인 이름이면 안 됩니다. 영숫자만 포함할 수 있으며 문자로 시작해야 합니다.sqlServerAdministratorPassword
는 8자 이상이어야 하며 소문자, 대문자, 숫자 및 기호를 포함해야 합니다. 암호 복잡도에 관한 자세한 내용은 SQL Azure 암호 정책을 참조하세요.
매개 변수 값이 이러한 요구 사항을 충족하지 않으면 Azure SQL이 서버를 배포하지 않습니다.
그리고 입력하는 로그인과 암호를 메모해 두어야 합니다. 다음 섹션에서 사용할 예정입니다.
배포는 완료하는 데 약 2분이 걸릴 수 있습니다.
키 자격 증명 모음 및 비밀 만들기
장난감 회사에는 배포에 필요한 비밀이 있는 키 자격 증명 모음이 있습니다. 이 시나리오를 시뮬레이션하기 위해 새 키 자격 증명 모음을 만들고, 사용할 비밀을 추가할 것입니다.
터미널에서 다음 명령을 실행하여 키 자격 증명 모음 및 비밀을 만듭니다. 이러한 명령을 실행하기 전에 변수 값을 업데이트합니다. 키 자격 증명 모음 이름은 대문자와 소문자, 하이픈(-
) 및 숫자만 포함할 수 있는 3~24자의 전역적으로 고유한 문자열이어야 합니다. 예를 들어 demo-kv-1234567abcdefg입니다.
주의
앞 단계에서 사용한 것과 동일한 로그인 및 암호를 사용해야 합니다. 그렇지 않으면 다음 배포가 성공적으로 완료되지 않습니다.
keyVaultName
의 경우 YOUR-KEY-VAULT-NAME
을 키 자격 증명 모음의 이름으로 바꿉니다. login
및 password
변수에 대한 read
명령은 값을 묻는 메시지를 표시합니다. 입력할 때 값은 터미널에 표시되지 않으며 명령 기록에 저장되지 않습니다.
Bash 터미널 세션에서 변수 값을 보호하려면 다음 항목을 알고 있어야 합니다.
- 변수 값은 보안 문자열로 저장되지 않으며 명령줄에
$yourVariableName
과 같은 명령을 입력하거나echo
명령을 사용하여 표시할 수 있습니다. 이 연습에서는 자격 증명 모음 비밀을 만든 후 값을 입력하지 않고read
명령을 실행하여 각 변수의 기존 값을 제거할 수 있습니다. az keyvault secret set
은--value
매개 변수를 사용하여 비밀의 값을 만듭니다. 이 명령의 출력에는 비밀의 값이 포함된value
라는 속성이 표시됩니다. 예제에 표시된 대로--output none
매개 변수를 사용하여 명령의 전체 출력을 표시하지 않을 수 있습니다.
keyVaultName
, login
및 password
변수를 만들려면 각 명령을 별도로 실행합니다. 그런 다음, 명령 블록을 실행하여 키 자격 증명 모음 및 비밀을 만들 수 있습니다.
keyVaultName='YOUR-KEY-VAULT-NAME'
read -s -p "Enter the login name: " login
read -s -p "Enter the password: " password
az keyvault create --name $keyVaultName --location eastus --enabled-for-template-deployment true
az keyvault secret set --vault-name $keyVaultName --name "sqlServerAdministratorLogin" --value $login --output none
az keyvault secret set --vault-name $keyVaultName --name "sqlServerAdministratorPassword" --value $password --output none
참고
배포 시 자격 증명 모음의 비밀을 Azure에서 사용할 수 있도록 자격 증명 모음에서 --enabled-for-template-deployment
설정을 설정합니다. 이 설정을 설정하지 않으면 기본적으로 배포에서 자격 증명 모음의 비밀에 액세스할 수 없습니다.
또한 배포를 실행하는 모든 사용자는 자격 증명 모음에 액세스할 수 있는 권한도 있어야 합니다. 키 자격 증명 모음을 만든 사람이 소유자이므로 이 연습에서 사용 권한을 명시적으로 부여할 필요가 없습니다. 사용자의 자격 증명 모음은 비밀에 대한 액세스 권한을 부여해야 합니다.
keyVaultName
의 경우 YOUR-KEY-VAULT-NAME
을 키 자격 증명 모음의 이름으로 바꿉니다. login
및 password
변수에 대한 Read-Host
명령은 값을 묻는 메시지를 표시합니다. 입력할 때 값은 터미널에 표시되지 않으며 명령 기록에 저장되지 않습니다. 값은 보안 문자열로 저장됩니다.
keyVaultName
, login
및 password
변수를 만들려면 각 명령을 별도로 실행합니다. 그런 다음, 명령 블록을 실행하여 키 자격 증명 모음 및 비밀을 만들 수 있습니다.
$keyVaultName = 'YOUR-KEY-VAULT-NAME'
$login = Read-Host "Enter the login name" -AsSecureString
$password = Read-Host "Enter the password" -AsSecureString
New-AzKeyVault -VaultName $keyVaultName -Location eastus -EnabledForTemplateDeployment
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name 'sqlServerAdministratorLogin' -SecretValue $login
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name 'sqlServerAdministratorPassword' -SecretValue $password
참고
배포 시 자격 증명 모음의 비밀을 Azure에서 사용할 수 있도록 자격 증명 모음에서 -EnabledForTemplateDeployment
설정을 설정합니다. 이 설정을 설정하지 않으면 기본적으로 배포에서 자격 증명 모음의 비밀에 액세스할 수 없습니다.
또한 배포를 실행하는 모든 사용자는 자격 증명 모음에 액세스할 수 있는 권한도 있어야 합니다. 키 자격 증명 모음을 만든 사람이 소유자이므로 이 연습에서 사용 권한을 명시적으로 부여할 필요가 없습니다. 사용자의 자격 증명 모음은 비밀에 대한 액세스 권한을 부여해야 합니다.
키 자격 증명 모음의 리소스 ID 가져오기
배포에서 키 자격 증명 모음 비밀을 사용하려면 자격 증명 모음의 리소스 ID가 필요합니다. 다음 명령을 실행하여 키 자격 증명 모음의 리소스 ID를 검색합니다.
az keyvault show --name $keyVaultName --query id --output tsv
(Get-AzKeyVault -Name $keyVaultName).ResourceId
리소스 ID는 다음 예와 같습니다.
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets
리소스 ID를 복사합니다. 다음 단계에서 사용합니다.
매개 변수 파일에 키 자격 증명 모음 참조 추가
main.parameters.dev.json 파일에서
sqlDatabaseSku
매개 변수의 닫는 중괄호 뒤에 다음 코드를 추가합니다.YOUR-KEY-VAULT-RESOURCE-ID
를 앞 단계에서 복사한 키 자격 증명 모음 리소스 ID의 값으로 바꿔야 합니다. 완료 후 매개 변수 파일이 다음 예제와 같아야 합니다.{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "appServicePlanSku": { "value": { "name": "F1", "tier": "Free" } }, "sqlDatabaseSku": { "value": { "name": "Standard", "tier": "Standard" } }, "sqlServerAdministratorLogin": { "reference": { "keyVault": { "id": "YOUR-KEY-VAULT-RESOURCE-ID" }, "secretName": "sqlServerAdministratorLogin" } }, "sqlServerAdministratorPassword": { "reference": { "keyVault": { "id": "YOUR-KEY-VAULT-RESOURCE-ID" }, "secretName": "sqlServerAdministratorPassword" } } } }
변경 내용을 파일에 저장합니다.
매개 변수 파일 및 Azure Key Vault 참조를 사용하여 Bicep 템플릿 배포
터미널에서 다음 Azure CLI 명령을 실행합니다. Bicep 파일과 함께 매개 변수 파일을 제공합니다.
az deployment group create \
--template-file main.bicep \
--parameters main.parameters.dev.json
터미널에서 다음 Azure PowerShell 명령을 실행합니다. Bicep 파일과 함께 매개 변수 파일을 제공합니다.
New-AzResourceGroupDeployment `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
이번에는 배포를 실행할 때 sqlServerAdministratorLogin
및 sqlServerAdministratorPassword
매개 변수의 값을 입력하라는 메시지가 표시되지 않습니다. 그 대신 Azure가 사용자의 키 자격 증명 모음에서 값을 검색합니다.
Azure 리소스가 이미 있으므로 이번에는 배포가 더 빨리 완료됩니다.
배포 확인
브라우저에서 Azure Portal로 돌아갑니다. 리소스 그룹으로 이동합니다. 이 배포에는 첫 번째 배포와 동일한 이름이 사용되었으므로 성공적인 배포가 하나 표시됩니다.
1개 성공 링크를 선택합니다.
이름이 main이라는 배포를 선택합니다.
왼쪽 메뉴에서 입력을 선택합니다.
appServicePlanSku
및sqlDatabaseSku
매개 변수 값 둘 다 매개 변수 파일의 값으로 설정되어 있습니다. 또한sqlServerAdministratorLogin
및sqlServerAdministratorPassword
매개 변수 값은 표시되지 않는데, 그 이유는@secure()
데코레이터를 적용했기 때문입니다.