Bagikan melalui


Autentikasi lintas-registri dalam tugas ACR menggunakan identitas yang dikelola Azure

Dalam tugas ACR,Anda dapat mengaktifkan identitas terkelola untuk sumber daya Azure. Tugas dapat menggunakan identitas untuk mengakses sumber daya Azure lainnya, tanpa perlu menyediakan atau mengelola kredensial.

Di artikel ini, Anda mempelajari cara mengaktifkan identitas terkelola dalam tugas untuk menarik citra dari registri yang berbeda dari yang digunakan untuk menjalankan tugas.

Untuk membuat sumber daya Azure, artikel ini mengharuskan Anda menjalankan Azure CLI versi 2.0.68 atau yang lebih baru. Jalankan az --version untuk menemukan versinya. Jika Anda perlu menginstal atau memutakhirkan, lihat Menginstal Azure CLI.

Ringkasan skenario

Tugas contoh menarik citra dasar dari registri wadah Azure lain untuk membangun dan mendorong citra aplikasi. Untuk menarik citra dasar, Anda mengonfigurasi tugas dengan identitas terkelola dan menetapkan izin yang sesuai untuk itu.

Contoh ini menunjukkan langkah-langkah menggunakan identitas terkelola yang ditetapkan pengguna atau yang ditetapkan sistem. Pilihan identitas Anda tergantung pada kebutuhan organisasi Anda.

Dalam skenario dunia nyata, sebuah organisasi mungkin mempertahankan satu set citra dasar yang digunakan oleh semua tim pengembangan untuk membangun aplikasi mereka. Citra dasar ini disimpan dalam registri perusahaan, dengan setiap tim pengembangan hanya memiliki hak tarik.

Prasyarat

Untuk artikel ini, Anda memerlukan dua pendaftar kontainer Azure:

  • Anda menggunakan registri pertama untuk membuat dan menjalankan tugas ACR. Dalam artikel ini, registri ini bernama myregistry.
  • Registri kedua menghosting citra dasar yang digunakan untuk tugas membangun citra. Dalam artikel ini, registri kedua bernama mybaseregistry.

Ganti dengan nama registri Anda sendiri di langkah selanjutnya.

Jika Anda belum memiliki pendaftar kontainer Azure yang diperlukan, lihat Mulai cepat: Membuat pendaftar kontainer pribadi menggunakan Azure CLI. Anda belum perlu memasukkan citra ke registri.

Siapkan registri dasar

Untuk tujuan demonstrasi, sebagai pengoperasian satu kali, jalankan [az acr import][az-acr-import] untuk mengimpor citra Node.js publik dari Docker Hub ke registri dasar Anda. Dalam praktiknya, tim atau proses lain dalam organisasi mungkin memelihara citra di registri dasar.

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

Tentukan langkah-langkah tugas dalam file YAML

Langkah-langkah untuk contoh tugas multi-langkah ini ditentukan dalam file YAML. Buat file bernama helloworldtask.yaml di direktori kerja lokal Anda dan tempelkan konten berikut. Perbarui nilai REGISTRY_NAME pada langkah pembuatan dengan nama server registri dasar Anda.

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

Langkah pembuatan menggunakan file Dockerfile-app di repo Azure-Samples/acr-build-helloworld-node untuk membuat citra. --build-arg mereferensikan registri dasar untuk menarik citra dasar. Ketika berhasil dibangun, citra didorong ke registri yang digunakan untuk menjalankan tugas.

Opsi 1: Buat tugas dengan identitas yang ditetapkan pengguna

Langkah-langkah di bagian ini membuat tugas dan mengaktifkan identitas yang ditetapkan pengguna. Jika Anda ingin mengaktifkan identitas yang ditetapkan sistem, lihat Opsi 2: Membuat tugas dengan identitas yang ditetapkan sistem.

Membuat identitas terkelola yang ditetapkan pengguna

