🧊

AWS ECRを理解したい

2025/02/01に公開

やらないこと

  • Docker自体の説明

AWS ECR(Elastic Container Registry)とは

セキュリティ、スケーラビリティ、信頼性を備えたAWSのマネージドコンテナイメージレジストリサービスです

ここでいうレジストリとは「保存場所」のことです
Dockerなどのコンテナイメージを安全に保存・管理してくれるサービスということですね

どうやってコンテナイメージを保存・管理している?

ECRはいくつかのコンポーネントによって、コンテナイメージを管理しています

レジストリ

レジストリは1AWSアカウントに対して1つだけ用意されている保管場所です

このレジストリには2つのタイプがありプライベートレジストリとパブリックレジストリがあります

プライベートレジストリとは

名前の通り、コンテナイメージをプライベートに管理したい場合に利用するリジストリです

  • IAM認証が必要
  • push/pullの操作にはIAMポリシーによる適切な権限が必要
  • 組織内での機密性の高いコンテナイメージの管理に適している
パブリックレジストリとは

名前の通り、公開されたコンテナイメージを管理・共有するためのレジストリです

  • 誰でもコンテナイメージのpull(ダウンロード)が可能
  • pushには適切な権限が必要
  • オープンソースプロジェクトや公開用のコンテナイメージの共有に最適
  • Docker Hubのような公開レジストリとしての役割を果たす

リポジトリ

Dockerなどのコンテナイメージを保存する保存場所です
リポジトリはレジストリの中に作成されます

1つのリポジトリで同じイメージの異なるバージョンのイメージを管理することができ、タグを使用して各バージョンを識別します

また、タグの上書き不可の設定にすることで、タグ名が重複しないバージョン管理(1.0.0→ 1.0.1→ 1.0.2….のような)をすることができます

ここまでの要素を図にすると以下のようなイメージです

イメージが理解できたところで、実際にリポジトリを作成してみましょう

ECRのリポジトリを作成する

AWS ECRをコンソールから開く →「リポジトリの作成」を選択 → プライベートリポジトリを作成する画面で以下のように設定します

リージョン
東京リージョン

一般設定
リポジトリ名:backend-app
イメージタグのミュータビリティ:Immutable(タグの上書き不可)

あとの設定はデフォルトのままにして作成します。

中身が空のリポジトリが作成できました
ここからAWS CLIを使用して、実際にDockerイメージをpush/pullしていきます

ローカルPCからAWS ECRのプライベートリポジトリにイメージをpushする

プッシュする為のコマンドは「backend-app」を開いて右上にある「プッシュコマンドを表示」で確認することができます

順番に見ていきましょう

認証トークンを取得し、DockerクライアントからECRにログインする

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com

このコマンドは、ECRの認証トークンを取得するコマンドです

aws ecr get-login-password --region ap-northeast-1 --profile <自分のプロファイル名>

認証トークンとは?

ECR認証トークンは、ECRレジストリへのアクセスを認証するための一時的なクレデンシャルです

このトークンを使用することで、DockerクライアントがECRレジストリに対して安全にpush/pullを行うことができます

一度、取得した認証トークンは12時間は有効です

取得した認証トークンは以下のコマンドに渡されます
トークンを使ってDockerクライアントはECRにアクセスします

docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com

ECRへのアクセスが完了すると、以下のメッセージが表示されます

Login Succeeded

Dockerイメージをbuildする

backend-appというイメージ名でビルドします

docker build -t backend-app .

Dockerイメージの名前を変更する

先ほどbuildしたイメージのイメージ名とtagを変更します

docker tag backend-app:latest <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/backend-app:1.0.0

イメージをpushする

名前を変更したイメージをpushします

docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/backend-app

コンソールで確認

無事に1.0.0というタグ名でイメージをpushできました!

ちなみに設定でリポジトリの設定で、タグの設定をImmutableにしていたので、2回目以降、同じタグ名で新しいイメージをpushしようとすると以下のエラーが出ます

tag invalid: The image tag '1.0.0' already exists in the 'backend-app' repository and cannot be overwritten because the repository is immutable.

ECRからローカルPCにイメージをpullする

先ほどpushしたイメージをローカルにpullします
正しくpullできるかをチェックするために、一度ローカルのイメージは削除しておきます

docker rmi <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/backend-app:1.0.0
docker pull <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/backend-app:1.0.0

docker imagesで確認します

REPOSITORY                                                      TAG       IMAGE ID       CREATED        SIZE
637013514419.dkr.ecr.ap-northeast-1.amazonaws.com/backend-app   1.0.0     c5d5337b931d   1 hours ago   165MB

無事にECRからイメージをpullできました!

ECRのプライベートリポジトリに関する料金

最後に料金についてです
2025年2月時点の東京リージョンでは、以下の料金になっています

項目 料金 単位
ストレージ 0.10 USD/GB/月
データ受信(インバウンド) 0.00 USD/GB
データ送信(アウトバウンド)最初の9.999 TB 0.114 USD/GB
データ送信(アウトバウンド)次の40 TB 0.089 USD/GB
データ送信(アウトバウンド)次の100 TB 0.086 USD/GB
データ送信(アウトバウンド)150 TB超 0.084 USD/GB

リポジトリに保存するイメージは、月1GBあたり0.10USD発生します
その為、不要なイメージは定期的に削除するなどの対応が必要です

またデータ受信(push)については料金は発生しないようです

料金が発生するのはデータ送信(pull)の方で、こちらは月間使用量に応じた段階的料金になっています。

なので例えば、10GBのコンテナイメージを保存する場合
ストレージ料金: 10GB × 0.10USD = 1.00USD

そのイメージを100回プルする場合
データ転送量: 10GB × 100回 = 1,000GB
転送料金: 1,000GB × 0.114USD = 114.00USD

よってストレージ料金と転送料金で月当たり、115.00USDのコストが発生するということになります

まとめ

ということで今回はAWS ECRの基本的な部分についてまとめました

ECRには他にもイメージスキャンやライフサイクルポリシー設定などの機能があるので、このあたりも、そのうち記事にしていきたいと思います

参考

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/what-is-ecr.html

https://aws.amazon.com/jp/ecr/pricing/

Discussion