AWS ECRを理解したい
やらないこと
- 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には他にもイメージスキャンやライフサイクルポリシー設定などの機能があるので、このあたりも、そのうち記事にしていきたいと思います
参考
Discussion