View a markdown version of this page

Salin gambar wadah Amazon ECR di seluruh Akun AWS dan Wilayah AWS - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Salin gambar wadah Amazon ECR di seluruh Akun AWS dan Wilayah AWS

Faisal Shahdad, Amazon Web Services

Ringkasan

Pola ini menunjukkan kepada Anda cara menggunakan pendekatan tanpa server untuk mereplikasi gambar yang ditandai dari repositori Amazon Elastic Container Registry (Amazon ECR) yang ada ke repositori lain dan. Akun AWS Wilayah AWS Solusinya digunakan AWS Step Functions untuk mengelola alur kerja replikasi dan AWS Lambda fungsi untuk menyalin gambar kontainer besar.

Amazon ECR menggunakan fitur replikasi lintas wilayah dan lintas akun asli yang mereplikasi gambar kontainer di seluruh Wilayah dan akun. Tetapi fitur-fitur ini mereplikasi gambar hanya dari saat replikasi dihidupkan. Tidak ada mekanisme untuk mereplikasi gambar yang ada di Wilayah dan akun yang berbeda.

Pola ini membantu tim kecerdasan buatan (AI) mendistribusikan model pembelajaran mesin kontainerisasi (ML), kerangka kerja (misalnya, PyTorch, dan Hugging Face) TensorFlow, dan dependensi ke akun dan Wilayah lain. Ini dapat membantu Anda mengatasi batas layanan dan mengoptimalkan sumber daya komputasi GPU. Anda juga dapat secara selektif mereplikasi repositori Amazon ECR dari akun sumber dan Wilayah tertentu. Untuk informasi selengkapnya, lihat Replikasi Lintas Wilayah di Amazon ECR telah mendarat.

Prasyarat dan batasan

Prasyarat

  • Dua atau lebih aktif Akun AWS (satu akun sumber dan satu akun tujuan, minimal)

  • Izin yang sesuai AWS Identity and Access Management (IAM) di semua akun

  • Docker untuk membangun gambar wadah Lambda

  • AWS Command Line Interface (AWS CLI) dikonfigurasi untuk semua akun

Batasan

  • Pengecualian gambar yang tidak ditandai - Solusinya hanya menyalin gambar kontainer yang memiliki tag eksplisit. Ini melewatkan gambar yang tidak ditandai yang ada dengan intisari. SHA256

  • Batasan batas waktu eksekusi Lambda — AWS Lambda dibatasi hingga batas waktu eksekusi maksimum 15 menit, yang mungkin tidak cukup untuk menyalin gambar atau repositori kontainer besar.

  • Manajemen gambar kontainer manual - Kode crane-app.py Python memerlukan pembangunan kembali dan penempatan kembali gambar kontainer Lambda.

  • Kapasitas pemrosesan paralel terbatas - Pengaturan MaxConcurrency status membatasi berapa banyak repositori yang dapat Anda salin pada saat yang bersamaan. Namun, Anda dapat mengubah pengaturan ini di AWS CloudFormation template akun sumber. Perhatikan bahwa nilai konkurensi yang lebih tinggi dapat menyebabkan Anda melebihi batas tingkat layanan dan kuota eksekusi Lambda tingkat akun.

Arsitektur

Target tumpukan

Pola ini memiliki empat komponen utama:

  • Infrastruktur akun sumber — CloudFormation template yang membuat komponen orkestrasi

  • Infrastruktur akun tujuan - CloudFormation templat yang membuat peran akses lintas akun

  • Fungsi Lambda - Fungsi berbasis Python yang menggunakan Crane untuk penyalinan gambar yang efisien

  • Gambar kontainer - Wadah Docker yang mengemas fungsi Lambda dengan alat yang diperlukan

Arsitektur target

Alur kerja Step Functions

Mesin status Step Functions mengatur hal berikut, seperti yang ditunjukkan pada diagram berikut:

  • PopulateRepositoryList Memindai repositori Amazon ECR dan mengisi Amazon DynamoDB

  • GetRepositoryList- Mengambil daftar repositori unik dari DynamoDB

  • DeduplicateRepositories Memastikan bahwa tidak ada pemrosesan duplikat

  • CopyRepositories Menangani penyalinan paralel repositori

  • NotifySuccess/NotifyFailure Pemberitahuan Amazon Simple Notification Service (Amazon SNS) berdasarkan hasil eksekusi

Alat

