Registrierungsübergreifende Authentifizierung in einer ACR-Aufgabe unter Verwendung einer in Azure verwalteten Identität
In einer ACR-Aufgabe können Sie eine verwaltete Identität für Azure-Ressourcen aktivieren. In der Aufgabe kann die Identität für den Zugriff auf weitere Azure-Ressourcen verwendet werden, ohne dass Anmeldeinformationen angegeben oder verwaltet werden müssen.
In diesem Artikel erfahren Sie, wie Sie eine verwaltete Identität in einer Aufgabe aktivieren, um ein Image aus einer Registrierung zu pullen, bei der es sich nicht um die Registrierung handelt, die zum Ausführen der Aufgabe verwendet wird.
Um die in diesem Artikel verwendeten Azure-Ressourcen zu erstellen, müssen Sie mindestens Version 2.0.68 der Azure-Befehlszeilenschnittstelle (Azure CLI) ausführen. Führen Sie az --version
aus, um die Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sie bei Bedarf unter Installieren der Azure CLI.
Übersicht über das Szenario
Die Beispielaufgabe pullt ein Basisimage aus einer anderen Azure-Containerregistrierung, um ein Anwendungsimage zu erstellen und zu pushen. Zum Pullen des Basisimages konfigurieren Sie die Aufgabe mit einer verwalteten Identität und weisen ihr entsprechende Berechtigungen zu.
In diesem Beispiel werden die Schritte unter Verwendung einer benutzerseitig zugewiesenen oder einer systemseitig zugewiesenen verwalteten Identität beschrieben. Die Wahl der Identität hängt von den Anforderungen Ihrer Organisation ab.
In der Praxis verfügt eine Organisation unter Umständen über eine Reihe von Basisimages, die von allen Entwicklungsteams für die Anwendungserstellung verwendet werden. Diese Basisimages werden in einer Unternehmensregistrierung gespeichert, und die einzelnen Entwicklungsteams verfügen jeweils nur über Pullberechtigungen.
Voraussetzungen
Für diesen Artikel benötigen Sie zwei Azure-Containerregistrierungen:
- Sie verwenden die erste Registrierung zum Erstellen und Ausführen von ACR-Aufgaben. In diesem Artikel heißt diese Registrierung myregistry.
- Die zweite Registrierung hostet ein Basisimage, das für die Aufgabe verwendet wird, um ein Image zu erstellen. In diesem Artikel heißt die zweite Registrierung mybaseregistry.
Ersetzen Sie in den weiteren Schritten diese Namen durch Ihre eigenen Registrierungsnamen.
Wenn Sie nicht bereits die erforderlichen Azure-Containerregistrierungen haben, siehe Schnellstart: Erstellen einer privaten Containerregistrierung mit der Azure CLI. Sie müssen noch keine Images in die Registrierung pushen.
Vorbereiten der Basisregistrierung
Führen Sie zu Demonstrationszwecken einmalig [az acr import][az-acr-import] aus, um ein öffentliches Node.js-Image von Docker Hub in Ihre Basisregistrierung zu importieren. In der Praxis können Images in der Basisregistrierung von einem anderen Team oder Prozess in der Organisation verwaltet werden.
az acr import --name mybaseregistry \
--source docker.io/library/node:15-alpine \
--image baseimages/node:15-alpine
Definieren von Aufgabenschritten in einer YAML-Datei
Die Schritte für diese exemplarische Aufgabe mit mehreren Schritten werden in einer YAML-Datei definiert. Erstellen Sie in Ihrem lokalen Arbeitsverzeichnis eine Datei namens helloworldtask.yaml
, und fügen Sie Folgendes ein. Aktualisieren Sie im Buildschritt den Wert von REGISTRY_NAME
mit dem Servernamen Ihrer Basisregistrierung.
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"]
Im Buildschritt wird die Datei Dockerfile-app
im Repository Azure-Samples/acr-build-helloworld-node verwendet, um ein Image zu erstellen. --build-arg
verweist auf die Basisregistrierung, aus der das Basisimage gepullt werden soll. Nach erfolgreicher Erstellung wird das Image an die Registrierung gepusht, die zum Ausführen der Aufgabe verwendet wird.
Option 1: Erstellen einer Aufgabe mit benutzerseitig zugewiesener Identität
Mit den Schritten in diesem Abschnitt wird eine Aufgabe erstellt und eine benutzerseitig zugewiesene Identität aktiviert. Wenn Sie stattdessen eine systemseitig zugewiesene Identität aktivieren möchten, navigieren Sie zu Option 2: Erstellen einer Aufgabe mit systemseitig zugewiesener Identität.
Erstellen einer benutzerseitig zugewiesenen Identität
Erstellen Sie mithilfe des Befehls az identity create eine Identität namens myACRTasksId in Ihrem Abonnement. Sie können entweder dieselbe Ressourcengruppe verwenden, die Sie zuvor zum Erstellen einer Containerregistrierung verwendet haben, oder Sie verwenden eine andere Ressourcengruppe.
az identity create \
--resource-group myResourceGroup \
--name myACRTasksId
Um die dem Benutzer zugewiesene Identität in den folgenden Schritten zu konfigurieren, verwenden Sie den Befehl az identity show, um die Ressourcen-ID, die Prinzipal-ID und die Client-ID der Identität in Variablen zu speichern.
# 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)
Erstellen der Aufgabe
Führen Sie den folgenden Befehl vom Typ az acr task create aus, um die Aufgabe helloworldtask zu erstellen. Die Aufgabe läuft ohne Quellcode-Kontext, und der Befehl verweist auf die Datei helloworldtask.yaml
im Arbeitsverzeichnis. Der Parameter --assign-identity
übergibt die Ressourcen-ID der benutzerseitig zugewiesenen Identität.
az acr task create \
--registry myregistry \
--name helloworldtask \
--context /dev/null \
--file helloworldtask.yaml \
--assign-identity $resourceID
In der Befehlsausgabe zeigt der Abschnitt identity
an, dass die Identität vom Typ UserAssigned
in der Aufgabe festgelegt ist:
[...]
"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"
}
[...]
Erteilen von Basisregistrierungs-Pullberechtigungen für die Identität
In diesem Abschnitt werden der verwalteten Identität Berechtigungen zum Pullen von Images aus der Basisregistrierung mybaseregistry erteilt.
Verwenden Sie den Befehl az acr show, um die Ressourcen-ID der Basisregistrierung abzurufen und in einer Variablen zu speichern:
baseregID=$(az acr show --name mybaseregistry --query id --output tsv)
Verwenden Sie den Befehl az role assignment create, um der Identität die Rolle acrpull
für die Basisregistrierung zuzuweisen. Diese Rolle ist nur zum Pullen von Images aus der Registrierung berechtigt.
az role assignment create \
--assignee $principalID \
--scope $baseregID \
--role acrpull
Fahren Sie fort mit Hinzufügen von Zielregistrierungs-Anmeldeinformationen zur Aufgabe.
Option 2: Erstellen einer Aufgabe mit systemseitig zugewiesener Identität
Mit den Schritten in diesem Abschnitt wird eine Aufgabe erstellt und eine systemseitig zugewiesene Identität aktiviert. Wenn Sie stattdessen eine benutzerseitig zugewiesene Identität aktivieren möchten, navigieren Sie zu Option 1: Erstellen einer Aufgabe mit benutzerseitig zugewiesener Identität.
Erstellen der Aufgabe
Führen Sie den folgenden Befehl vom Typ az acr task create aus, um die Aufgabe helloworldtask zu erstellen. Die Aufgabe läuft ohne Quellcode-Kontext, und der Befehl verweist auf die Datei helloworldtask.yaml
im Arbeitsverzeichnis. Der Parameter --assign-identity
ohne Wert aktiviert die systemseitig zugewiesene verwaltete Identität für die Aufgabe.
az acr task create \
--registry myregistry \
--name helloworldtask \
--context /dev/null \
--file helloworldtask.yaml \
--assign-identity
In der Befehlsausgabe zeigt der Abschnitt identity
an, dass eine Identität vom Typ SystemAssigned
in der Aufgabe festgelegt ist. Die principalId
ist die Prinzipal-ID der Aufgabenidentität:
[...]
"identity": {
"principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
"tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"location": "eastus",
[...]
Verwenden Sie den Befehl az acr task show, um die PrinzipalId in einer Variablen zu speichern und in späteren Befehlen zu verwenden. Ersetzen Sie im folgenden Befehl den Namen Ihres Tasks und Ihrer Registrierung:
principalID=$(az acr task show \
--name <task_name> --registry <registry_name> \
--query identity.principalId --output tsv)
Erteilen von Basisregistrierungs-Pullberechtigungen für die Identität
In diesem Abschnitt werden der verwalteten Identität Berechtigungen zum Pullen von Images aus der Basisregistrierung mybaseregistry erteilt.
Verwenden Sie den Befehl az acr show, um die Ressourcen-ID der Basisregistrierung abzurufen und in einer Variablen zu speichern:
baseregID=$(az acr show --name mybaseregistry --query id --output tsv)
Verwenden Sie den Befehl az role assignment create, um der Identität die Rolle acrpull
für die Basisregistrierung zuzuweisen. Diese Rolle ist nur zum Pullen von Images aus der Registrierung berechtigt.
az role assignment create \
--assignee $principalID \
--scope $baseregID \
--role acrpull
Hinzufügen von Zielregistrierungs-Anmeldeinformationen zur Aufgabe
Verwenden Sie nun den Befehl az acr task credential add, um der Aufgabe zu ermöglichen, sich mithilfe der Anmeldeinformationen der Identität bei der Basisregistrierung zu authentifizieren. Führen Sie den passenden Befehl für die Art der verwalteten Identität aus, die Sie in der Aufgabe aktiviert haben. Wenn Sie eine benutzerseitig zugewiesene Identität aktiviert haben, übergeben Sie --use-identity
mit der Client-ID der Identität. Wenn Sie eine systemseitig zugewiesene Identität aktiviert haben, übergeben Sie --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]
Manuelles Ausführen der Aufgabe
Um zu überprüfen, ob die Aufgabe, in der Sie eine verwaltete Identität aktiviert haben, erfolgreich ausgeführt wird, führen Sie die Aufgabe manuell mit dem Befehl az acr task run aus.
az acr task run \
--name helloworldtask \
--registry myregistry
Bei erfolgreicher Ausführung sieht die Ausgabe in etwa wie folgt aus:
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
Führen Sie den Befehl az acr repository show-tags aus, um sich zu vergewissern, dass das erstellte Image erfolgreich an myregistry gepusht wurde:
az acr repository show-tags --name myregistry --repository hello-world --output tsv
Beispielausgabe:
cf10