フィルタリングされた Amazon ECR コンテナイメージをアカウントまたはリージョン間で複製する - AWS 規範ガイダンス

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

フィルタリングされた Amazon ECR コンテナイメージをアカウントまたはリージョン間で複製する

作成者: Abdal Garuba (AWS)

環境:本稼働

テクノロジー: コンテナとマイクロサービス DevOps

AWS サービス: Amazon EC2 Container Registry 、Amazon CloudWatch、AWS CodeBuild、AWS Identity and Access Management 、AWS CLI

[概要]

Amazon Elastic Container Registry (Amazon ECR) は、クロスリージョンおよびクロスアカウントのレプリケーション機能を使用して、イメージリポジトリ内のすべてのコンテナイメージをAmazon Web Services (AWS) リージョンと AWS アカウントにネイティブに複製できます。(詳細については、AWS ブログ投稿 Amazon ECR でのクロスリージョンレプリケーションの開始を参照してください。) ただし、AWS リージョンまたはアカウント間でコピーされたイメージを基準に基づいてフィルタリングする方法はありません。 

このパターンでは、イメージタグパターンに基づいて、Amazon ECR に保存されているコンテナイメージを AWS アカウントとリージョン間で複製する方法を説明します。このパターンでは、Amazon CloudWatch Events を使用して、事前定義されたカスタムタグを持つイメージのプッシュイベントをリッスンします。プッシュイベントは AWS CodeBuild プロジェクトを開始し、イメージの詳細を渡します。 CodeBuild プロジェクトは、提供された詳細に基づいて、ソース Amazon ECR レジストリから宛先レジストリにイメージをコピーします。

このパターンでは、特定のタグが付いたイメージがアカウント間でコピーされます。たとえば、このパターンを使用して、本番環境に対応した安全なイメージのみを本番環境の AWS アカウントにコピーできます。開発アカウントでは、イメージを徹底的にテストした後、あらかじめ定義されたタグを安全なイメージに追加し、このパターンの手順に従ってマークしたイメージを本稼働アカウントにコピーできます。

前提条件と制限

前提条件

制限

  • このパターンは、1 つの AWS リージョンでのみソースレジストリのプッシュイベントを監視します。このパターンを他のリージョンにデプロイして、そのリージョンのレジストリを監視できます。

  • このパターンでは、1 つの Amazon CloudWatch Events ルールが 1 つのイメージタグパターンをリッスンします。複数のパターンを確認する場合は、イベントを追加して追加したイメージタグパターンを監視できます。

アーキテクチャ

ターゲット アーキテクチャ

アカウントとリージョン間でフィルタリングされた Amazon ECR コンテナイメージをレプリケートするためのアーキテクチャ。

自動化とスケール

このパターンは、infrastructure as code (IaC) スクリプトで自動化し、大規模にデプロイできます。AWS CloudFormation テンプレートを使用してこのパターンをデプロイするには、添付ファイルをダウンロードし、「追加情報」セクションの指示に従ってください。

複数の Amazon CloudWatch Events イベント (異なるカスタムイベントパターン) を同じ AWS CodeBuild プロジェクトにポイントして複数のイメージタグパターンをレプリケートできますが、複数のパターンをサポートするには、buildspec.yamlファイル (添付ファイルとツールセクションに含まれている) のセカンダリ検証を次のように更新する必要があります。

... if [[ ${IMAGE_TAG} != release-* ]]; then ...

ツール

Amazon サービス

  • IAM— AWS Identity and Access Management (IAM) を使用すると、AWS サービスとリソースへのアクセスを安全に管理できます。このパターンでは、コンテナイメージを送信先レジストリにプッシュするときに AWS が引き受け CodeBuild るクロスアカウント IAM ロールを作成する必要があります。

  • Amazon ECR – Amazon Elastic Container Registry (Amazon ECR) は、フルマネージド型のレジストリで、 コンテナイメージとアーティファクトの保存、管理、デプロイをどこでも容易にできます。ソースレジストリへのイメージプッシュアクションは、Amazon CloudWatch Events によって取得されるイベントバスにシステムイベントの詳細を送信します。

  • AWS CodeBuild – AWS CodeBuild は、ソースコードのコンパイル、テストの実行、デプロイ可能なアーティファクトの生成などのジョブを実行するためのコンピューティング能力を提供するフルマネージドの継続的統合サービスです。このパターンでは、AWS CodeBuild を使用してソース Amazon ECR レジストリから宛先レジストリにコピーアクションを実行します。

  • CloudWatch イベント – Amazon CloudWatch Events は、AWS リソースの変更を記述するシステムイベントのストリームを配信します。このパターンでは、ルールを使用して Amazon ECR プッシュアクションを特定のイメージタグパターンと照合します。

ツール

  • Docker CLI — Docker はコンテナの作成と管理を容易にするツールです。コンテナは、アプリケーションとそのすべての依存関係を 1 つのユニットまたはパッケージにまとめ、コンテナランタイムをサポートする任意のプラットフォームに簡単にデプロイできます。

コード

