Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Use identidades geridas para recursos Azure para executar código em Azure Container Instances que interaja com outros serviços Azure. Não tens de manter segredos ou credenciais no código. A funcionalidade fornece uma implantação de Instâncias de Contêineres com uma identidade gerida automaticamente no Microsoft Entra ID.
Neste artigo, aprende mais sobre identidades geridas em Instâncias de Container. Tu também:
- Ative uma identidade atribuída pelo utilizador ou pelo sistema num grupo de contentores.
- Conceda à identidade acesso a um cofre de chaves Azure.
- Use a identidade gerida para aceder a um cofre de chaves a partir de um contentor em funcionamento.
Adapte os exemplos para ativar e usar identidades em Instâncias de Container para aceder a outros serviços Azure. Estes exemplos são interativos. Na prática, as imagens dos teus contentores executariam código para aceder aos serviços Azure.
Por que usar uma identidade gerida?
Use uma identidade gerida num contentor em execução para autenticar qualquer serviço que suporte autenticação Microsoft Entra sem gerir credenciais no seu código de contentor. Para serviços que não suportam autenticação Microsoft Entra, pode armazenar segredos num cofre de chaves Azure e usar a identidade gerida para aceder ao cofre de chaves e obter credenciais. Para mais informações sobre a utilização de uma identidade gerida, consulte O que são identidades geridas para recursos Azure?.
Ativar uma identidade gerida
Ao criar um grupo de contentores, ative uma ou mais identidades geridas definindo uma propriedade ContainerGroupIdentity . Também pode ativar ou atualizar identidades geridas depois de um grupo de contentores estar a funcionar. Qualquer uma das ações faz com que o grupo de contentores reinicie. Para definir as identidades num grupo de contentores novo ou existente, use o CLI do Azure, um modelo Azure Resource Manager, um ficheiro YAML ou outra ferramenta Azure.
O Container Instances suporta ambos os tipos de identidades Azure geridas: atribuídas pelo utilizador e atribuídas pelo sistema. Num grupo de contentores, pode ativar uma identidade atribuída pelo sistema, uma ou mais identidades atribuídas pelo utilizador, ou ambos os tipos de identidades. Se não está familiarizado com identidades geridas para recursos Azure, veja a visão geral.
Usar uma identidade gerenciada
Para usar uma identidade gerida, a identidade deve ter acesso a um ou mais recursos de serviço Azure (como uma aplicação web, um cofre de chaves ou uma conta de armazenamento) na subscrição. Usar uma identidade gerida num contentor em execução é semelhante a usar uma identidade numa máquina virtual Azure (VM). Para mais informações, consulte as orientações de VM para usar um token, Azure PowerShell ou CLI do Azure, ou os SDKs do Azure.
Prerequisites
Utilize o ambiente Bash no Azure Cloud Shell. Para mais informações, veja Get started with Azure Cloud Shell.
Se preferir executar comandos de referência da CLI localmente, instale o CLI do Azure. Se estiver a usar Windows ou macOS, considere executar o CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.
Se você estiver usando uma instalação local, entre na CLI do Azure usando o comando az login . Para concluir o processo de autenticação, siga os passos exibidos no seu terminal. Para outras opções de entrada, consulte Autenticar no Azure usando a CLI do Azure.
Quando solicitado, instale a extensão do CLI do Azure na primeira utilização. Para obter mais informações sobre extensões, consulte Usar e gerenciar extensões com a CLI do Azure.
Execute az version para descobrir a versão e as bibliotecas dependentes que estão instaladas. Para atualizar para a versão mais recente, execute az upgrade.
- Este artigo requer a versão 2.0.49 ou posterior da CLI do Azure. Se você usa o Azure Cloud Shell, a versão mais recente já está instalada.
Criar um cofre de chaves do Azure
Os exemplos neste artigo utilizam uma identidade gerida em Instâncias de Contêiner para aceder a um segredo armazenado no Azure Key Vault.
Primeiro, crie um grupo de recursos chamado myResourceGroup na localização eastus com o seguinte comando az group create :
az group create --name myResourceGroup --location eastus
Usa o comando create do az-keyvault para criar um cofre de chaves. Certifique-se de especificar um nome único para o cofre de chaves.
az keyvault create \
--name mykeyvault \
--resource-group myResourceGroup \
--location eastus
Armazene um segredo exemplo no cofre de chaves usando o comando az keyvault secret set:
az keyvault secret set \
--name SampleSecret \
--value "Hello Container Instances" \
--description ACIsecret --vault-name mykeyvault
Continue com os exemplos seguintes para aceder ao cofre de chaves usando uma identidade gerida atribuída pelo utilizador ou pelo sistema nas Instâncias de Contentores.
Exemplo 1: Usar uma identidade atribuída pelo utilizador para aceder ao cofre de chaves Azure
Criar uma identidade
Primeiro, crie uma identidade na sua subscrição usando o comando az identity create. Podes usar o mesmo grupo de recursos que foi usado para criar o cofre de chaves. Também podes usar um diferente.
az identity create \
--resource-group myResourceGroup \
--name myACIId
Para usar a identidade nas etapas seguintes, utilize o comando az identity show para armazenar o ID do serviço principal e o ID de recurso da identidade em variáveis.
# Get service principal ID of the user-assigned identity
SP_ID=$(az identity show \
--resource-group myResourceGroup \
--name myACIId \
--query principalId --output tsv)
# Get resource ID of the user-assigned identity
RESOURCE_ID=$(az identity show \
--resource-group myResourceGroup \
--name myACIId \
--query id --output tsv)
Conceder acesso de identidade atribuída pelo utilizador ao cofre de chaves
Execute o seguinte comando azkeyvault set-policy para definir uma política de acesso no cofre de chaves. O exemplo seguinte permite que a identidade atribuída ao utilizador obtenha segredos do cofre de chaves.
az keyvault set-policy \
--name mykeyvault \
--resource-group myResourceGroup \
--object-id $SP_ID \
--secret-permissions get
Ativar a identidade atribuída pelo utilizador num grupo de contentores
Execute o seguinte comando az container create para criar uma instância de container baseada na imagem da azure-cli Microsoft. Este exemplo fornece um único grupo de contentores que pode usar interativamente para executar a CLI do Azure e aceder a outros serviços Azure. Nesta secção, apenas o sistema operativo base é utilizado. Para um exemplo de utilização do CLI do Azure no contentor, veja Ativar identidade atribuída ao sistema num grupo de contentores.
O --assign-identity parâmetro transmite a sua identidade gerida atribuída pelo utilizador ao grupo. O comando de longa duração mantém o contentor em execução. Este exemplo usa o mesmo grupo de recursos que foi usado para criar o cofre de chaves, mas podes especificar um diferente.
az container create \
--resource-group myResourceGroup \
--name mycontainer \
--image mcr.microsoft.com/azure-cli \
--assign-identity $RESOURCE_ID \
--command-line "tail -f /dev/null"
Em poucos segundos, deverá receber uma resposta do CLI do Azure a indicar que a implementação terminou. Verifique o estado com o comando az container show.
az container show \
--resource-group myResourceGroup \
--name mycontainer
A identity secção na saída é semelhante ao seguinte exemplo, que mostra que a identidade está definida no grupo de contentores. O principalID abaixo userAssignedIdentities é o principal de serviço da identidade que criou no Microsoft Entra ID:
[...]
"identity": {
"principalId": "null",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
}
}
},
[...]
Use a identidade atribuída pelo utilizador para obter um segredo do cofre de chaves
Agora podes usar a identidade gerida dentro da instância do contentor em execução para aceder ao cofre de chaves. Primeiro, abra um shell Bash no container.
az container exec \
--resource-group myResourceGroup \
--name mycontainer \
--exec-command "/bin/bash"
Executa os seguintes comandos na shell do Bash no contentor. Para obter um token de acesso para usar o Microsoft Entra ID na autenticação do cofre de chaves, execute o seguinte comando:
client_id="00001111-aaaa-2222-bbbb-3333cccc4444"
curl "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net&client_id=$client_id" -H Metadata:true -s
Output:
{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9......xxxxxxxxxxxxxxxxx","refresh_token":"","expires_in":"28799","expires_on":"1539927532","not_before":"1539898432","resource":"https://vault.azure.net/","token_type":"Bearer"}
Para armazenar o token de acesso numa variável para usar em comandos subsequentes de autenticação, execute o seguinte comando:
TOKEN=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true | jq -r '.access_token')
Agora usa o token de acesso para autenticares no cofre de chaves e ler um segredo. Certifique-se de substituir o nome do seu cofre de chaves na URL (https://mykeyvault.vault.azure.net/...):
curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=7.4 -H "Authorization: Bearer $TOKEN"
A resposta é semelhante ao seguinte exemplo que mostra o segredo. No teu código, analisas essa saída para obter o segredo. Depois, usa o segredo numa operação subsequente para aceder a outro recurso Azure.
{"value":"Hello Container Instances","contentType":"ACIsecret","id":"https://mykeyvault.vault.azure.net/secrets/SampleSecret/xxxxxxxxxxxxxxxxxxxx","attributes":{"enabled":true,"created":1539965967,"updated":1539965967,"recoveryLevel":"Purgeable"},"tags":{"file-encoding":"utf-8"}}
Exemplo 2: Use uma identidade atribuída pelo sistema para aceder a um cofre de chaves Azure
Ativar a identidade atribuída ao sistema num grupo de contentores
Execute o seguinte comando az container create para criar uma instância de container baseada na imagem da azure-cli Microsoft. Este exemplo fornece um único grupo de contentores que pode usar interativamente para executar a CLI do Azure e aceder a outros serviços Azure.
O --assign-identity parâmetro sem outro valor permite uma identidade gerida atribuída pelo sistema ao grupo. A identidade é limitada ao grupo de recursos do grupo de contentores. O comando de longa duração mantém o contentor em execução. Este exemplo utiliza o mesmo grupo de recursos que foi usado para criar o cofre de chaves, que está no âmbito da identidade.
# Get the resource ID of the resource group
RG_ID=$(az group show --name myResourceGroup --query id --output tsv)
# Create container group with system-managed identity
az container create \
--resource-group myResourceGroup \
--name mycontainer \
--image mcr.microsoft.com/azure-cli \
--assign-identity --scope $RG_ID \
--command-line "tail -f /dev/null"
Dentro de alguns segundos, deverá receber uma resposta do CLI do Azure a indicar que a implementação terminou. Verifique o estado com o comando az container show.
az container show \
--resource-group myResourceGroup \
--name mycontainer
A identity secção no resultado é semelhante ao seguinte exemplo, que mostra que uma identidade atribuída ao sistema é criada no Microsoft Entra ID:
[...]
"identity": {
"principalId": "bbbbbbbb-cccc-dddd-2222-333333333333",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
[...]
**
Atribua uma variável ao valor de principalId (o ID do principal de serviço) da identidade a utilizar em etapas subsequentes.
SP_ID=$(az container show \
--resource-group myResourceGroup \
--name mycontainer \
--query identity.principalId --out tsv)
Conceder ao grupo de contentores acesso ao cofre de chaves
Execute o seguinte comando azkeyvault set-policy para definir uma política de acesso no cofre de chaves. O exemplo seguinte permite que a identidade gerida pelo sistema obtenha segredos do cofre de chaves:
az keyvault set-policy \
--name mykeyvault \
--resource-group myResourceGroup \
--object-id $SP_ID \
--secret-permissions get
Use a identidade do grupo de contentores para obter um segredo do cofre de chaves
Agora podes usar a identidade gerida para aceder ao cofre de chaves dentro da instância do contentor em execução. Primeiro, abra um shell Bash no container.
az container exec \
--resource-group myResourceGroup \
--name mycontainer \
--exec-command "/bin/bash"
Executa os seguintes comandos na shell do Bash no contentor. Primeiro, inicie sessão na CLI do Azure usando a identidade gerida:
az login --identity
Do contentor em funcionamento, recupere o segredo do cofre de chaves:
az keyvault secret show \
--name SampleSecret \
--vault-name mykeyvault --query value
O valor do segredo é recuperado:
"Hello Container Instances"
Ative a identidade gerida usando um modelo do Gestor de Recursos
Para ativar uma identidade gerida num grupo de contentores usando um modelo de Gestor de Recursos, defina a identity propriedade do Microsoft.ContainerInstance/containerGroups objeto com um ContainerGroupIdentity objeto. Os seguintes excertos mostram a identity propriedade configurada para diferentes cenários. Para mais informações, consulte a referência do modelo do Gestor de Recursos. Especifique um mínimo apiVersion de 2018-10-01.
Identidade atribuída pelo utilizador
Uma identidade atribuída pelo utilizador é um ID de recurso da seguinte forma:
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}"
Pode ativar uma ou mais identidades atribuídas pelo utilizador.
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"myResourceID1": {
}
}
}
Identidade atribuída ao sistema
"identity": {
"type": "SystemAssigned"
}
Identidades atribuídas pelo sistema e pelo utilizador
Num grupo de contentores, pode ativar tanto uma identidade atribuída pelo sistema como uma ou mais identidades atribuídas pelo utilizador.
"identity": {
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"myResourceID1": {
}
}
}
...
Ativar a identidade gerida usando um ficheiro YAML
Para permitir uma identidade gerida num grupo de contentores implementado através de um ficheiro YAML, inclua o seguinte YAML.
Especifique um mínimo apiVersion de 2018-10-01.
Identidade atribuída pelo utilizador
Uma identidade atribuída pelo utilizador é um ID de recurso da seguinte forma:
'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'
Pode ativar uma ou mais identidades atribuídas pelo utilizador.
identity:
type: UserAssigned
userAssignedIdentities:
{'myResourceID1':{}}
Identidade atribuída ao sistema
identity:
type: SystemAssigned
Identidades atribuídas pelo sistema e pelo utilizador
Num grupo de contentores, pode ativar tanto uma identidade atribuída pelo sistema como uma ou mais identidades atribuídas pelo utilizador.
identity:
type: SystemAssigned, UserAssigned
userAssignedIdentities:
{'myResourceID1':{}}
Identidade gerida em contentores Windows
A identidade gerida nos grupos de contentores do Windows funciona de forma diferente dos grupos de contentores do Linux. Para contentores Windows, o servidor de metadados (169.254.169.254) não está disponível para obter um token Microsoft Entra. Em vez disso, envie um pedido de token para IDENTITY_ENDPOINT e inclua IDENTITY_HEADER como cabeçalho secreto. O Azure injeta IDENTITY_ENDPOINT e IDENTITY_HEADER como variáveis de ambiente no contentor.
Crie um grupo de contentores do Windows com identidade gerida
Execute o seguinte comando az container create para criar um grupo de contentores do Windows com uma identidade gerida atribuída pelo utilizador. Substitua o grupo de recursos, nome e ID de recurso de identidade pelos teus próprios valores.
az container create \
--resource-group myResourceGroup \
--name mywindowscontainer \
--image mcr.microsoft.com/windows/nanoserver:1809 \
--assign-identity $RESOURCE_ID \
--os-type windows \
--command-line "ping -t localhost"
Recuperar um token num contentor do Windows
Se estiver a usar uma identidade gerida atribuída pelo utilizador, inclua principalId no pedido. Se estiver a usar uma identidade gerida atribuída pelo sistema, omita principalId.
curl -G "%IDENTITY_ENDPOINT%" ^
--data-urlencode "resource=https://vault.azure.net" ^
--data-urlencode "principalId=<principal-id>" ^
-H "secret: %IDENTITY_HEADER%"
Exemplo de solicitação do PowerShell:
$identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "aaaaaaaa-bbbb-cccc-1111-222222222222"
$response = Invoke-RestMethod -Uri $identityEndpoint `
-Method Get `
-Headers @{ secret = $identityHeader } `
-Body @{ resource = $resource; principalId = $principalId } `
-ContentType "application/x-www-form-urlencoded"
$response.access_token
As az login bibliotecas de comandos e clientes que dependem do servidor de metadados (169.254.169.254) não funcionam num contentor do Windows.
Os contentores do Windows numa rede virtual não conseguem ligar-se ao endpoint de identidade gerida. Como resultado, não pode gerar um token de identidade gerida nesse cenário.
Sugestão
Para uma identidade atribuída pelo utilizador, inclua o principalId da identidade no pedido do token, conforme mostrado no script anterior. Para uma identidade atribuída ao sistema , omita principalId.
Exemplo: ler um blob do Armazenamento do Azure a partir de um contentor do Windows
Este exemplo de ponta a ponta implementa um grupo de contentores do Windows com uma identidade atribuída pelo utilizador, e depois usa essa identidade dentro do contentor para descarregar um blob.
Primeiro, conceda à identidade atribuída pelo utilizador acesso à conta de armazenamento (uma única vez). A função Leitor de Dados de Blob de Armazenamento é suficiente para descarregar um blob:
PRINCIPAL_ID=$(az identity show --resource-group myResourceGroup --name myACIId --query principalId --output tsv)
STORAGE_ID=$(az storage account show --name mystorageaccount --query id --output tsv)
az role assignment create \
--assignee-object-id $PRINCIPAL_ID \
--assignee-principal-type ServicePrincipal \
--role "Storage Blob Data Reader" \
--scope $STORAGE_ID
De seguida, implemente o grupo de contentores do Windows usando um ficheiro YAML (deploy-aci.yaml). O comando de longa duração mantém o grupo vivo para que az container exec possas entrar nele:
apiVersion: '2023-05-01'
location: eastus
name: mywindowscg
type: Microsoft.ContainerInstance/containerGroups
identity:
type: UserAssigned
userAssignedIdentities:
'/subscriptions/<subscriptionId>/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId': {}
properties:
osType: Windows
restartPolicy: Always
containers:
- name: mycontainer
properties:
image: mcr.microsoft.com/powershell:lts-nanoserver-ltsc2022
command:
- pwsh
- -NoProfile
- -Command
- 'while ($true) { Start-Sleep -Seconds 3600 }'
resources:
requests:
cpu: 2
memoryInGB: 4
az container create --resource-group myResourceGroup --file deploy-aci.yaml
Depois de o grupo estar a funcionar, abra um shell PowerShell no contentor:
az container exec \
--resource-group myResourceGroup \
--name mywindowscg \
--container-name mycontainer \
--exec-command "pwsh"
Dentro da shell do contentor, solicita um token com âmbito de armazenamento e usa-o para descarregar o blob. Como o contentor não inclui a CLI do Azure, passe diretamente o principalId da identidade:
$principalId = "<user-assigned-identity-principalId>"
$storageAccount = "mystorageaccount"
$container = "mycontainer"
$blob = "hello.txt"
$tokenResponse = Invoke-RestMethod -Uri $env:IDENTITY_ENDPOINT `
-Method Get `
-Headers @{secret = $env:IDENTITY_HEADER} `
-Body @{resource = "https://storage.azure.com/"; principalId = $principalId} `
-ContentType "application/x-www-form-urlencoded"
$blobUrl = "https://$storageAccount.blob.core.windows.net/$container/$blob"
Invoke-WebRequest -Uri $blobUrl `
-Headers @{ Authorization = "Bearer $($tokenResponse.access_token)"; "x-ms-version" = "2023-11-03" } `
-OutFile "C:\$blob"
Get-Content "C:\$blob"
O contentor autentica-se para armazenamento usando apenas a sua identidade gerida. Adapte o valor de resource e o endpoint de destino para chamar outros serviços do Azure.
Conteúdo relacionado
- Saiba mais sobre identidades geridas para recursos Azure.
- Veja um exemplo do SDK do Azure Go de usar uma identidade gerida para aceder a um cofre de chaves a partir de Instâncias de Contentor.