Azure Container Apps의 비밀 관리
이 문서의 내용
Azure Container Apps를 사용하면 애플리케이션이 중요한 구성 값을 안전하게 저장할 수 있습니다. 애플리케이션 수준에서 비밀이 정의되면 Container Apps의 수정 버전에 보안 값을 사용할 수 있습니다. 또한 크기 조정 규칙 내에서 보안 값을 참조할 수 있습니다. Dapr에서 비밀을 사용하는 방법은 Dapr 통합 을 참조하세요.
비밀은 애플리케이션의 특정 수정 버전 이외의 애플리케이션으로 범위가 지정됩니다.
비밀을 추가, 제거 또는 변경해도 새 수정 버전이 생성되지 않습니다.
각 애플리케이션 수정 버전에서는 하나 이상의 비밀을 참조할 수 있습니다.
여러 수정 버전이 동일한 비밀을 참조할 수 있습니다.
업데이트되거나 삭제된 비밀은 앱의 기존 수정 버전에 자동으로 영향을 주지 않습니다. 비밀이 업데이트되거나 삭제되면 다음 두 가지 방법 중 하나로 변경 내용에 응답할 수 있습니다.
새 수정 버전을 배포합니다.
기존 수정 버전을 다시 시작합니다.
비밀을 삭제하기 전에 이전 비밀을 더 이상 참조하지 않는 새 수정 버전을 배포합니다. 그런 다음, 비밀을 참조하는 모든 수정 버전을 비활성화합니다.
비밀 정의
비밀은 이름/값 쌍의 집합으로 정의됩니다. 각 비밀의 값은 직접 지정되거나 Azure Key Vault에 저장된 비밀에 대한 참조로 지정됩니다.
Container Apps에 비밀 값 저장
포털을 통해 또는 다른 명령줄 옵션을 통해 비밀을 정의하는 경우.
Azure Portal 에서 컨테이너 앱으로 이동합니다.
설정 섹션에서 비밀 을 선택합니다.
추가 를 선택합니다.
비밀 추가 컨텍스트 창에서 다음 정보를 입력합니다.
이름 : 비밀 이름
형식 : Container Apps 비밀 선택
값 : 비밀 값
추가 를 선택합니다.
비밀은 resources.properties.configuration.secrets
섹션의 애플리케이션 수준에서 정의됩니다.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"value": "<MY-CONNECTION-STRING-VALUE>"
}],
}
}
}
여기서는 큐 스토리지 계정에 대한 연결 문자열이 secrets
배열에 선언됩니다. 이 예제에서는 <MY-CONNECTION-STRING-VALUE>
를 연결 문자열의 값으로 대체합니다.
컨테이너 앱을 만들 때 --secrets
매개 변수를 사용하여 비밀이 정의됩니다.
매개 변수는 공백으로 구분된 이름/값 쌍 세트를 허용합니다.
각 쌍은 등호(=
)로 구분됩니다.
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--secrets "queue-connection-string=<CONNECTION_STRING>"
여기서는 큐 스토리지 계정에 대한 연결 문자열이 --secrets
매개 변수에 선언됩니다. <CONNECTION_STRING>
을 연결 문자열 값으로 바꿉니다.
컨테이너 앱을 만들 때 비밀은 매개 변수를 통해 ConfigurationSecrets
전달되는 하나 이상의 비밀 개체로 정의됩니다.
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$TemplateObj = New-AzContainerAppTemplateObject -Name queuereader -Image demos/queuereader:v1
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$ContainerAppArgs = @{
Name = 'my-resource-group'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
여기서는 큐 스토리지 계정에 대한 연결 문자열이 선언됩니다. queue-connection-string
의 값은 $QueueConnectionString
이라는 환경 변수에서 가져옵니다.
Key Vault의 참조 비밀
비밀을 정의할 때 Azure Key Vault에 저장된 비밀에 대한 참조를 만듭니다. Container Apps는 Key Vault에서 비밀 값을 자동으로 검색하여 Container Apps에서 비밀로 사용할 수 있도록 합니다.
Key Vault에서 비밀을 참조하려면 먼저 컨테이너 앱에서 관리 ID를 사용하도록 설정하고 Key Vault 비밀에 대한 ID 액세스 권한을 부여해야 합니다.
컨테이너 앱에서 관리 ID를 사용하도록 설정하려면 관리 ID 를 참조하세요.
Key Vault 비밀에 액세스 권한을 부여하려면 Key Vault에서 만든 관리 ID에 대한 액세스 정책을 만듭니다 . 이 정책에 대한 “가져오기” 비밀 권한을 사용하도록 설정합니다.
Azure Portal 에서 컨테이너 앱으로 이동합니다.
설정 섹션에서 ID 를 선택합니다.
할당된 시스템 탭에서 켜기 를 선택합니다.
저장 을 선택하여 시스템이 할당한 관리 ID를 사용하도록 설정합니다.
설정 섹션에서 비밀 을 선택합니다.
추가 를 선택합니다.
비밀 추가 컨텍스트 창에서 다음 정보를 입력합니다.
이름 : 비밀 이름
형식 : Key Vault 참조 선택
Key Vault 비밀 URL : Key Vault에 있는 비밀의 URI
ID : Key Vault에서 비밀을 검색하는 데 사용할 ID
추가 를 선택합니다.
비밀은 resources.properties.configuration.secrets
섹션의 애플리케이션 수준에서 정의됩니다.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "<KEY-VAULT-SECRET-URI>",
"identity": "system"
}],
}
}
}
여기서는 큐 스토리지 계정에 대한 연결 문자열이 secrets
배열에 선언됩니다. 값은 지정된 ID를 통해 Key Vault에서 자동으로 검색됩니다. 사용자 관리 ID를 사용하려면 system
을 ID의 리소스 ID로 바꿉니다.
<KEY-VAULT-SECRET-URI>
를 Key Vault에 있는 비밀의 URI로 바꿉니다.
컨테이너 앱을 만들 때 --secrets
매개 변수를 사용하여 비밀이 정의됩니다.
매개 변수는 공백으로 구분된 이름/값 쌍 세트를 허용합니다.
각 쌍은 등호(=
)로 구분됩니다.
Key Vault 참조를 지정하려면 <SECRET_NAME>=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<MANAGED_IDENTITY_ID>
형식을 사용합니다. 예들 들어 queue-connection-string=keyvaultref:https://mykeyvault.vault.azure.net/secrets/queuereader,identityref:/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity
입니다.
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>"
여기서는 큐 스토리지 계정에 대한 연결 문자열이 --secrets
매개 변수에 선언됩니다. <KEY_VAULT_SECRET_URI>
를 Key Vault에 있는 비밀의 URI로 바꿉니다. <USER_ASSIGNED_IDENTITY_ID>
를 사용자가 할당한 ID의 리소스 ID로 바꿉니다.
참고 항목
사용자가 할당한 ID에는 Key Vault의 비밀을 읽을 수 있는 액세스 권한이 있어야 합니다. 컨테이너 앱을 만든 후에는 시스템이 할당한 ID를 사용할 수 없으므로 create 명령과 함께 사용할 수 없습니다.
PowerShell에서는 비밀 Key Vault 참조가 지원되지 않습니다.
Key Vault 비밀 URI 및 비밀 순환
Key Vault 비밀 URI는 다음 형식 중 하나여야 합니다.
https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
: 특정 버전의 비밀을 참조합니다.
https://myvault.vault.azure.net/secrets/mysecret
: 비밀의 최신 버전을 참조합니다.
URI에 비밀이 지정되지 않은 경우 앱은 키 자격 증명 모음에 있는 최신 버전을 사용합니다. 새 버전을 사용할 수 있게 되면 앱은 30분 이내에 자동으로 최신 버전을 검색합니다. 환경 변수의 비밀을 참조하는 활성 수정 버전은 자동으로 다시 시작되어 새 값을 선택합니다.
사용되는 비밀 버전을 완전히 제어하려면 URI에서 버전을 지정합니다.
환경 변수에서 비밀 참조
비밀 정의 섹션에 설명된 대로 애플리케이션 수준에서 비밀을 선언한 후 컨테이너 앱에서 새 수정 버전을 만들 때 환경 변수에서 참조할 수 있습니다. 환경 변수가 비밀을 참조하면 해당 값은 비밀에 정의된 값으로 채워집니다.
예시
다음 예제에서는 애플리케이션 수준에서 연결 문자열을 선언하는 애플리케이션을 보여 줍니다. 이 연결은 컨테이너 환경 변수 및 크기 조정 규칙에서 참조됩니다.
컨테이너 앱에서 비밀을 정의 한 후 새 수정 버전을 만들 때 환경 변수에서 참조할 수 있습니다.
Azure Portal 에서 컨테이너 앱으로 이동합니다.
수정 관리 페이지를 엽니다.
새 수정 버전 만들기 를 선택합니다.
새 수정 버전 만들기 및 배포 페이지에서 컨테이너를 선택합니다.
환경 변수 섹션에서 추가 를 선택합니다.
다음 정보를 입력합니다.
이름 : 환경 변수 이름
원본 : 비밀 참조 선택
값 : 참조할 비밀 선택
저장 을 선택합니다.
만들기 를 선택하여 새 수정 버전을 만듭니다.
이 예제에서는 애플리케이션 연결 문자열이 queue-connection-string
으로 선언되어 구성 섹션의 다른 위치에서 사용할 수 있게 됩니다.
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"key_vault_secret_uri": {
"type": "String"
}
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-03-01",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
}]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"env": [
{
"name": "QueueName",
"value": "myqueue"
},
{
"name": "ConnectionString",
"secretRef": "queue-connection-string"
}
]
}
],
"scale": {
"minReplicas": 0,
"maxReplicas": 10,
"rules": [
{
"name": "myqueuerule",
"azureQueue": {
"queueName": "demoqueue",
"queueLength": 100,
"auth": [
{
"secretRef": "queue-connection-string",
"triggerParameter": "connection"
}
]
}
}
]
}
}
}
}]
}
여기서 connection-string
이라는 환경 변수는 애플리케이션 수준 queue-connection-string
비밀에서 해당 값을 가져옵니다. 또한 Azure Queue Storage 스케일링 규칙의 인증 구성은 queue-connection-string
비밀을 사용하여 해당 연결을 정의합니다.
ARM 템플릿을 사용하여 소스 제어에 비밀 값을 커밋하지 않도록 하려면 비밀 값을 ARM 템플릿 매개 변수로 전달합니다.
이 예제에서는 환경 변수에서 참조되는 비밀을 사용하여 Azure CLI를 통해 컨테이너 앱을 만듭니다. Azure CLI의 환경 변수에서 비밀을 참조하려면 해당 값을 secretref:
로 설정하고 비밀 이름을 설정합니다.
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" \
--env-vars "QueueName=myqueue" "ConnectionString=secretref:queue-connection-string"
여기서 connection-string
이라는 환경 변수는 애플리케이션 수준 queue-connection-string
비밀에서 해당 값을 가져옵니다.
PowerShell에서는 비밀 Key Vault 참조가 지원되지 않습니다.
이 예제에서는 환경 변수에서 참조되는 비밀을 사용하여 Azure PowerShell을 통해 컨테이너 앱을 만듭니다. Azure PowerShell의 환경 변수에서 비밀을 참조하려면 해당 값을 secretref:
로 설정하고 비밀 이름을 설정합니다.
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$EnvVarObjQueue = New-AzContainerAppEnvironmentVarObject -Name QueueName -Value myqueue
$EnvVarObjConn = New-AzContainerAppEnvironmentVarObject -Name ConnectionString -SecretRef queue-connection-string -Value secretref
$TemplateObj = New-AzContainerAppTemplateObject -Name myQueueApp -Image demos/myQueueApp:v1 -Env $EnvVarObjQueue, $EnvVarObjConn
$ContainerAppArgs = @{
Name = 'myQueueApp'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
여기서 ConnectionString
이라는 환경 변수는 애플리케이션 수준 $QueueConnectionString
비밀에서 해당 값을 가져옵니다.
볼륨에 비밀 탑재
비밀 정의 섹션의 설명대로 애플리케이션 수준에서 비밀을 선언한 후에는 컨테이너 앱에서 새 수정 버전을 만들 때 볼륨 탑재에서 참조할 수 있습니다. 비밀을 볼륨에 탑재하면 각 비밀이 볼륨에서 파일로 탑재됩니다. 파일 이름은 비밀 이름이며 파일 콘텐츠는 비밀 값입니다. 볼륨 탑재의 모든 비밀을 로드하거나 특정 비밀을 로드할 수 있습니다.
예시
컨테이너 앱에서 비밀을 정의 한 후 새 수정 버전을 만들 때 볼륨 탑재에서 참조할 수 있습니다.
Azure Portal 에서 컨테이너 앱으로 이동합니다.
수정 관리 페이지를 엽니다.
새 수정 버전 만들기 를 선택합니다.
새 수정 버전 만들기 및 배포 페이지에서.
컨테이너를 선택하고 편집 을 선택합니다.
볼륨 탑재 섹션에서 비밀 섹션을 펼칩니다.
새 볼륨 만들기 를 선택합니다.
다음 정보를 입력합니다.
이름 : mysecrets
모든 비밀 탑재 : 사용됨
참고 항목
특정 비밀을 로드하려면 모든 비밀 탑재 를 사용하지 않도록 설정하고 로드할 비밀을 선택합니다.
추가 를 선택합니다.
볼륨 이름 에서 mysecrets 를 선택합니다.
탑재 경로 에 /mnt/secrets 를 입력합니다.
저장 을 선택합니다.
만들기 를 선택하여 볼륨 탑재에서 새 수정 버전을 만듭니다.
이 예제에서는 애플리케이션 수준에서 비밀 2개가 선언됩니다. 이러한 비밀은 Secret
형식의 mysecrets
볼륨에 탑재됩니다. 볼륨이 /mnt/secrets
경로에서 탑재됩니다. 그런 다음, 애플리케이션에서 볼륨 탑재의 비밀을 참조할 수 있습니다.
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"key_vault_secret_uri": {
"type": "Securestring"
},
"api-key": {
"type": "Securestring"
}
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-11-01-preview",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret"
}
]
}
}
}]
}
특정 비밀을 로드하고 탑재된 볼륨 내에서 해당 경로를 지정하려면 볼륨 개체의 secrets
배열에서 비밀을 정의합니다. 다음 예제에서는 mysecrets
볼륨 탑재에서 connection-string.txt
파일 이름이 있는 queue-connection-string
비밀만 로드하는 방법을 보여줍니다.
{
"properties": {
...
"configuration": {
...
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret",
"secrets": [
{
"secretRef": "queue-connection-string",
"path": "connection-string.txt"
}
]
}
]
}
...
}
...
}
앱의 /mnt/secrets/connection-string.txt
에 있는 파일에서 비밀을 읽을 수 있습니다.
이 예제에서는 애플리케이션 수준에서 비밀 2개가 선언됩니다. 이러한 비밀은 Secret
형식의 mysecrets
볼륨에 탑재됩니다. 볼륨이 /mnt/secrets
경로에서 탑재됩니다. 그런 다음, 애플리케이션에서 볼륨 탑재의 비밀을 파일로 읽을 수 있습니다.
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" "api-key=$API_KEY" \
--secret-volume-mount "/mnt/secrets"
특정 비밀을 로드하고 탑재된 볼륨 내에서 해당 경로를 지정하려면 YAML 을 사용하여 앱을 정의합니다.
PowerShell에서는 비밀을 볼륨으로 탑재할 수 없습니다.
다음 단계