Alat Amazon

  • Amazon CloudWatch membantu Anda memantau metrik sumber AWS daya Anda dan aplikasi yang Anda jalankan AWS secara real time.

  • Amazon DynamoDB adalah layanan database NoSQL yang dikelola sepenuhnya yang menyediakan kinerja yang cepat, dapat diprediksi, dan terukur.

  • Amazon Simple Notification Service (Amazon SNS) membantu Anda mengoordinasikan dan mengelola pertukaran pesan antara penayang dan klien, termasuk server web dan alamat email.

  • AWS Identity and Access Management (IAM) membantu Anda mengelola akses ke AWS sumber daya dengan aman dengan mengontrol siapa yang diautentikasi dan diberi wewenang untuk menggunakannya.

  • AWS Lambdaadalah layanan komputasi yang membantu Anda menjalankan kode tanpa perlu menyediakan atau mengelola server. Ini menjalankan kode Anda hanya bila diperlukan dan skala secara otomatis, jadi Anda hanya membayar untuk waktu komputasi yang Anda gunakan.

  • AWS Step Functionsadalah layanan orkestrasi tanpa server yang membantu Anda menggabungkan fungsi Lambda dan lainnya untuk membangun aplikasi bisnis yang penting. Layanan AWS

Alat-alat lainnya

  • Crane adalah alat orkestrasi Docker. Ini mirip dengan Docker Compose tetapi memiliki fitur tambahan.

  • Docker adalah seperangkat produk platform as a service (PaaS) yang menggunakan virtualisasi di tingkat sistem operasi untuk mengirimkan perangkat lunak dalam wadah.

Repositori kode

  • Kode untuk pola ini tersedia di GitHub sample-ecr-copy repositori. Anda dapat menggunakan CloudFormation template dari repositori untuk membuat sumber daya yang mendasarinya.

Praktik terbaik

Ikuti prinsip hak istimewa terkecil dan berikan izin minimum yang diperlukan untuk melakukan tugas. Untuk informasi selengkapnya, lihat Berikan hak istimewa terkecil dan praktik terbaik Keamanan dalam dokumentasi IAM.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Konfigurasikan AWS CLI profil.

  1. Konfigurasikan profil akun sumber:

    aws configure --profile source-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  2. Konfigurasikan profil akun tujuan:

    aws configure --profile destination-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  3. Verifikasi konfigurasi:

    aws sts get-caller-identity --profile source-account aws sts get-caller-identity --profile destination-account
DevOps insinyur, insinyur data, insinyur ML

Kumpulkan informasi yang diperlukan.

  1. Dapatkan ID akun sumber:

    export SOURCE_ACCOUNT_ID=$(aws sts get-caller-identity --profile source-account --query Account --output text) echo "Source Account ID: $SOURCE_ACCOUNT_ID"
  2. Dapatkan ID akun tujuan:

    export DEST_ACCOUNT_ID=$(aws sts get-caller-identity --profile destination-account --query Account --output text) echo "Destination Account ID: $DEST_ACCOUNT_ID"
  3. Mengatur Wilayah AWS. Ubah perintah ini untuk Wilayah Anda:

    export SOURCE_REGION="us-east-1" export DEST_REGION="us-east-2"
  4. Buat daftar repositori Amazon ECR yang ada di akun sumber:

    aws ecr describe-repositories --profile source-account --region $SOURCE_REGION --query 'repositories[].repositoryName' --output table
DevOps insinyur, insinyur data, insinyur ML

Kloning repositori.

Kloning repositori pola ke workstation lokal Anda:

git clone https://github.com/aws-samples/sample-ecr-copy
DevOps insinyur, insinyur data, insinyur ML
TugasDeskripsiKeterampilan yang dibutuhkan

Validasi template.

Validasi CloudFormation template:

aws cloudformation validate-template \ --template-body file://"Destination Account cf_template.yml" \ --profile destination-account
DevOps insinyur, insinyur ML, Insinyur data

Menyebarkan infrastruktur tujuan.

  1. Terapkan tumpukan akun tujuan:

    aws cloudformation deploy \ --template-file "Destination Account cf_template.yml" \ --stack-name ecr-copy-destination \ --parameter-overrides \ SourceAccountId=$SOURCE_ACCOUNT_ID \ SourceRoleName=ECRContainerLambdaRole \ --capabilities CAPABILITY_NAMED_IAM \ --profile destination-account \ --region $DEST_REGION
  2. Tunggu hingga tumpukan selesai:

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION
Insinyur data, insinyur ML, DevOps insinyur

Verifikasi penyebaran.

  1. Dapatkan output tumpukan:

    aws cloudformation describe-stacks \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. Simpan peran IAM lintas akun:

    export CROSS_ACCOUNT_ROLE_ARN=$(aws cloudformation describe-stacks \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION \ --query 'Stacks[0].Outputs[?OutputKey==`CrossAccountRoleArn`].OutputValue' \ --output text) echo "Cross-Account Role ARN: $CROSS_ACCOUNT_ROLE_ARN"
DevOps insinyur, insinyur ML, Insinyur data
TugasDeskripsiKeterampilan yang dibutuhkan

