View a markdown version of this page

AWS アカウント と 間で Amazon ECR コンテナイメージをコピーする AWS リージョン - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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 ツール

  • Amazon CloudWatch は、 AWS リソースと で実行しているアプリケーションのメトリクスを AWS リアルタイムでモニタリングするのに役立ちます。

  • Amazon DynamoDB は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。

  • Amazon Simple Notification Service (Amazon SNS) は、ウェブサーバーやメールアドレスなど、パブリッシャーとクライアント間のメッセージの交換を調整および管理するのに役立ちます。

  • AWS Identity and Access Management (IAM) は、誰を認証し、誰に使用する権限を付与するかを制御することで、 AWS リソースへのアクセスを安全に管理するのに役立ちます。

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • AWS Step Functions は、Lambda 関数とその他の を組み合わせてビジネスクリティカルなアプリケーション AWS のサービス を構築するのに役立つサーバーレスオーケストレーションサービスです。

その他のツール

  • Crane は Docker オーケストレーションツールです。これは Docker Compose に似ていますが、追加の機能があります。

  • Docker は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信する、Platform as a Service (PaaS) 製品のセットです。

コードリポジトリ

  • このパターンのコードは、GitHub 内の sample-ecr-copy repository リポジトリで利用できます。このリポジトリの CloudFormation テンプレートを使用して、基盤となるリソースを作成できます。

ベストプラクティス

最小特権の原則に従い、タスクの実行に必要最小限のアクセス許可を付与します。詳細については、IAM ドキュメントの「最小限の特権を認める。」と「IAM でのセキュリティのベストプラクティス」を参照してください。

エピック

タスク説明必要なスキル

AWS CLI プロファイルを設定します。

  1. レプリケート元アカウントを設定します。

    aws configure --profile source-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  2. レプリケート先アカウントを設定します。

    aws configure --profile destination-account # Enter: Access Key ID, Secret Access Key, Default region, Output format (json)
  3. 設定を確認します。

    aws sts get-caller-identity --profile source-account aws sts get-caller-identity --profile destination-account
DevOps エンジニア、データエンジニア、ML エンジニア

必要な情報の収集

  1. レプリケート元アカウント ID を取得します。

    export SOURCE_ACCOUNT_ID=$(aws sts get-caller-identity --profile source-account --query Account --output text) echo "Source Account ID: $SOURCE_ACCOUNT_ID"
  2. レプリケート先アカウント ID を取得します。

    export DEST_ACCOUNT_ID=$(aws sts get-caller-identity --profile destination-account --query Account --output text) echo "Destination Account ID: $DEST_ACCOUNT_ID"
  3. を設定します AWS リージョン。次のコマンドは、使用するリージョンに合わせて変更します。

    export SOURCE_REGION="us-east-1" export DEST_REGION="us-east-2"
  4. レプリケート元アカウントの既存の 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 エンジニア、データエンジニア

レプリケート先インフラストラクチャのデプロイ

  1. レプリケート先アカウントスタックをデプロイします。

    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. スタックが完了するまで待ちます。

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION
データエンジニア、ML エンジニア、DevOps エンジニア

デプロイメントを確認する。

  1. スタックの出力を取得します。

    aws cloudformation describe-stacks \ --stack-name ecr-copy-destination \ --profile destination-account \ --region $DEST_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. クロスアカウント 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 エンジニア、データエンジニア
タスク説明必要なスキル

コンテナビルドの準備

  1. Docker が実行されていることを確認します。

    docker --version docker info
  2. crane-app.pyDockerfile が現在のディレクトリにあることを確認します。

    ls -la crane-app.py Dockerfile
データエンジニア、ML エンジニア、DevOps エンジニア

コンテナイメージの構築

  1. Lambda コンテナイメージを構築します。

    docker build -t ecr-copy-lambda . --no-cache
  2. イメージが作成されたことを確認します。

    docker images ecr-copy-lambda
  3. (オプション) コンテナをローカルにテストします。

    docker run --rm --entrypoint python ecr-copy-lambda -c "import boto3; print('Container working')"
