翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
フィルタリングされた 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 でのクロスリージョンレプリケーションの開始
このパターンでは、イメージタグパターンに基づいて、Amazon ECR に保存されているコンテナイメージを AWS アカウントとリージョン間で複製する方法を説明します。このパターンでは、Amazon CloudWatch Events を使用して、事前定義されたカスタムタグを持つイメージのプッシュイベントをリッスンします。プッシュイベントは AWS CodeBuild プロジェクトを開始し、イメージの詳細を渡します。 CodeBuild プロジェクトは、提供された詳細に基づいて、ソース Amazon ECR レジストリから宛先レジストリにイメージをコピーします。
このパターンでは、特定のタグが付いたイメージがアカウント間でコピーされます。たとえば、このパターンを使用して、本番環境に対応した安全なイメージのみを本番環境の AWS アカウントにコピーできます。開発アカウントでは、イメージを徹底的にテストした後、あらかじめ定義されたタグを安全なイメージに追加し、このパターンの手順に従ってマークしたイメージを本稼働アカウントにコピーできます。
前提条件と制限
前提条件
ソースと送信先の Amazon ECR レジストリ用のアクティブなAWS アカウント
このパターンで使用されるツールの管理者権限
テスト用にローカルマシンにインストールされたDocker
AWS コマンドラインインターフェイス (AWS CLI)(Amazon ECR への認証用)
制限
このパターンは、1 つの AWS リージョンでのみソースレジストリのプッシュイベントを監視します。このパターンを他のリージョンにデプロイして、そのリージョンのレジストリを監視できます。
このパターンでは、1 つの Amazon CloudWatch Events ルールが 1 つのイメージタグパターンをリッスンします。複数のパターンを確認する場合は、イベントを追加して追加したイメージタグパターンを監視できます。
アーキテクチャ
ターゲット アーキテクチャ
![アカウントとリージョン間でフィルタリングされた Amazon ECR コンテナイメージをレプリケートするためのアーキテクチャ。](images/pattern-img/a0f635e4-3ba5-4411-b9f8-54cfc228535a/images/2cb7962d-5b45-41a2-ba8c-7a18f01b617a.png)
自動化とスケール
このパターンは、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 つの方法で実装できます。
サンプル 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 ドキュメントの指示に従います。 信頼ポリシー(
権限ポリシー (
| 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ロールには、次の権限が必要です。
信頼ポリシー(
権限ポリシー (
以下のように CLI コマンドに管理ポリシー
| AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア |
クロスアカウントロールを作成します。 | 送信先 AWS アカウントで、ソースアカウントが引き受ける AWS ロールの IAM CodeBuild ロールを作成します。クロスアカウントロールでは、コンテナイメージが新しいリポジトリを作成し、コンテナイメージを Amazon ECR にアップロードできるようにする必要があります。 AWS CLI を使用して IAM ロールを作成する場合は、IAM ドキュメントの指示に従います。 前のステップの AWS CodeBuild プロジェクトを許可するには、次の信頼ポリシーを使用します。
前のステップの AWS CodeBuild プロジェクトが宛先レジストリにイメージを保存できるようにするには、次のアクセス許可ポリシーを使用します。
| AWS 管理者、AWS DevOps、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア、AWS システム管理者 |
タスク | 説明 | 必要なスキル |
---|---|---|
CodeBuild プロジェクトを作成します。 | AWS CodeBuild ドキュメント の指示に従って、ソースアカウントに AWS CodeBuild プロジェクトを作成します。プロジェクトはソースレジストリと同じリージョンにある必要があります。 以下のようにプロジェクトを設定します。
| AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
イベントルールを作成します。 | このパターンではコンテンツフィルタリング機能を使用するため、Amazon を使用してイベントを作成する必要があります EventBridge。 EventBridge ドキュメント「」の手順に従って、いくつかの変更を加えてイベントとターゲットを作成します。
| AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
Amazon ECR で認証します。 | Amazon ECR ドキュメントの手順に従って、ソースと送信先の両方のレジストリに対して認証します。 | AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、 DevOps エンジニア、クラウドアーキテクト |
イメージのレプリケーションをテストします。 | ソースアカウントで、 CodeBuild コンソール CodeBuild プロジェクトが正常に完了したら、移行先の AWS アカウントにサインインし、Amazon ECR コンソールを開き、移行先の Amazon ECR レジストリにイメージが存在することを確認します。 | AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア |
イメージの除外をテストします。 | ソースアカウントで、カスタムプレフィックスのないイメージタグを使用して、コンテナイメージを新規または既存の Amazon ECR ソースリポジトリにプッシュします。 CodeBuild プロジェクトが開始されていないこと、およびコンテナイメージが宛先レジストリに表示されていないことを確認します。 | AWS 管理者、AWS DevOps、AWS システム管理者、クラウド管理者、クラウドアーキテクト、 DevOps エンジニア |
関連リソース
追加情報
このパターンのリソースを自動的にデプロイするには、次の手順に従います。
添付ファイルをダウンロードし、
part-1-copy-tagged-images.yaml
と の 2 つの CloudFormation テンプレートを抽出しますpart-2-destination-account-role.yaml
。AWS CloudFormation コンソール
にログインし、ソース Amazon ECR part-1-copy-tagged-images.yaml
レジストリと同じ AWS アカウントとリージョンにデプロイします。必要に応じて、パラメータを更新します。テンプレートは以下のリソースをデプロイします。Amazon CloudWatch Events IAM ロール
AWS CodeBuild プロジェクトの IAM ロール
AWS CodeBuild プロジェクト
AWS CloudWatch Events ルール
[Outputs(出力)] タブの
SourceRoleName
の値を書き留めます。この値は次のステップで必要になります。Amazon ECR コンテナイメージをコピーする AWS アカウントに
part-2-destination-account-role.yaml
、2 番目の CloudFormation テンプレート をデプロイします。必要に応じて、パラメータを更新します。SourceRoleName
パラメータの場合は、手順 3 の値を指定します。このテンプレートはクロスアカウント IAM ロールをデプロイします。エピックセクションの最後の手順で説明したように、イメージの複製と除外を検証します。
添付ファイル
このドキュメントに関連する追加コンテンツにアクセスするには、次のファイルを解凍してください。「attachment.zip」