Siapkan kontainer build.

  1. Verifikasi bahwa Docker sedang berjalan:

    docker --version docker info
  2. Pastikan itu crane-app.py dan Dockerfile berada di direktori saat ini:

    ls -la crane-app.py Dockerfile
Insinyur data, insinyur ML, DevOps insinyur

Bangun gambar kontainer.

  1. Bangun gambar wadah Lambda:

    docker build -t ecr-copy-lambda . --no-cache
  2. Verifikasi bahwa gambar telah dibuat:

    docker images ecr-copy-lambda
  3. (Opsional) Uji wadah secara lokal:

    docker run --rm --entrypoint python ecr-copy-lambda -c "import boto3; print('Container working')"
Insinyur data, insinyur ML, DevOps insinyur

Buat repositori dan unggah gambar.

  1. Buat repositori Amazon ECR di akun sumber:

    aws ecr create-repository \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. Dapatkan token login Amazon ECR dan autentikasi Docker:

    aws ecr get-login-password \ --profile source-account \ --region $SOURCE_REGION | \ docker login --username AWS --password-stdin \ $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com
  3. Tandai gambar untuk Amazon ECR:

    docker tag ecr-copy-lambda:latest \ $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  4. Unggah gambar ke Amazon ECR:

    docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  5. Simpan URI gambar untuk digunakan nanti:

    export LAMBDA_IMAGE_URI="$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest" echo "Lambda Image URI: $LAMBDA_IMAGE_URI"
Insinyur data, insinyur ML, DevOps insinyur

Verifikasi gambar.

  1. Daftar gambar di repositori:

    aws ecr list-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. Dapatkan detail gambar:

    aws ecr describe-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
Insinyur data, insinyur ML, DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Siapkan parameter penerapan.

  1. Mengatur email notifikasi:

    export NOTIFICATION_EMAIL="your-email@company.com"
  2. Tentukan repositori yang akan disalin (dipisahkan koma):

    export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
  3. Mengatur lingkungan:

    export ENVIRONMENT="dev" echo "Deployment Parameters:" echo "Source Account: $SOURCE_ACCOUNT_ID" echo "Destination Account: $DEST_ACCOUNT_ID" echo "Source Region: $SOURCE_REGION" echo "Destination Region: $DEST_REGION" echo "Lambda Image: $LAMBDA_IMAGE_URI" echo "Notification Email: $NOTIFICATION_EMAIL" echo "Repositories: $REPOSITORY_LIST"
Insinyur data, DevOps insinyur, insinyur ML

Validasi template sumber.

Validasi CloudFormation template sumber:

aws cloudformation validate-template \ --template-body file://"Source Account Cf template.yml" \ --profile source-account
Insinyur data, insinyur ML, DevOps insinyur

Menyebarkan infrastruktur sumber.

  1. Terapkan tumpukan akun sumber:

    aws cloudformation deploy \ --template-file "Source Account Cf template.yml" \ --stack-name ecr-copy-source \ --parameter-overrides \ SourceAccountId=$SOURCE_ACCOUNT_ID \ DestinationAccountId=$DEST_ACCOUNT_ID \ DestinationRegion=$DEST_REGION \ SourceRegion=$SOURCE_REGION \ NotificationEmail=$NOTIFICATION_EMAIL \ RepositoryList="$REPOSITORY_LIST" \ LambdaImageUri=$LAMBDA_IMAGE_URI \ Environment=$ENVIRONMENT \ --capabilities CAPABILITY_NAMED_IAM \ --profile source-account \ --region $SOURCE_REGION
  2. Tunggu hingga tumpukan selesai (ini mungkin memakan waktu hingga 10 menit):

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION
Insinyur data, insinyur ML, DevOps insinyur

Verifikasi penerapan dan kumpulkan output.

  1. Dapatkan output tumpukan:

    aws cloudformation describe-stacks \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. Simpan Amazon Resource Names (ARNs) untuk mesin status dan topik SNS:

    export STATE_MACHINE_ARN=$(aws cloudformation describe-stacks \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION \ --query 'Stacks[0].Outputs[?OutputKey==`StateMachineArn`].OutputValue' \ --output text) export SNS_TOPIC_ARN=$(aws cloudformation describe-stacks \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION \ --query 'Stacks[0].Outputs[?OutputKey==`SNSTopicArn`].OutputValue' \ --output text) echo "State Machine ARN: $STATE_MACHINE_ARN" echo "SNS Topic ARN: $SNS_TOPIC_ARN"
DevOps insinyur, insinyur ML, Insinyur data

Konfirmasikan langganan email Anda.

  1. Periksa email Anda untuk konfirmasi langganan SNS Anda.

  2. Pilih tautan konfirmasi di email.

  3. Verifikasi status langganan.

    aws sns list-subscriptions-by-topic \ --topic-arn $SNS_TOPIC_ARN \ --profile source-account \ --region $SOURCE_REGION
