Verificatie tussen registers in een ACR-taak met behulp van een door Azure beheerde identiteit

In een ACR-taak kunt u een beheerde identiteit inschakelen voor Azure-resources. De taak kan de identiteit gebruiken voor toegang tot andere Azure-resources, zonder referenties op te geven of te beheren.

In dit artikel leert u hoe u een beheerde identiteit in een taak kunt inschakelen om een installatiekopie op te halen uit een ander register dan het register dat wordt gebruikt om de taak uit te voeren.

Voor het maken van de Azure-resources moet u voor dit artikel Azure CLI versie 2.0.68 of hoger uitvoeren. Voer az --version uit om de versie te bekijken. Zie Azure CLI installeren als u de CLI wilt installeren of een upgrade wilt uitvoeren.

Overzicht van scenario's

Met de voorbeeldtaak wordt een basisinstallatiekopie opgehaald uit een ander Azure-containerregister om een toepassingsinstallatiekopie te bouwen en te pushen. Als u de basisinstallatiekopie wilt ophalen, configureert u de taak met een beheerde identiteit en wijst u de juiste machtigingen toe.

In dit voorbeeld ziet u stappen met behulp van een door de gebruiker toegewezen of door het systeem toegewezen beheerde identiteit. Uw keuze van identiteit is afhankelijk van de behoeften van uw organisatie.

In een praktijkscenario kan een organisatie een set basisinstallatiekopieën onderhouden die door alle ontwikkelteams worden gebruikt om hun toepassingen te bouwen. Deze basisinstallatiekopieën worden opgeslagen in een bedrijfsregister, waarbij elk ontwikkelteam alleen pull-rechten heeft.

Vereisten

Voor dit artikel hebt u twee Azure-containerregisters nodig:

  • U gebruikt het eerste register om ACR-taken te maken en uit te voeren. In dit artikel heet dit register myregistry.
  • Het tweede register fungeert als host voor een basisinstallatiekopieën die worden gebruikt voor de taak om een installatiekopieën te maken. In dit artikel heet het tweede register mybaseregistry.

Vervang in latere stappen door uw eigen registernamen.

Als u nog niet over de benodigde Azure-containerregisters beschikt, raadpleegt u Quickstart: Een privécontainerregister maken met behulp van de Azure CLI. U hoeft nog geen installatiekopieën naar het register te pushen.

Basisregister voorbereiden

Voer voor demonstratiedoeleinden als eenmalige bewerking [az acr import][az-acr-import] uit om een openbare Node.js-installatiekopieën uit Docker Hub in het basisregister te importeren. In de praktijk kan een ander team of proces in de organisatie installatiekopieën in het basisregister onderhouden.

az acr import --name mybaseregistry \
  --source docker.io/library/node:15-alpine \
  --image baseimages/node:15-alpine 

Taakstappen definiëren in YAML-bestand

De stappen voor deze voorbeeldtaak met meerdere stappen worden gedefinieerd in een YAML-bestand. Maak een bestand met de naam helloworldtask.yaml in uw lokale werkmap en plak de volgende inhoud. Werk de waarde van REGISTRY_NAME in de buildstap bij met de servernaam van het basisregister.

version: v1.1.0
steps:
# Replace mybaseregistry with the name of your registry containing the base image
  - build: -t $Registry/hello-world:$ID  https://github.com/Azure-Samples/acr-build-helloworld-node.git#main -f Dockerfile-app --build-arg REGISTRY_NAME=mybaseregistry.azurecr.io
  - push: ["$Registry/hello-world:$ID"]

In de build-stap wordt het Dockerfile-app bestand in de opslagplaats Azure-Samples/acr-build-helloworld-node gebruikt om een installatiekopie te maken. De --build-arg verwijst naar het basisregister om de basisinstallatiekopie op te halen. Wanneer de installatiekopie is gemaakt, wordt deze naar het register gepusht dat wordt gebruikt om de taak uit te voeren.

Optie 1: Taak maken met een door de gebruiker toegewezen identiteit

Met de stappen in deze sectie wordt een taak gemaakt en wordt een door de gebruiker toegewezen identiteit ingeschakeld. Als u in plaats daarvan een door het systeem toegewezen identiteit wilt inschakelen, raadpleegt u Optie 2: Taak maken met door het systeem toegewezen identiteit.

Een door de gebruiker toegewezen identiteit maken