データエンジニア、ML エンジニア、DevOps エンジニア

リポジトリを作成してイメージをアップロードする

  1. レプリケート元アカウントに Amazon ECR リポジトリを作成します。

    aws ecr create-repository \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. 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
  3. Amazon ECR のイメージにタグを付けます。

    docker tag ecr-copy-lambda:latest \ $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  4. イメージを Amazon ECR にアップロードします。

    docker push $SOURCE_ACCOUNT_ID.dkr.ecr.$SOURCE_REGION.amazonaws.com/ecr-copy-lambda:latest
  5. 後で使用するために、このイメージ 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 エンジニア

イメージの確認

  1. リポジトリ内のイメージを一覧表示します。

    aws ecr list-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
  2. イメージの詳細を取得します。

    aws ecr describe-images \ --repository-name ecr-copy-lambda \ --profile source-account \ --region $SOURCE_REGION
データエンジニア、ML エンジニア、DevOps エンジニア
タスク説明必要なスキル

デプロイパラメータの準備

  1. 通知 E メールを設定します。

    export NOTIFICATION_EMAIL="your-email@company.com"
  2. コピーするリポジトリを定義します (カンマ区切りで指定)。

    export REPOSITORY_LIST="app-frontend,app-backend,database-migrations"
  3. 環境を設定します。

    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 エンジニア

レプリケート元インフラストラクチャのデプロイ

  1. レプリケート元アカウントスタックをデプロイします。

    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. スタックが完了するまで待ちます (最大 10 分かかる場合があります)。

    aws cloudformation wait stack-create-complete \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION
データエンジニア、ML エンジニア、DevOps エンジニア

デプロイを確認し、出力を収集

  1. スタックの出力を取得します。

    aws cloudformation describe-stacks \ --stack-name ecr-copy-source \ --profile source-account \ --region $SOURCE_REGION \ --query 'Stacks[0].Outputs' \ --output table
  2. ステートマシンと 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 エンジニア、データエンジニア

メールサブスクリプションの確認

  1. E メールをチェックして、SNS サブスクリプションを確認します。

  2. E メール内の確認リンクを選択します。

  3. サブスクリプションステータスを確認します。

    aws sns list-subscriptions-by-topic \ --topic-arn $SNS_TOPIC_ARN \ --profile source-account \ --region $SOURCE_REGION
データエンジニア、ML エンジニア、DevOps エンジニア
タスク説明必要なスキル

コピープロセスを実行してモニタリングする

  1. にサインインし AWS マネジメントコンソール、Step Functions コンソールを開きます。

  2. ステートマシンを特定します。

  3. [実行のスタート] を選択します。

    完了すると、[実行の入力と出力] タブに結果が表示されます。

  4. (オプション) を使用して Step Functions の実行を継続する場合は AWS CLI、このエピックの残りのステップに従います。

DevOps エンジニア、ML エンジニア、データエンジニア

ステップ関数の実行

  1. 一意の名前を生成します。

    export EXECUTION_NAME="ecr-copy-$(date +%Y%m%d-%H%M%S)"
  2. ステップ関数を実行します。

    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 エンジニア、データエンジニア

進行状況のモニタリング

  1. ステータスを確認します。

    aws stepfunctions describe-execution \ --execution-arn $EXECUTION_ARN \ --profile source-account \ --region $SOURCE_REGION \ --query '{Status:status,StartDate:startDate,StopDate:stopDate}' \ --output table
  2. 履歴を取得します。

    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 エンジニア、データエンジニア

イメージの確認

  1. レプリケート先アカウントのリポジトリを一覧表示します。

    aws ecr describe-repositories \ --profile destination-account \ --region $DEST_REGION \ --query 'repositories[].repositoryName' \ --output table
  2. リポジトリイメージを確認します。

    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 エンジニア

トラブルシューティング

問題ソリューション

ステップ関数の実行に失敗した

  1. 履歴から詳細な障害イベントを取得するには、次の 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
  2. 失敗した 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