Insinyur data, insinyur ML, DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Jalankan dan pantau proses penyalinan.

  1. Masuk ke Konsol Manajemen AWS, dan buka konsol Step Functions.

  2. Temukan mesin negara.

  3. Pilih Mulai Eksekusi.

    Setelah selesai, hasil ditampilkan pada tab input dan output Eksekusi.

  4. (Opsional) Jika Anda ingin terus menjalankan Step Functions dengan menggunakan AWS CLI, ikuti langkah-langkah yang tersisa dalam epik ini.

DevOps insinyur, insinyur ML, Insinyur data

Jalankan fungsi langkah.

  1. Hasilkan nama unik:

    export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
  2. Jalankan fungsi langkah.

    export EXECUTION_ARN=$(aws stepfunctions start-execution \ --state-machine-arn $STATE_MACHINE_ARN \ --name $EXECUTION_NAME \ --profile source-account \ --region $SOURCE_REGION \ --query 'executionArn' \ --output text) echo "Execution started: $EXECUTION_ARN" echo "Execution Name: $EXECUTION_NAME"
DevOps insinyur, insinyur ML, Insinyur data

Pantau kemajuan.

  1. Periksa statusnya:

    aws stepfunctions describe-execution \ --execution-arn $EXECUTION_ARN \ --profile source-account \ --region $SOURCE_REGION \ --query '{Status:status,StartDate:startDate,StopDate:stopDate}' \ --output table
  2. Dapatkan sejarahnya:

    aws stepfunctions get-execution-history \ --execution-arn $EXECUTION_ARN \ --profile source-account \ --region $SOURCE_REGION \ --query 'events[?type==`TaskStateEntered` || type==`TaskSucceeded` || type==`TaskFailed`].{Type:type,Timestamp:timestamp,Details:stateEnteredEventDetails.name}' \ --output table
DevOps insinyur, insinyur ML, Insinyur data

Periksa hasilnya.

Tunggu proses selesai (diperbarui setiap 30 detik):

while true; do STATUS=$(aws stepfunctions describe-execution \ --execution-arn $EXECUTION_ARN \ --profile source-account \ --region $SOURCE_REGION \ --query 'status' \ --output text) echo "Current status: $STATUS" if [[ "$STATUS" == "SUCCEEDED" || "$STATUS" == "FAILED" || "$STATUS" == "TIMED_OUT" || "$STATUS" == "ABORTED" ]]; then break fi sleep 30 done echo "Final execution status: $STATUS"
DevOps insinyur, insinyur ML, Insinyur data

Verifikasi gambar.

  1. Buat daftar repositori di akun tujuan:

    aws ecr describe-repositories \ --profile destination-account \ --region $DEST_REGION \ --query 'repositories[].repositoryName' \ --output table
  2. Periksa gambar repositori:

    for repo in $(echo $REPOSITORY_LIST | tr ',' ' '); do echo "\nImages in repository: $repo" aws ecr list-images \ --repository-name $repo \ --profile destination-account \ --region $DEST_REGION \ --query 'imageIds[].imageTag' \ --output table 2>/dev/null || echo "Repository $repo not found or no images" done
DevOps insinyur, insinyur data, insinyur ML

Pemecahan masalah

IsuSolusi

Fungsi langkah gagal dijalankan.

  1. Untuk mengambil peristiwa kegagalan terperinci dari riwayat, jalankan AWS CLI perintah berikut:

    if [[ "$STATUS" == "FAILED" ]]; then echo "Getting failure details..." aws stepfunctions get-execution-history \ --execution-arn $EXECUTION_ARN \ --profile source-account \ --region $SOURCE_REGION \ --query 'events[?type==`TaskFailed`]' \ --output json fi
  2. Untuk mengambil log untuk fungsi Lambda yang gagal, jalankan perintah berikut AWS CLI :

    # Check Lambda function logs echo "\nLambda function logs:" aws logs describe-log-groups \ --log-group-name-prefix "/aws/lambda/ecr-copy-source" \ --profile source-account \ --region $SOURCE_REGION \ --query 'logGroups[].logGroupName' \ --output table

Sumber daya terkait

Informasi tambahan

Parameter konfigurasi

Parameter

Deskripsi

Contoh

SourceAccountId

Akun AWS ID Sumber

11111111111

DestinationAccountId

Akun AWS ID Tujuan

22222222222

DestinationRegion

Target Wilayah AWS

us-east-2

SourceRegion

Sumber Wilayah AWS

us-east-1

NotificationEmail

Email untuk notifikasi

abc@xyz.com

RepositoryList

Repositori untuk disalin

repo1,repo2,repo3

LambdaImageUri

URI gambar kontainer Lambda

${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/ecr-copy-lambda:latest