Maak een identiteit met de naam myACRTasksId in uw abonnement met behulp van de opdracht az identity create . U kunt dezelfde resourcegroep gebruiken die u eerder hebt gebruikt om een containerregister te maken, of een andere.

az identity create \
  --resource-group myResourceGroup \
  --name myACRTasksId

Als u de door de gebruiker toegewezen identiteit in de volgende stappen wilt configureren, gebruikt u de opdracht az identity show om de resource-id, principal-id en client-id van de identiteit op te slaan in variabelen.

# Get resource ID of the user-assigned identity
resourceID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACRTasksId \
  --query id --output tsv)

# Get principal ID of the task's user-assigned identity
principalID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACRTasksId \
  --query principalId --output tsv)

# Get client ID of the user-assigned identity
clientID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACRTasksId \
  --query clientId --output tsv)

Taak maken

Maak de taak helloworldtask door de volgende opdracht az acr task create uit te voeren. De taak wordt uitgevoerd zonder broncodecontext en de opdracht verwijst naar het bestand helloworldtask.yaml in de werkmap. De --assign-identity parameter geeft de resource-id van de door de gebruiker toegewezen identiteit door.

az acr task create \
  --registry myregistry \
  --name helloworldtask \
  --context /dev/null \
  --file helloworldtask.yaml \
  --assign-identity $resourceID

In de uitvoer van de opdracht ziet u in de identity sectie dat de identiteit van het type UserAssigned is ingesteld in de taak:

[...]
"identity": {
    "principalId": null,
    "tenantId": null,
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/xxxxxxxx-d12e-4760-9ab6-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRTasksId": {
        "clientId": "xxxxxxxx-f17e-4768-bb4e-xxxxxxxxxxxx",
        "principalId": "xxxxxxxx-1335-433d-bb6c-xxxxxxxxxxxx"
      }
[...]

Pull-machtigingen voor identiteiten verlenen aan het basisregister

In deze sectie geeft u de beheerde identiteit machtigingen om op te halen uit het basisregister , mybaseregistry.

Gebruik de opdracht az acr show om de resource-id van het basisregister op te halen en op te slaan in een variabele:

baseregID=$(az acr show --name mybaseregistry --query id --output tsv)

Gebruik de opdracht az role assignment create om de identiteit de acrpull rol toe te wijzen aan het basisregister. Deze rol heeft alleen machtigingen voor het ophalen van installatiekopieën uit het register.

az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role acrpull

Ga verder met Doelregisterreferenties toevoegen aan taak.

Optie 2: Een taak maken met een door het systeem toegewezen identiteit

Met de stappen in deze sectie maakt u een taak en schakelt u een door het systeem toegewezen identiteit in. Als u in plaats daarvan een door de gebruiker toegewezen identiteit wilt inschakelen, raadpleegt u Optie 1: Taak maken met een door de gebruiker toegewezen identiteit.

Taak maken

Maak de taak helloworldtask door de volgende opdracht az acr task create uit te voeren. De taak wordt uitgevoerd zonder broncodecontext en de opdracht verwijst naar het bestand helloworldtask.yaml in de werkmap. De --assign-identity parameter zonder waarde maakt de door het systeem toegewezen identiteit voor de taak mogelijk.

az acr task create \
  --registry myregistry \
  --name helloworldtask \
  --context /dev/null \
  --file helloworldtask.yaml \
  --assign-identity 

In de uitvoer van de opdracht toont de identity sectie een identiteit van het type SystemAssigned dat is ingesteld in de taak. De principalId is de principal-id van de taak-id:

[...]
  "identity": {
    "principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
    "tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
  },
  "location": "eastus",
[...]

Gebruik de opdracht az acr task show om de principalId op te slaan in een variabele, voor gebruik in latere opdrachten. Vervang de naam van uw taak en het register in de volgende opdracht:

principalID=$(az acr task show \
  --name <task_name> --registry <registry_name> \
  --query identity.principalId --output tsv)

Pull-machtigingen voor identiteiten verlenen aan het basisregister

In deze sectie geeft u de beheerde identiteit machtigingen om op te halen uit het basisregister , mybaseregistry.

Gebruik de opdracht az acr show om de resource-id van het basisregister op te halen en op te slaan in een variabele:

baseregID=$(az acr show --name mybaseregistry --query id --output tsv)

