はじめに
AWSのECRでリポジトリが無くてもイメージをプッシュできるようになったらしいので、実際に検証してみました
もう少し詳細に言うと、指定したプレフィックスに一致する(または一致しない)リポジトリにイメージが初めてプッシュされたときに、ECR が自動的にリポジトリを作成し、定義済みの設定(ライフサイクルポリシー、暗号化、タグの不変性、リポジトリポリシーなど)を適用できるようです
公式の記事はこちら
Amazon Elastic Container Registry (ECR) が、イメージプッシュ時のリポジトリの自動作成をサポートするようになりました。この新機能により、イメージのプッシュ時にリポジトリが存在しない場合は ECR によって自動的に作成されるようになり、コンテナイメージをプッシュする前にお客様がリポジトリを事前に作成する必要がなくなって、コンテナのワークフローが簡素化されます。これにより、お客様がイメージをプッシュすると、定義されたリポジトリ作成テンプレート設定に従って ECR が自動的にリポジトリを作成します。
実際にやってみた
ということで実際にやってみました
作業イメージとしては以下の流れです
- リポジトリ作成テンプレートの作成
- イメージの作成
- イメージのpush
- コンソールから確認
- (リソースの削除)
リポジトリ作成テンプレートの作成
最初にリポジトリ作成テンプレートを作成します
コンソールからECR (https://console.aws.amazon.com/ecr/) のページを開き、左メニューの「プライベートレジストリ/機能と設定/リポジトリ作成テンプレート」を選択します

作成ページに移動したら、「テンプレートを作成」をクリックします
設定は画像の通りで、今回はpushした時にリポジトリを作成するため「Create on push」を選択します
また、プレフィックスを指定するため「特定のプレフィックス」を選択し、プレフィックスを指定します
今回はtest/doiにしています
(必要に応じて説明も記載します)
全て入力したら「次へ」をクリックします
次に自動生成させるリポジトリの設定をします
こちらも画像の通りです

タグのミュータビリティがタグを上書きできるかどうかの設定です
暗号化はデフォルト暗号化とKMSでの暗号化を選択できます
その他、権限やライフサイクルポリシーなども必要に応じて設定します
最後に設定値の確認をして「作成」をクリックします
リポジトリ作成テンプレートができました
イメージの作成
次にECRにプッシュするためのdockerfileを作成します
内容は以前のECSハンズオンの時の記事と同様です
dockerfileサンプル
FROM ubuntu:18.04
# Install dependencies
RUN apt-get update && \
apt-get -y install apache2
# Install apache and write hello world message
RUN echo "Hello World!" > /var/www/html/index.html
# Configure apache
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \
echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \
chmod 755 /root/run_apache.sh
EXPOSE 80
CMD /root/run_apache.sh
今回はCloudShellから実施したいと思います
dockerが入っていることを確認したら、先ほど作成したdockerfileをアップロードします
docker --version
アップロードができたら、既存のイメージが無いことを確認し、ビルドします
ビルドが完了後の確認もしています
docker images
docker build -t {コンテナイメージ名} .
docker images
イメージのpush
ECRにpushする準備ができました
リポジトリが無いことを確認します
以下のコマンドでECRにイメージをpushします
aws ecr get-login-password --region {リージョン} | docker login --username AWS --password-stdin {アカウントID}.dkr.ecr.{リージョン}.amazonaws.com/test/doi
docker tag doi-test:latest {アカウントID}.dkr.ecr.{リージョン}.amazonaws.com/test/doi/doi-test:latest
docker push {アカウントID}.dkr.ecr.{リージョン}.amazonaws.com/test/doi/doi-test:latest
コンソールから確認
イメージのpushができたのでコンソールから確認してみたところ無事リポジトリが作成されていました🙌
リソースの削除
今回は検証なので作成したリソースを削除します
対象
- cloudshell
- CloudShell上のイメージ
- コンソール
- リポジトリ
- リポジトリ作成テンプレート
おわりに
リポジトリが無くてもpushできることには驚きつつ、今回はtest/doi/doi-testで作成しましたが、本当はtest/doi/test-doiで作りたかったとしたら作業ミスに繋がる気がしました
今までのように、先にtest/doi/test-doiでリポジトリを作成していれば、pushする時にエラーでミスに気付けますが、リポジトリが自動で作成されてpushできてしまったら気付けないと思いました
逆にサンドボックス環境のような検証のための環境であれば、一度テンプレートを作成してしまえば、それに沿うようにイメージをpushすれば、毎回リポジトリを作成しなくて済むのでとても便利に使えると思いました
1年半くらいやってみた記事を書いていなかったのですが、今でも月に1,2回程度いいねの通知が来るので、AWS最新情報から探して、久しぶりに記事を書いてみました
この記事が誰かの役に立てば嬉しいです
いいね、チャンネル登録をお願いします!
ではでは👋






