Sdílet prostřednictvím


Ověřování mezi registry v úloze ACR pomocí identity spravované Azure

V úloze ACR můžete povolit spravovanou identitu pro prostředky Azure. Úloha může použít identitu pro přístup k jiným prostředkům Azure, aniž by bylo nutné zadávat nebo spravovat přihlašovací údaje.

V tomto článku se dozvíte, jak povolit spravované identitě v úloze načíst image z registru, který se liší od toho, který se používá ke spuštění úlohy.

Pokud chcete vytvořit prostředky Azure, musíte spustit Azure CLI verze 2.0.68 nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.

Přehled scénáře

Ukázková úloha načítá základní image z jiného registru kontejneru Azure, aby se sestavil a odeslal image aplikace. Pokud chcete načíst základní image, nakonfigurujete úlohu se spravovanou identitou a přiřadíte jí příslušná oprávnění.

Tento příklad ukazuje kroky pomocí spravované identity přiřazené uživatelem nebo přiřazenou systémem. Vaše volba identity závisí na potřebách vaší organizace.

Ve skutečném scénáři může organizace udržovat sadu základních imagí používaných všemi vývojovými týmy k vytváření aplikací. Tyto základní image jsou uložené v podnikovém registru, přičemž každý vývojový tým má pouze práva k přijetí změn.

Požadavky

Pro účely tohoto článku potřebujete dva registry kontejnerů Azure:

  • Pomocí prvního registru vytvoříte a spustíte úlohy ACR. V tomto článku se tento registr jmenuje myregistry.
  • Druhý registr hostuje základní image používanou pro úlohu k sestavení image. V tomto článku se druhý registr jmenuje mybaseregistry.

V dalších krocích nahraďte vlastními názvy registru.

Pokud ještě nemáte potřebné registry kontejnerů Azure, projděte si rychlý start: Vytvoření privátního registru kontejneru pomocí Azure CLI. Image do registru ještě nemusíte nasdílovat.

Příprava základního registru

Pro demonstrační účely jako jednorázovou operaci spusťte příkaz [az acr import][az-acr-import] a importujte veřejnou Node.js image z Docker Hubu do základního registru. V praxi může jiný tým nebo proces v organizaci udržovat image v základním registru.

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

Definování kroků úkolů v souboru YAML

Kroky pro tento příklad vícekrokové úlohy jsou definovány v souboru YAML. Vytvořte soubor s názvem helloworldtask.yaml v místním pracovním adresáři a vložte následující obsah. Aktualizujte hodnotu REGISTRY_NAME v kroku sestavení názvem serveru základního registru.

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"]

Krok sestavení používá Dockerfile-app soubor v úložišti Azure-Samples/acr-build-helloworld-node k sestavení image. Odkazuje --build-arg na základní registr a načítá základní image. Po úspěšném sestavení se image odešle do registru použitého ke spuštění úlohy.

Možnost 1: Vytvoření úlohy s identitou přiřazenou uživatelem

Kroky v této části vytvoří úlohu a povolí identitu přiřazenou uživatelem. Pokud chcete místo toho povolit identitu přiřazenou systémem, přečtěte si téma 2: Vytvoření úlohy s identitou přiřazenou systémem.

Vytvoření identity přiřazené uživatelem

Pomocí příkazu az identity create vytvořte ve svém předplatném identitu myACRTasksId. Můžete použít stejnou skupinu prostředků, kterou jste použili dříve k vytvoření registru kontejneru nebo jiné skupiny prostředků.

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

Pokud chcete nakonfigurovat identitu přiřazenou uživatelem v následujících krocích, pomocí příkazu az identity show uložte ID prostředku, ID objektu zabezpečení a ID klienta v proměnných.

# 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)

Vytvořit úkol

Vytvořte úlohu helloworldtask spuštěním následujícího příkazu az acr task create . Úloha se spustí bez kontextu zdrojového kódu a příkaz odkazuje na soubor helloworldtask.yaml v pracovním adresáři. Parametr --assign-identity předá ID prostředku identity přiřazené uživatelem.

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

Ve výstupu příkazu se identity v části zobrazuje identita typu UserAssigned nastavená v úloze:

[...]
"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"
      }
[...]

Udělení oprávnění k vyžádání identity základnímu registru

V této části dejte spravované identitě oprávnění k načtení ze základního registru mybaseregistry.

Pomocí příkazu az acr show získejte ID prostředku základního registru a uložte ho do proměnné:

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

Pomocí příkazu az role assignment create přiřaďte identitu acrpull k základnímu registru. Tato role má oprávnění pouze k načtení imagí z registru.

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

Pokračujte přidáním přihlašovacích údajů cílového registru k úloze.

Možnost 2: Vytvoření úlohy s identitou přiřazenou systémem

Kroky v této části vytvoří úlohu a povolí identitu přiřazenou systémem. Pokud chcete místo toho povolit identitu přiřazenou uživatelem, přečtěte si téma 1: Vytvoření úlohy s identitou přiřazenou uživatelem.

Vytvořit úkol

Vytvořte úlohu helloworldtask spuštěním následujícího příkazu az acr task create . Úloha se spustí bez kontextu zdrojového kódu a příkaz odkazuje na soubor helloworldtask.yaml v pracovním adresáři. Parametr --assign-identity bez hodnoty povoluje identitu přiřazenou systémem pro úlohu.

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

Ve výstupu příkazu se identity v části zobrazuje identita typu SystemAssigned nastavená v úloze. Je principalId ID objektu zabezpečení identity úlohy:

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

Pomocí příkazu az acr task show uložte hodnotu principalId do proměnné, abyste ji mohli použít v pozdějších příkazech. Název úlohy a registru nahraďte následujícím příkazem:

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

Udělení oprávnění k vyžádání identity základnímu registru

V této části dejte spravované identitě oprávnění k načtení ze základního registru mybaseregistry.

Pomocí příkazu az acr show získejte ID prostředku základního registru a uložte ho do proměnné:

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

Pomocí příkazu az role assignment create přiřaďte identitu acrpull k základnímu registru. Tato role má oprávnění pouze k načtení imagí z registru.

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

Přidání přihlašovacích údajů cílového registru k úloze

Teď pomocí příkazu az acr task credential add povolte úlohu k ověření v základním registru pomocí přihlašovacích údajů identity. Spusťte příkaz odpovídající typu spravované identity, kterou jste povolili v úloze. Pokud jste povolili identitu přiřazenou uživatelem, předejte --use-identity ID klienta identity. Pokud jste povolili identitu přiřazenou systémem, předejte --use-identity [system]ji .

# 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]

Ruční spuštění úlohy

Pokud chcete ověřit úspěšné spuštění úlohy, ve které jste povolili spravovanou identitu, spusťte úlohu ručně pomocí příkazu az acr task run .

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

Pokud se úloha úspěšně spustí, bude výstup podobný následujícímu:

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

Spuštěním příkazu az acr repository show-tags ověřte, že se image vytvořila a úspěšně se odeslala do myregistry:

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

Příklad výstupu:

cf10

Další kroky