Azure Container Apps 애플리케이션에서 중요한 구성 값을 안전하게 저장할 수 있습니다. 애플리케이션 수준에서 비밀이 정의되면 Container Apps의 수정 버전에 보안 값을 사용할 수 있습니다. 또한 크기 조정 규칙 내에서 보안 값을 참조할 수 있습니다. Dapr에서 비밀을 사용하는 방법은 Dapr 통합을 참조하세요.
- 비밀은 애플리케이션의 특정 버전에 국한되지 않고 애플리케이션 전체에 적용됩니다.
- 새 수정 버전은 비밀을 추가, 제거 또는 변경하여 생성되지 않습니다.
- 각 애플리케이션 수정 버전에서는 하나 이상의 비밀을 참조할 수 있습니다.
- 여러 수정 버전에서 동일한 비밀을 참조할 수 있습니다.
업데이트되거나 삭제된 비밀은 앱의 기존 수정 버전에 자동으로 영향을 주지 않습니다. 비밀이 업데이트되거나 삭제되면 다음 두 가지 방법 중 하나로 변경 내용에 응답할 수 있습니다.
- 새 수정 버전을 배포합니다.
- 기존 수정 버전을 다시 시작합니다.
비밀을 삭제하기 전에 이전 비밀을 더 이상 참조하지 않는 새 수정 버전을 배포합니다. 그런 다음, 비밀을 참조하는 모든 수정 버전을 비활성화합니다.
비밀 정의
비밀은 이름/값 쌍의 집합으로 정의됩니다. 각 비밀의 값은 직접 또는 Azure Key Vault 저장된 비밀에 대한 참조로 지정됩니다.
Container Apps에 비밀 값 저장
다음은 포털을 통해 또는 다른 명령줄 옵션을 통해 비밀을 정의할 때 사용됩니다.
Azure 포털 컨테이너 앱으로 이동합니다.
보안 섹션에서 비밀을 선택합니다.
추가를 선택합니다.
비밀 추가 컨텍스트 창에서 다음 정보를 입력합니다.
-
이름: 비밀 이름
-
형식: 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 비밀 값을 자동으로 검색하고 컨테이너 앱에서 비밀로 사용할 수 있도록 합니다.
Key Vault 비밀을 참조하려면 먼저 컨테이너 앱에서 관리 ID를 사용하도록 설정하고 id에 Key Vault 비밀에 대한 액세스 권한을 부여해야 합니다.
컨테이너 앱에서 관리 ID를 사용하도록 설정하려면 관리 ID를 참조하세요.
Key Vault 비밀에 대한 액세스 권한을 부여하려면 Azure RBAC 역할 Key Vault 비밀 사용자 관리 ID에 부여합니다.
Azure 포털 컨테이너 앱으로 이동합니다.
보안 섹션에서 ID를 선택합니다.
시스템 할당 탭에서 상태를 켜짐으로 설정합니다.
주의
여러 리소스에서 다시 사용할 수 있고 앱 수명 주기와 독립적으로 유지되는 사용자 할당 관리 ID를 사용할 수도 있습니다. 이를 사용하려면 사용자 할당 탭을 선택하고 기존 ID를 선택합니다.
저장을 선택하여 시스템 할당 관리 ID를 사용하도록 설정합니다.
시스템 할당 관리 ID를 사용하도록 설정하고 컨테이너 앱을 Microsoft Entra ID 등록하려는지 확인하는 팝업이 나타납니다.
예를 선택합니다.
보안 섹션에서 비밀을 선택합니다.
추가를 선택합니다.
비밀 추가 컨텍스트 창에서 다음 정보를 입력합니다.
-
이름: 비밀 이름
-
Type: Key Vault 참조 항목을 선택하세요.
-
Key Vault 비밀 URL: Key Vault 비밀의 URI입니다. 이 URI의 형식은 다음과 같습니다.
https://<YOUR_KEY_VAULT_NAME>.vault.azure.net/secrets/<YOUR_SECRET_NAME>/<32_DIGIT_HEX_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 명령과 함께 사용할 수 없습니다.
비밀 Key Vault 참조는 PowerShell에서 지원되지 않습니다.
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 포털 컨테이너 앱으로 이동합니다.
애플리케이션 섹션에서 수정 버전 및 복제본을 선택합니다.
수정 버전 및 복제본 페이지에서 새 수정 버전 만들기를 선택합니다.
새 수정 버전 만들기 및 배포 페이지의 컨테이너 탭의 컨테이너 이미지 섹션에서 컨테이너를 선택합니다.
편집을 선택합니다.
컨테이너 컨텍스트 편집 창에서 환경 변수 탭을 선택합니다.
추가를 선택합니다.
다음 정보를 입력합니다.
-
이름: 환경 변수 이름
-
원본: 비밀 참조 선택하십시오
-
값: 이전에 정의한 비밀을 선택합니다.
저장을 선택합니다.
새 수정 버전 만들기 및 배포 페이지에서 만들기를 선택하여 새 수정 버전을 만듭니다.
이 예제에서 애플리케이션 연결 문자열 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 비밀에서 해당 값을 가져옵니다.
비밀 Key Vault 참조는 PowerShell에서 지원되지 않습니다.
이 예제에서는 환경 변수에서 참조되는 비밀이 있는 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 포털 컨테이너 앱으로 이동합니다.
애플리케이션 섹션에서 수정 버전 및 복제본을 선택합니다.
수정 버전 및 복제본 페이지에서 새 수정 버전 만들기를 선택합니다.
새 수정 버전 만들기 및 배포 페이지의 컨테이너 탭의 컨테이너 이미지 섹션에서 컨테이너를 선택합니다.
편집을 선택합니다.
컨테이너 편집 컨텍스트 창에서 볼륨 탑재 탭을 선택합니다.
새 볼륨 만들기를 선택합니다.
볼륨 추가 컨텍스트 창에서 다음 정보를 입력합니다.
-
볼륨 유형: 를 선택합니다
Secret.
-
이름:
mysecrets
-
모든 시크릿 탑재: 활성화됨
주의
특정 비밀을 로드하려면 모든 비밀 탑재를 사용하지 않도록 설정하고 로드할 비밀을 선택합니다.
추가를 선택합니다.
컨테이너 컨텍스트 편집 창의 볼륨 이름 아래에서 mysecrets를 선택합니다.
마운트 경로에 /mnt/secrets를 입력합니다.
저장을 선택합니다.
새 버전 개정을 생성하고 배포 페이지에서 생성을 선택하여 볼륨 마운트를 사용하여 새 버전 개정을 만듭니다.
이 예제에서는 애플리케이션 수준에서 비밀 2개가 선언됩니다. 이러한 비밀은 mysecrets 형식의 Secret 볼륨에 탑재됩니다. 볼륨이 /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 배열에서 비밀을 정의합니다. 다음 예에서는 queue-connection-string 볼륨 마운트에 파일 이름이 mysecrets인 상태로 connection-string.txt 시크릿만 불러오는 방법을 보여줍니다.
{
"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개가 선언됩니다. 이러한 비밀은 mysecrets 형식의 Secret 볼륨에 탑재됩니다. 볼륨이 /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에서는 시크릿을 볼륨으로 마운트할 수 없습니다.
Key Vault 참조 문제 해결
Azure Key Vault 비밀을 참조하는 경우 비밀 검색 또는 동기화 중에 문제가 발생할 수 있습니다. 일반적인 오류 및 해결 방법은 다음과 같습니다.
| 오류 |
원인 |
해결 방법 |
| 관리 ID를 사용할 수 없음 |
컨테이너 앱에 할당된 관리 ID가 없습니다. |
컨테이너 앱에서 시스템 할당 또는 사용자 할당 관리 ID를 사용하도록 설정합니다.
관리 ID를 참조하세요. |
| ID를 찾을 수 없음 |
지정된 관리 ID가 없거나 컨테이너 앱에 할당되지 않습니다. |
아이덴티티가 생성되어 아이덴티티 섹션의 컨테이너 앱에 할당되었는지 확인합니다. |
| Key Vault에서 비활성화된 비밀 |
비밀은 Key Vault 리소스에서 사용하지 않도록 설정됩니다. |
Azure 포털에서 Key Vault로 이동하여 비밀을 활성화합니다. |
| 인증 실패 |
관리 ID에는 비밀을 읽는 데 필요한 권한이 없습니다. |
Key Vault 관리 ID에 Key Vault 비밀 사용자 역할을 부여합니다.
Key Vault 비밀 사용자 참조하세요. |
| RBAC 권한이 거부됨 |
관리 ID에는 Key Vault 액세스할 수 있는 권한이 부족합니다. |
Key Vault RBAC 역할 할당을 확인하고 비밀에 대한 읽기 권한이 포함되어 있는지 확인합니다. |
다음 단계