Gebruik de opdracht az role assignment create om de identiteit de acrpull rol toe te wijzen aan het basisregister. Deze rol heeft alleen machtigingen voor het ophalen van installatiekopieën uit het register.

az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role acrpull

Doelregisterreferenties toevoegen aan taak

Gebruik nu de opdracht az acr task credential add om de taak te laten verifiëren met het basisregister met behulp van de referenties van de identiteit. Voer de opdracht uit die overeenkomt met het type beheerde identiteit dat u hebt ingeschakeld in de taak. Als u een door de gebruiker toegewezen identiteit hebt ingeschakeld, geeft --use-identity u door met de client-id van de identiteit. Als u een door het systeem toegewezen identiteit hebt ingeschakeld, geeft u door --use-identity [system].

# Add credentials for user-assigned identity to the task
az acr task credential add \
  --name helloworldtask \
  --registry myregistry \
  --login-server mybaseregistry.azurecr.io \
  --use-identity $clientID

# Add credentials for system-assigned identity to the task
az acr task credential add \
  --name helloworldtask \
  --registry myregistry \
  --login-server mybaseregistry.azurecr.io \
  --use-identity [system]

De taak handmatig uitvoeren

Als u wilt controleren of de taak waarin u een beheerde identiteit hebt ingeschakeld, met succes wordt uitgevoerd, activeert u de taak handmatig met de opdracht az acr task run .

az acr task run \
  --name helloworldtask \
  --registry myregistry

Als de taak wordt uitgevoerd, is de uitvoer vergelijkbaar met:

Queued a run with ID: cf10
Waiting for an agent...
2019/06/14 22:47:32 Using acb_vol_dbfbe232-fd76-4ca3-bd4a-687e84cb4ce2 as the home volume
2019/06/14 22:47:39 Creating Docker network: acb_default_network, driver: 'bridge'
2019/06/14 22:47:40 Successfully set up Docker network: acb_default_network
2019/06/14 22:47:40 Setting up Docker configuration...
2019/06/14 22:47:41 Successfully set up Docker configuration
2019/06/14 22:47:41 Logging in to registry: myregistry.azurecr.io
2019/06/14 22:47:42 Successfully logged into myregistry.azurecr.io
2019/06/14 22:47:42 Logging in to registry: mybaseregistry.azurecr.io
2019/06/14 22:47:43 Successfully logged into mybaseregistry.azurecr.io
2019/06/14 22:47:43 Executing step ID: acb_step_0. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:43 Scanning for dependencies...
2019/06/14 22:47:45 Successfully scanned dependencies
2019/06/14 22:47:45 Launching container with name: acb_step_0
Sending build context to Docker daemon   25.6kB
Step 1/6 : ARG REGISTRY_NAME
Step 2/6 : FROM ${REGISTRY_NAME}/baseimages/node:15-alpine
15-alpine: Pulling from baseimages/node
[...]
Successfully built 41b49a112663
Successfully tagged myregistry.azurecr.io/hello-world:cf10
2019/06/14 22:47:56 Successfully executed container: acb_step_0
2019/06/14 22:47:56 Executing step ID: acb_step_1. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:56 Pushing image: myregistry.azurecr.io/hello-world:cf10, attempt 1
The push refers to repository [myregistry.azurecr.io/hello-world]
[...]
2019/06/14 22:48:00 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.517011)
2019/06/14 22:48:00 The following dependencies were found:
2019/06/14 22:48:00
- image:
    registry: myregistry.azurecr.io
    repository: hello-world
    tag: cf10
    digest: sha256:611cf6e3ae3cb99b23fadcd89fa144e18aa1b1c9171ad4a0da4b62b31b4e38d1
  runtime-dependency:
    registry: mybaseregistry.azurecr.io
    repository: baseimages/node
    tag: 15-alpine
    digest: sha256:e8e92cffd464fce3be9a3eefd1b65dc9cbe2484da31c11e813a4effc6105c00f
  git:
    git-head-revision: 0f988779c97fe0bfc7f2f74b88531617f4421643

Run ID: cf10 was successful after 32s

Voer de opdracht az acr repository show-tags uit om te controleren of de installatiekopie is gemaakt en naar myregistry is gepusht:

az acr repository show-tags --name myregistry --repository hello-world --output tsv

Voorbeelduitvoer:

cf10

Volgende stappen