Amazon ECRのクロスリージョンレプリケーションを試してみた

2024.02.29

こんにちは、岩城です。

先日、ECRのクロスリージョンレプリケーションを試す機会がありましたので共有します。

クロスリージョンレプリケーションを試すきっかけ

以下の構成で、ソウルリージョンのECSタスクが東京リージョンのECRにアクセスしようとした際、

以下のエラーメッセージが表示され、タスクの起動に失敗しました。

ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post "https://api.ecr.ap-northeast-1.amazonaws.com/": dial tcp 52.119.218.165:443: i/o timeout. Please check your task network configuration.

原因は、公式ドキュメントに記載のとおり、Fargateを使用するECSタスクでは、VPCエンドポイントを通じてのクロスリージョンECRアクセスができないという点にあります。

現在、VPC エンドポイントはクロスリージョンリクエストをサポートしていません。Amazon ECS に対して API コールを発行するリージョンと同じリージョンにエンドポイントを作成してください。

そこで、以下の構成で東京リージョンのECRをメインとし、ソウルリージョンにレプリカを作成する対応を取りました。

クロスリージョンレプリケーションとは

この機能は、その名の通り、異なるリージョンに存在するECR間でコンテナイメージをレプリケーションするものです。

同一AWSアカウント内の別リージョンにあるECRや、異なるAWSアカウントにあるECRへのレプリケーションが可能です。

本エントリでは、同一AWSアカウント内の別リージョンにあるECRにクロスリージョンレプリケーションを想定しています。

設定方法は簡単です。送信先タイプでクロスリージョンレプリケーションを有効化し、

送信先としてソウルリージョンを選択後、レプリケーションルールを追加して完了です。

クロスリージョンレプリケーションのポイント

クロスリージョンレプリケーションのポイントをまとめます。

レプリカへイメージがレプリケーションされるタイミング

レプリカへイメージがレプリケーションされるタイミングは、メインへイメージがプッシュされた時です。

このため、レプリカへの初期セットアップ時にイメージを反映するには2つの対応が考えられます。

1つ目は、メインにイメージをPushし、レプリケーションされるのを待ちます。

この時、レプリケーション先にリポジトリが存在しなければ、同名で作成された後にイメージがレプリケーションされるので問題ありません。

2つ目は、レプリカにメインと同名リポジトリを作成し、個別にイメージをPushします。

メインリポジトリと同名リポジトリであれば、既にリポジトリが存在してもレプリケーションされます。

このため、メインリポジトリの最新イメージをレプリカにPushしてイメージを合わせます。

レジストリ設定やリポジトリ設定はレプリケーションされない

レジストリ設定やリポジトリ設定はレプリケーションされないため、レプリカで個別に設定が必要です。

例えば、レジストリのスキャン設定、リポジトリのタグのイミュータビリティ設定、パーミッション設定、ライフサイクル設定は、レプリケーションの対象外です。

おわりに

東京リージョンに存在するリポジトリに、別リージョンのECSタスクからVPCエンドポイントを経由してアクセスしたところ、前述のとおりアクセスできないことが分かりました。

インターネット経由のアクセス方法もありますが、検証していた環境はインターネットへのアクセス経路がありませんでした。

このため、クロスリージョンレプリケーションをワークアラウンドとして採用しました。

本エントリが、どなかたのお役に立てれば幸いです。