翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS アカウント と 間で Amazon ECR コンテナイメージをコピーする AWS リージョン
Faisal Shahdad (Amazon Web Services)
概要
このパターンは、サーバーレスアプローチを使用して、タグ付けされたイメージを既存の Amazon Elastic Container Registry (Amazon ECR) リポジトリから他の AWS アカウント および にレプリケートする方法を示しています AWS リージョン。このソリューションでは、 AWS Step Functions を使用してレプリケーションワークフローを管理し、 AWS Lambda 関数を使用して大きなコンテナイメージをコピーします。
Amazon ECR は、リージョンとアカウント間でコンテナイメージをレプリケートする、ネイティブのクロスリージョンおよびクロスアカウントレプリケーション機能を使用します。ただし、これらの機能は、レプリケーションを有効化した時点以降のイメージのみをレプリケートします。異なるリージョンやアカウントに既存のイメージをレプリケートするメカニズムはありません。
このパターンは、人工知能 (AI) チームがコンテナ化された機械学習 (ML) モデル、フレームワーク (PyTorch、TensorFlow、Hugging Face など)、依存関係を他のアカウントやリージョンに配布するのに役立ちます。これにより、サービスの制限を克服し、GPU コンピューティングリソースを最適化できます。特定のレプリケート元アカウントとリージョンから、Amazon ECR リポジトリを選択的にレプリケートすることもできます。詳細については、「Cross-Region replication in Amazon ECR has landed」を参照してください。
前提条件と制限
前提条件
2 つ以上のアクティブ AWS アカウント (少なくとも 1 つのソースアカウントと 1 つの送信先アカウント)
すべてのアカウントの適切な AWS Identity and Access Management (IAM) アクセス許可
Lambda コンテナイメージを構築するための Docker
AWS Command Line Interface すべてのアカウントに設定された (AWS CLI)
制限事項
タグのないイメージの除外 – このソリューションでは、明示的なタグを持つコンテナイメージのみがコピーされます。SHA256 ダイジェストを持つが、タグのないイメージはスキップされます。
Lambda 実行タイムアウト制約 – AWS Lambda 最大 15 分の実行タイムアウトに制限されており、大きなコンテナイメージやリポジトリをコピーするには不十分である可能性があります。
コンテナイメージの手動管理 – crane-app.py Python コードでは、Lambda コンテナイメージを再構築および再デプロイする必要があります。
並列処理容量の制限 – MaxConcurrency 状態設定は、同時にコピーできるリポジトリの数を制限します。ただし、この設定はソースアカウントの AWS CloudFormation テンプレートで変更できます。同時実行値を大きくすると、サービスレート制限、およびアカウントレベルの Lambda 実行クォータが超過する可能性があることに注意してください。
アーキテクチャ
ターゲットスタック
このパターンには、次の 4 つの主要コンポーネントがあります。
レプリケート元アカウントのインフラストラクチャ – オーケストレーションコンポーネントを作成する CloudFormation テンプレート
レプリケート先アカウントインフラストラクチャ – クロスアカウントアクセスロールを作成する CloudFormation テンプレート
Lambda 関数 – Python ベースの関数であり、Crane を使用してイメージを効率的にコピー
コンテナイメージ – 必要なツールとともに Lambda 関数をパッケージ化する Docker コンテナ
ターゲットアーキテクチャ
Step Function ワークフロー
次の図に示すように、Step Functions ステートマシンは以下をオーケストレーションします。
PopulateRepositoryList – Amazon ECR リポジトリをスキャンし、Amazon DynamoDB に入力
GetRepositoryList – DynamoDB から一意のリポジトリリストを取得
DeduplicateRepositories – 重複して実施される処理がないことを確認
CopyRepositories – リポジトリの並列コピーを処理
NotifySuccess/NotifyFailure – 実行結果に基づく Amazon Simple Notification Service (Amazon SNS) 通知
Amazon ツール
その他のツール
コードリポジトリ
ベストプラクティス
最小特権の原則に従い、タスクの実行に必要最小限のアクセス許可を付与します。詳細については、IAM ドキュメントの「最小限の特権を認める。」と「IAM でのセキュリティのベストプラクティス」を参照してください。
エピック
| タスク | 説明 | 必要なスキル |
|---|
AWS CLI プロファイルを設定します。 | レプリケート元アカウントを設定します。 aws configure --profile source-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
レプリケート先アカウントを設定します。 aws configure --profile destination-account
# Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
設定を確認します。 aws sts get-caller-identity --profile source-account
aws sts get-caller-identity --profile destination-account
| DevOps エンジニア、データエンジニア、ML エンジニア |
必要な情報の収集 | レプリケート元アカウント ID を取得します。 export SOURCE_ACCOUNT_ID=$(aws sts get-caller-identity --profile source-account --query Account --output text)
echo "Source Account ID: $SOURCE_ACCOUNT_ID"
レプリケート先アカウント ID を取得します。 export DEST_ACCOUNT_ID=$(aws sts get-caller-identity --profile destination-account --query Account --output text)
echo "Destination Account ID: $DEST_ACCOUNT_ID"
を設定します AWS リージョン。次のコマンドは、使用するリージョンに合わせて変更します。 export SOURCE_REGION="us-east-1"
export DEST_REGION="us-east-2"
レプリケート元アカウントの既存の Amazon ECR リポジトリを一覧表示します。 aws ecr describe-repositories --profile source-account --region $SOURCE_REGION --query 'repositories[].repositoryName' --output table
| DevOps エンジニア、データエンジニア、ML エンジニア |
リポジトリのクローンを作成する | ローカルワークステーションに、プラットフォームリポジトリのクローンを作成します。 git clone https://github.com/aws-samples/sample-ecr-copy
| DevOps エンジニア、データエンジニア、ML エンジニア |
| タスク | 説明 | 必要なスキル |
|---|
テンプレートの検証 | CloudFormation テンプレートを検証します。 aws cloudformation validate-template \
--template-body file://"Destination Account cf_template.yml" \
--profile destination-account
| DevOps エンジニア、ML エンジニア、データエンジニア |
レプリケート先インフラストラクチャのデプロイ | レプリケート先アカウントスタックをデプロイします。 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
スタックが完了するまで待ちます。 aws cloudformation wait stack-create-complete \
--stack-name ecr-copy-destination \
--profile destination-account \
--region $DEST_REGION
| データエンジニア、ML エンジニア、DevOps エンジニア |
デプロイメントを確認する。 | スタックの出力を取得します。 aws cloudformation describe-stacks \
--stack-name ecr-copy-destination \
--profile destination-account \
--region $DEST_REGION \
--query 'Stacks[0].Outputs' \
--output table
クロスアカウント IAM ロールを保存します。 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 エンジニア、ML エンジニア、データエンジニア |
| タスク | 説明 | 必要なスキル |
|---|
コンテナビルドの準備 | Docker が実行されていることを確認します。 docker --version
docker info
crane-app.py と Dockerfile が現在のディレクトリにあることを確認します。
ls -la crane-app.py Dockerfile
| データエンジニア、ML エンジニア、DevOps エンジニア |
コンテナイメージの構築 | Lambda コンテナイメージを構築します。 docker build -t ecr-copy-lambda . --no-cache
イメージが作成されたことを確認します。 docker images ecr-copy-lambda
(オプション) コンテナをローカルにテストします。 docker run --rm --entrypoint python ecr-copy-lambda -c "import boto3; print('Container working')"
| データエンジニア、ML エンジニア、DevOps エンジニア |
リポジトリを作成してイメージをアップロードする | レプリケート元アカウントに Amazon ECR リポジトリを作成します。 aws ecr create-repository \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
Amazon ECR ログイントークンを取得し、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
Amazon ECR のイメージにタグを付けます。 docker tag ecr-copy-lambda:latest \
$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
イメージを Amazon ECR にアップロードします。 docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
後で使用するために、このイメージ URI を保存しておきます。 export LAMBDA_IMAGE_URI="$SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest"
echo "Lambda Image URI: $LAMBDA_IMAGE_URI"
| データエンジニア、ML エンジニア、DevOps エンジニア |
イメージの確認 | リポジトリ内のイメージを一覧表示します。 aws ecr list-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
イメージの詳細を取得します。 aws ecr describe-images \
--repository-name ecr-copy-lambda \
--profile source-account \
--region $SOURCE_REGION
| データエンジニア、ML エンジニア、DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|
デプロイパラメータの準備 | 通知 E メールを設定します。 export NOTIFICATION_EMAIL="your-email@company.com"
コピーするリポジトリを定義します (カンマ区切りで指定)。 export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
環境を設定します。 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"
| データエンジニア、DevOps エンジニア、ML エンジニア |
レプリケート元テンプレートの検証 | レプリケート元 CloudFormation テンプレートを検証します。 aws cloudformation validate-template \
--template-body file://"Source Account Cf template.yml" \
--profile source-account
| データエンジニア、ML エンジニア、DevOps エンジニア |
レプリケート元インフラストラクチャのデプロイ | レプリケート元アカウントスタックをデプロイします。 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
スタックが完了するまで待ちます (最大 10 分かかる場合があります)。 aws cloudformation wait stack-create-complete \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION
| データエンジニア、ML エンジニア、DevOps エンジニア |
デプロイを確認し、出力を収集 | スタックの出力を取得します。 aws cloudformation describe-stacks \
--stack-name ecr-copy-source \
--profile source-account \
--region $SOURCE_REGION \
--query 'Stacks[0].Outputs' \
--output table
ステートマシンと SNS トピックの Amazon リソースネーム (ARNs) を保存します。 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 エンジニア、ML エンジニア、データエンジニア |
メールサブスクリプションの確認 | E メールをチェックして、SNS サブスクリプションを確認します。 E メール内の確認リンクを選択します。 サブスクリプションステータスを確認します。 aws sns list-subscriptions-by-topic \
--topic-arn $SNS_TOPIC_ARN \
--profile source-account \
--region $SOURCE_REGION
| データエンジニア、ML エンジニア、DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|
コピープロセスを実行してモニタリングする | にサインインし AWS マネジメントコンソール、Step Functions コンソールを開きます。 ステートマシンを特定します。 [実行のスタート] を選択します。 完了すると、[実行の入力と出力] タブに結果が表示されます。 (オプション) を使用して Step Functions の実行を継続する場合は AWS CLI、このエピックの残りのステップに従います。
| DevOps エンジニア、ML エンジニア、データエンジニア |
ステップ関数の実行 | 一意の名前を生成します。 export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
ステップ関数を実行します。 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 エンジニア、ML エンジニア、データエンジニア |
進行状況のモニタリング | ステータスを確認します。
aws stepfunctions describe-execution \
--execution-arn $EXECUTION_ARN \
--profile source-account \
--region $SOURCE_REGION \
--query '{Status:status,StartDate:startDate,StopDate:stopDate}' \
--output table
履歴を取得します。
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 エンジニア、ML エンジニア、データエンジニア |
結果の確認 | プロセスが完了するまで待ちます (30 秒ごとに更新)。 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 エンジニア、ML エンジニア、データエンジニア |
イメージの確認 | レプリケート先アカウントのリポジトリを一覧表示します。 aws ecr describe-repositories \
--profile destination-account \
--region $DEST_REGION \
--query 'repositories[].repositoryName' \
--output table
リポジトリイメージを確認します。 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 エンジニア、データエンジニア、ML エンジニア |
トラブルシューティング
| 問題 | ソリューション |
|---|
ステップ関数の実行に失敗した | 履歴から詳細な障害イベントを取得するには、次の AWS CLI コマンドを実行します。 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
失敗した Lambda 関数のログを取得するには、次の 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
|
関連リソース
追加情報
設定パラメータ
パラメータ | 説明 | 例 |
|---|
SourceAccountId
| ソース AWS アカウント ID | 11111111111
|
DestinationAccountId
| 送信先 AWS アカウント ID | 22222222222
|
DestinationRegion
| ターゲット AWS リージョン | us-east-2
|
SourceRegion
| ソース AWS リージョン | us-east-1
|
NotificationEmail
| E メール通知 | abc@xyz.com
|
RepositoryList
| コピーするリポジトリ | repo1,repo2,repo3
|
LambdaImageUri
| Lambda コンテナイメージの URI | ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/ecr-copy-lambda:latest
|