システム開発部Misocaチームエンジニアの id:mizukmb です。
今回は最近追加されたAWS ECRのクロスアカウントレプリケーション機能を実際に設定してみた話を書きたいと思います。
AWS ECRのクロスアカウントレプリケーション機能とは
ECRにDockerイメージがプッシュされたタイミングで異なるAWSアカウントのECRプライベートリポジトリに同じイメージを複製するといった機能です。アカウントだけでなく、同一アカウント内の異なるリージョンの複製もできるようです。
詳しくはAWS公式のブログを参照ください。
これまでは異なるリージョン・アカウントに同じDockerイメージを配置するためにはレプリケーションを行うスクリプトを用意するといった運用が必要でしたが、AWS側でサポートされることでこうした運用が必要なくなります。
Misocaチームの課題
Misocaチームでは、本番環境と開発環境はAWSアカウントを分けて運用しています。 開発環境のECSリプレイスとterraformでのコード化 - 弥生開発者ブログ by Misocaチーム にある通り開発環境はECSで動いていて、本番環境でも一部Dockerコンテナを利用してるところがあります。両環境共に同じDockerイメージを利用する箇所があり、下図のようにそれぞれの環境でCodeBuildを使ってDockerイメージのビルドとECRプライベートリポジトリへのプッシュを行っています。見てわかると思いますがほぼ同じ処理をするCodeBuildを二重に動かすことで両環境にDockerイメージを配置しています。この複雑なビルド方法に対しては以前から課題に感じており、もっとシンプルにできないかと頭を悩ませていました。
そしてこのタイミングでクロスアカウントレプリケーション機能が使えるようになりました。この機能によってCodeBuildをどちらかの環境で動かすだけでビルドしたDockerイメージを両環境に配置できるため、ビルド構成が今よりシンプルになりました。
送信元アカウントで機能を有効にする
それでは設定していきます。送信元アカウントと送信先アカウントの両方で設定が必要です。まずは送信元アカウントでクロスアカウントレプリケーション機能を有効にします。
ECRのページから Registries をクリックし、レジストリページに遷移します。こんなページです
次に プライベート をクリックし、ラジオボタンを有効にした後、 編集 ボタンをクリックして、編集ページに遷移します。
クロスアカウントレプリケーションの有効・無効を切り替えるトグルボタンがあるので有効にします。送信先アカウント設定のフォームが出現するので送信先アカウントとリージョンを入力します。入力したら保存ボタンをクリックして保存をします。
保存すると、クロスアカウントレプリケーションの欄に送信先のAWSアカウントIDが表示されるようになります。これで、送信元アカウントの設定は完了です。次は送信先アカウントの設定になります。
送信先アカウントでレジストリポリシーを設定する
レジストリポリシーを設定しますが、設定は 送信先アカウント で行いますので間違えないように気をつけてください。
まずは先ほどと同様にレジストリページに遷移します。次に プライベート をクリックし、ラジオボタンを有効にした後、今度は アクセス許可 ボタンをクリックして、プライベートレジストリのアクセス許可ページに遷移します。以下のような画面になります。
ステートメントを生成 ボタンをクリックして、ポリシーステートジェネレーターのモーダル画面を開きます。
ポリシーステートジェネレーターでは、ポリシーステートメント用のJSON文字列を自動生成し、設定します。直接JSONを書き込むこともできますがこちらの方が誤字等の設定ミスが少なくできるので今回はこちらを利用して設定します。以下のようにステートメントIDと送信元のAWSアカウントIDを入力し、 ポリシーに追加 ボタンをクリックして保存します。
これで全ての設定が完了しました。
実際にレプリケーションするか確かめるには
レプリケーションは送信元のECRリポジトリに docker push
されたタイミングで一度だけ実行されます。レプリケーションには数分の時間がかかっており、瞬時にレプケーションが完了するわけではない事に注意してください。
また、レプリケーション時にタグは上書きされることにも注意してください。例えば latest 運用していた場合にレプリケーションによって意図せずベースイメージが変わってしまう可能性があります。
その他レプリケーションに関する挙動については公式ドキュメントの『プライベートイメージのレプリケーションに関する考慮事項』をご確認ください。
おわりに
AWS ECRのクロスアカウントレプリケーションの設定に関する一連の流れを書きました。弊チームのようにDockerイメージのレプリケーション作業を自前で運用していた方は、こちらの機能を検討してみてはいかがでしょうか。