Buat identitas di langganan Anda bernama myACRTasksId menggunakan perintah buat identitas az. Anda dapat menggunakan grup sumber daya yang sama dengan yang Anda gunakan sebelumnya untuk membuat registri kontainer atau yang berbeda.

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

Untuk mengonfigurasi identitas yang ditetapkan pengguna dalam langkah-langkah berikut, gunakan perintah az identity show untuk menyimpan ID sumber daya, ID utama, dan ID klien identitas dalam variabel.

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

Buat tugas

Sekarang, buat tugas helloworldtask dengan menjalankan perintah az acr task create berikut. Tugas berjalan tanpa konteks kode sumber, dan perintah merujuk file helloworldtask.yaml di direktori kerja. Parameter --assign-identity melewati ID sumber daya identitas yang ditetapkan pengguna.

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

Pada output perintah, bagian identity menunjukkan identitas jenis UserAssigned yang diatur dalam tugas:

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

Berikan izin tarik identitas ke registri dasar

Di bagian ini, berikan izin identitas terkelola untuk menarik dari registri dasar, mybaseregistry.

Gunakan perintah az acr show untuk mendapatkan ID sumber daya dari registri dasar dan menyimpannya dalam variabel:

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

Gunakan perintah az role assignment create untuk menetapkan identitas peran acrpull ke registri dasar. Peran ini memiliki izin hanya untuk menarik citra dari registri.

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

Lanjutkan ke Tambahkan kredensial registri target ke tugas.

Opsi 2: Buat tugas dengan identitas yang ditetapkan sistem

Langkah-langkah di bagian ini membuat tugas dan mengaktifkan identitas yang ditetapkan sistem. Jika Anda ingin mengaktifkan identitas yang ditetapkan pengguna, lihat Opsi 1: Membuat tugas dengan identitas yang ditetapkan pengguna.

Buat tugas

Sekarang, buat tugas helloworldtask dengan menjalankan perintah az acr task create berikut. Tugas berjalan tanpa konteks kode sumber, dan perintah merujuk file helloworldtask.yaml di direktori kerja. Parameter --assign-identity tanpa nilai mengaktifkan identitas yang ditetapkan sistem pada tugas.

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

Pada output perintah, bagian identity menunjukkan identitas jenis SystemAssigned yang diatur dalam tugas. principalId adalah ID utama dari identitas tugas:

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

Menggunakan perintah az acr task show untuk menyimpan Id utama dalam sebuah variabel, untuk digunakan dalam perintah selanjutnya. Mengganti nama tugas Anda dan registri Anda dengan perintah berikut:

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

Berikan izin tarik identitas ke registri dasar

Di bagian ini, berikan izin identitas terkelola untuk menarik dari registri dasar, mybaseregistry.

Gunakan perintah az acr show untuk mendapatkan ID sumber daya dari registri dasar dan menyimpannya dalam variabel:

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

Gunakan perintah az role assignment create untuk menetapkan identitas peran acrpull ke registri dasar. Peran ini memiliki izin hanya untuk menarik citra dari registri.

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

Tambahkan kredensial registri target ke tugas

Sekarang gunakan perintah az acr task credential add untuk mengaktifkan tugas mengautentikasi dengan registri dasar menggunakan kredensial identitas. Jalankan perintah yang sesuai dengan jenis identitas terkelola yang Anda aktifkan di tugas. Jika Anda mengaktifkan identitas yang ditetapkan pengguna, berikan --use-identity dengan ID klien dari identitas tersebut. Jika Anda mengaktifkan identitas yang ditetapkan sistem, teruskan --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]

Menjalankan tugas secara manual

Untuk memverifikasi bahwa tugas yang Anda gunakan untuk mengaktifkan identitas terkelola berhasil, picu tugas secara manual dengan perintah az acr task run.

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

Jika tugas berjalan dengan sukses, outputnya mirip dengan:

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

Jalankan perintah az acr repository show-tags untuk memverifikasi bahwa citra dibuat dan berhasil didorong ke myregistry:

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

Contoh output:

cf10

Langkah berikutnya