このパターンは、以下の 2 つの方法で実装できます。

  • 自動セットアップ: 添付ファイルに記載されている 2 つの AWS CloudFormation テンプレートをデプロイします。手順については、追加情報セクションを参照してください。

  • 手動設定: エピックセクションの手順に従います。 

サンプル buildspec.yaml

このパターンで提供されている CloudFormation テンプレートを使用している場合、buildspec.yamlファイルは CodeBuild リソースに含まれます。

version: 0.2 env: shell: bash phases: install: commands: - export CURRENT_ACCOUNT=$(echo ${CODEBUILD_BUILD_ARN} | cut -d':' -f5) - export CURRENT_ECR_REGISTRY=${CURRENT_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com - export DESTINATION_ECR_REGISTRY=${DESTINATION_ACCOUNT}.dkr.ecr.${DESTINATION_REGION}.amazonaws.com pre_build: on-failure: ABORT commands: - echo "Validating Image Tag ${IMAGE_TAG}" - | if [[ ${IMAGE_TAG} != release-* ]]; then aws codebuild stop-build --id ${CODEBUILD_BUILD_ID} sleep 60 exit 1 fi - aws ecr get-login-password --region ${AWS_REGION} | docker login -u AWS --password-stdin ${CURRENT_ECR_REGISTRY} - docker pull ${CURRENT_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} build: commands: - echo "Assume cross-account role" - CREDENTIALS=$(aws sts assume-role --role-arn ${CROSS_ACCOUNT_ROLE_ARN} --role-session-name Rolesession) - export AWS_DEFAULT_REGION=${DESTINATON_REGION} - export AWS_ACCESS_KEY_ID=$(echo ${CREDENTIALS} | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo ${CREDENTIALS} | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo ${CREDENTIALS} | jq -r '.Credentials.SessionToken') - echo "Logging into cross-account registry" - aws ecr get-login-password --region ${DESTINATION_REGION} | docker login -u AWS --password-stdin ${DESTINATION_ECR_REGISTRY} - echo "Check if Destination Repository exists, else create" - | aws ecr describe-repositories --repository-names ${REPO_NAME} --region ${DESTINATION_REGION} \ || aws ecr create-repository --repository-name ${REPO_NAME} --region ${DESTINATION_REGION} - echo "retag image and push to destination" - docker tag ${CURRENT_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} ${DESTINATION_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} - docker push ${DESTINATION_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG}

エピック

タスク説明必要なスキル

CloudWatch イベントロールを作成します。

ソース AWS アカウントで、Amazon CloudWatch Events が引き受ける IAM ロールを作成します。ロールには、AWS CodeBuild プロジェクトを開始するためのアクセス許可が必要です。

AWS CLI を使用してロールを作成するには、IAM ドキュメントの指示に従います。

信頼ポリシー(trustpolicy.json) の例: 

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "events.amazonaws.com"}, "Action": "sts:AssumeRole" } }

権限ポリシー (permissionpolicy.json)の例:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "codebuild:StartBuild", "Resource": "<CodeBuild Project ARN>" } }
AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア

CodeBuild ロールを作成します。

「IAM ドキュメント」の手順に従って、AWS が引き受け CodeBuild る IAM ロールを作成します。 https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-cliロールには、次の権限が必要です。

  • 送信先のクロスアカウントロールを引き受ける権限

  • ロググループとログストリームを作成する権限、ログイベントを記録する権限

  • AmazonEC2ContainerRegistryReadOnly ECR リポジトリへの読み取り専用アクセス許可を付与する

  • 停止するアクセス許可 CodeBuild

信頼ポリシー(trustpolicy.json) の例:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

権限ポリシー (permissionpolicy.json)の例:

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codebuild:StartBuild", "codebuild:StopBuild", "codebuild:Get*", "codebuild:List*", "codebuild:BatchGet*" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*", "Effect": "Allow" }, { "Action": "sts:AssumeRole", "Resource": "<ARN of destination role>", "Effect": "Allow", "Sid": "AssumeCrossAccountArn" } ] }

以下のように CLI コマンドに管理ポリシー AmazonEC2ContainerRegistryReadOnly を添付します。

~$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name <name of CodeBuild Role>
AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア

クロスアカウントロールを作成します。

送信先 AWS アカウントで、ソースアカウントが引き受ける AWS ロールの IAM CodeBuild ロールを作成します。クロスアカウントロールでは、コンテナイメージが新しいリポジトリを作成し、コンテナイメージを Amazon ECR にアップロードできるようにする必要があります。

AWS CLI を使用して IAM ロールを作成する場合は、IAM ドキュメントの指示に従います。 

前のステップの AWS CodeBuild プロジェクトを許可するには、次の信頼ポリシーを使用します。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "<ARN of source codebuild role>" }, "Action": "sts:AssumeRole" } }

前のステップの AWS CodeBuild プロジェクトが宛先レジストリにイメージを保存できるようにするには、次のアクセス許可ポリシーを使用します。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchCheckLayerAvailability", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:GetAuthorizationToken", "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" } ] }
AWS 管理者、AWS DevOps、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア、AWS システム管理者
タスク説明必要なスキル

CodeBuild プロジェクトを作成します。

