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 비밀에 대한 액세스 권한을 부여하려면 관리 ID에 Azure RBAC 역할 Key Vault 비밀 사용자를 부여합니다.
Azure Portal에서 컨테이너 앱으로 이동합니다.
설정 섹션에서 ID를 선택합니다.
시스템 할당 탭에서 상태를 켜기로 설정합니다.
참고 항목
여러 리소스에서 다시 사용할 수 있고 앱 수명 주기와 독립적으로 유지되는 사용자 할당 관리 ID를 사용할 수도 있습니다. 이를 사용하려면 사용자 할당 탭을 선택하고 기존 ID를 선택합니다.
저장을 선택하여 시스템 할당 관리 ID를 사용하도록 설정합니다.
시스템 할당 관리 ID를 사용하도록 설정하고 Microsoft Entra ID에 컨테이너 앱을 등록하려는지 확인하는 팝업이 나타납니다.
예를 선택합니다.
설정 섹션에서 비밀을 선택합니다.
추가를 선택합니다.
비밀 추가 컨텍스트 창에서 다음 정보를 입력합니다.
-
이름: 비밀 이름
-
형식: 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>
-
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에서 컨테이너 앱으로 이동합니다.
애플리케이션 섹션에서 수정 버전 및 복제본을 선택합니다.
수정 버전 및 복제본 페이지에서 새 수정 버전 만들기를 선택합니다.
새 수정 버전 만들기 및 배포 페이지의 컨테이너 탭의 컨테이너 이미지 섹션에서 컨테이너를 선택합니다.
편집을 선택합니다.
컨테이너 편집 컨텍스트 창에서 볼륨 탑재 탭을 선택합니다.
새 볼륨 만들기를 선택합니다.
볼륨 추가 컨텍스트 창에서 다음 정보를 입력합니다.
-
볼륨 유형: 를 선택합니다
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에서는 비밀을 볼륨으로 탑재할 수 없습니다.
다음 단계