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 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
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
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|
Konfigurasikan AWS CLI profil. | Konfigurasikan profil akun sumber: aws configure --profile source-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
Konfigurasikan profil akun tujuan: aws configure --profile destination-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
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. | 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"
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"
Mengatur Wilayah AWS. Ubah perintah ini untuk Wilayah Anda: export SOURCE_REGION="us-east-1"
export DEST_REGION="us-east-2"
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 |
| Tugas | Deskripsi | Keterampilan 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. | 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
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. | Dapatkan output tumpukan: aws cloudformation describe-stacks \
--stack-name ecr-copy-destination \
--profile destination-account \
--region $DEST_REGION \
--query 'Stacks[0].Outputs' \
--output table
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 |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|
Siapkan kontainer build. | Verifikasi bahwa Docker sedang berjalan: docker --version
docker info
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. | Bangun gambar wadah Lambda: docker build -t ecr-copy-lambda . --no-cache
Verifikasi bahwa gambar telah dibuat: docker images ecr-copy-lambda
(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. | Buat repositori Amazon ECR di akun sumber: aws ecr create-repository \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
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
Tandai gambar untuk Amazon ECR: docker tag ecr-copy-lambda:latest \
$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
Unggah gambar ke Amazon ECR: docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
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. | Daftar gambar di repositori: aws ecr list-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
Dapatkan detail gambar: aws ecr describe-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
| Insinyur data, insinyur ML, DevOps insinyur |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|
Siapkan parameter penerapan. | Mengatur email notifikasi: export NOTIFICATION_EMAIL="your-email@company.com"
Tentukan repositori yang akan disalin (dipisahkan koma): export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
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. | 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
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. | Dapatkan output tumpukan: aws cloudformation describe-stacks \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION \
--query 'Stacks[0].Outputs' \
--output table
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. | Periksa email Anda untuk konfirmasi langganan SNS Anda. Pilih tautan konfirmasi di email. 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 |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|
Jalankan dan pantau proses penyalinan. | Masuk ke Konsol Manajemen AWS, dan buka konsol Step Functions. Temukan mesin negara. Pilih Mulai Eksekusi. Setelah selesai, hasil ditampilkan pada tab input dan output Eksekusi. (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. | Hasilkan nama unik: export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
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. | 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
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. | Buat daftar repositori di akun tujuan: aws ecr describe-repositories \
--profile destination-account \
--region $DEST_REGION \
--query 'repositories[].repositoryName' \
--output table
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
| Isu | Solusi |
|---|
Fungsi langkah gagal dijalankan. | 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
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
|