AWS CodeBuild ドキュメント の指示に従って、ソースアカウントに AWS CodeBuild プロジェクトを作成します。プロジェクトはソースレジストリと同じリージョンにある必要があります。 

以下のようにプロジェクトを設定します。

  • 環境タイプ: LINUX CONTAINER

  • サービスロール: CodeBuild Role

  • 特権モード: true

  • 環境イメージ: aws/codebuild/standard:x.x (入手可能な最新イメージを使用)

  • 環境変数:

    • CROSS_ACCOUNT_ROLE_ARN: クロスアカウントロールの Amazon リソースネーム (ARN)

    • DESTINATION_REGION: クロスアカウントリージョンの名前

    • DESTINATION_ACCOUNT: 送信先アカウントの番号

  • ビルド仕様: ツールセクションにリストされている buildspec.yaml ファイルを使用します。

AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア
タスク説明必要なスキル

イベントルールを作成します。

このパターンではコンテンツフィルタリング機能を使用するため、Amazon を使用してイベントを作成する必要があります EventBridge。 EventBridge ドキュメント「」の手順に従って、いくつかの変更を加えてイベントとターゲットを作成します。

  • パターンの定義の場合は、[Event Pattern(イベントパターン)] を選択してから、[Custom pattern(カスタムパターン)] を選択します。

  • 以下のカスタムイベントパターンのサンプルコードを、表示されたテキストボックスにコピーします。

    {   "source": ["aws.ecr"],   "detail-type": ["ECR Image Action"],   "detail": {     "action-type": ["PUSH"],     "result": ["SUCCESS"],     "image-tag": [{ "prefix": "release-"}]   } }
  • ターゲットの選択 で、AWS CodeBuild プロジェクトを選択し、前のエピックで作成した AWS CodeBuild プロジェクトの ARN を貼り付けます。

  • 入力の設定の場合は、[Input Transformer(入力トランスフォーマー)] を選択します。

    • Input Path(入力パス) テキストボックスに、以下を貼り付けます。

      {"IMAGE_TAG":"$.detail.image-tag","REPO_NAME":"$.detail.repository-name"}
    • Input Template(入力テンプレート) テキストボックスに、以下を貼り付けます。

      {"environmentVariablesOverride": [ {"name": "IMAGE_TAG", "value":<IMAGE_TAG>},{"name":"REPO_NAME","value":<REPO_NAME>}]}
  • 「既存のロールを使用」を選択し、「IAM ロールの作成」エピックで以前に作成した CloudWatch イベントロールの名前を選択します。

AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア
タスク説明必要なスキル

Amazon ECR で認証します。

Amazon ECR ドキュメントの手順に従って、ソースと送信先の両方のレジストリに対して認証します。

AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、 DevOps エンジニア、クラウドアーキテクト

イメージのレプリケーションをテストします。

ソースアカウントで、release- のプレフィックスが付いたイメージタグを使用して、コンテナイメージを新規または既存の Amazon ECR ソースリポジトリにプッシュします。イメージをプッシュするには、Amazon ECR ドキュメントの手順に従います。 

CodeBuild コンソール で CodeBuild プロジェクトの進行状況をモニタリングできます。 

CodeBuild プロジェクトが正常に完了したら、移行先の AWS アカウントにサインインし、Amazon ECR コンソールを開き、移行先の Amazon ECR レジストリにイメージが存在することを確認します。

AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア

イメージの除外をテストします。

ソースアカウントで、カスタムプレフィックスのないイメージタグを使用して、コンテナイメージを新規または既存の Amazon ECR ソースリポジトリにプッシュします。 

CodeBuild プロジェクトが開始されていないこと、およびコンテナイメージが宛先レジストリに表示されていないことを確認します。

AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア

関連リソース

追加情報

このパターンのリソースを自動的にデプロイするには、次の手順に従います。

  1. 添付ファイルをダウンロードし、 part-1-copy-tagged-images.yamlと の 2 つの CloudFormation テンプレートを抽出しますpart-2-destination-account-role.yaml

  2. AWS CloudFormation コンソール にログインし、ソース Amazon ECR part-1-copy-tagged-images.yaml レジストリと同じ AWS アカウントとリージョンにデプロイします。必要に応じて、パラメータを更新します。テンプレートは以下のリソースをデプロイします。

    • Amazon CloudWatch Events IAM ロール

    • AWS CodeBuild プロジェクトの IAM ロール

    • AWS CodeBuild プロジェクト

    • AWS CloudWatch Events ルール

  3. [Outputs(出力)] タブの SourceRoleName の値を書き留めます。この値は次のステップで必要になります。

  4. Amazon ECR コンテナイメージをコピーする AWS アカウントにpart-2-destination-account-role.yaml、2 番目の CloudFormation テンプレート をデプロイします。必要に応じて、パラメータを更新します。SourceRoleName パラメータの場合は、手順 3 の値を指定します。このテンプレートはクロスアカウント IAM ロールをデプロイします。

  5. エピックセクションの最後の手順で説明したように、イメージの複製と除外を検証します。

添付ファイル

このドキュメントに関連する追加コンテンツにアクセスするには、次のファイルを解凍してください。「attachment.zip