Day 10: コンテナイメージを管理する:AWS ECR (Elastic Container Registry) の使い方 📦
皆さん、こんにちは!30日集中講座、Day 10へようこそ。
昨日、ECSの全体像を学び、コンテナをAWS上で動かすためには、Dockerイメージを**ECR (Elastic Container Registry)**に保存する必要があることを知りました。ECRは、Docker Hubのようなプライベートなコンテナレジストリサービスで、AWSのサービスとシームレスに連携します。
今日は、ECRを実際に使って、ローカルで作成したDockerイメージをクラウドにプッシュする方法をステップ・バイ・ステップで学びましょう。
1. なぜECRを使うのか?
ECRは、単なるコンテナイメージの保管庫ではありません。
- AWSとの深い統合: ECRはIAMと連携しているため、コンテナイメージへのアクセス権限を細かく制御できます。また、ECSやEKSといったコンテナサービスから簡単にイメージをPullできます。
- 高いセキュリティ: イメージの脆弱性スキャン機能が組み込まれており、安全性を高めることができます。
- プライベートレジストリ: チーム内でのみ共有したい機密性の高いイメージを安全に保管できます。
2. 前提条件の確認
ECRへのプッシュを始める前に、以下の準備が完了しているか確認してください。
-
AWS CLI: AWS CLIがインストールされ、認証設定が完了していること。CLIを使ってアカウントIDを確認できます。
aws sts get-caller-identity --query Account --output text - Docker: ローカルにDockerがインストールされ、コンテナイメージがビルド済みであること。
-
IAM権限: ECRにイメージをプッシュ・プルする権限が必要です。学習用途であれば**
AmazonEC2ContainerRegistryFullAccess**ポリシーをIAMユーザーに付与してください。本番環境では、最小権限の原則に従い、プッシュ・プル専用のカスタムポリシーを用意することが推奨されます。
3. ECRへのイメージプッシュ 3ステップ
ECRへのイメージプッシュは、以下の3つのシンプルなステップで行います。
ステップ1: ECRリポジトリを作成する
まず、イメージを保存するための「リポジトリ」を作成します。コンソールからGUIで作成する方法の他に、AWS CLIを使うとより早く作成できます。
# CLIでリポジトリを作成
aws ecr create-repository --repository-name my-first-app --region ap-northeast-1
--regionで利用するリージョンを明示的に指定しましょう。
ステップ2: Dockerクライアントに認証情報を付与する
ECRにプッシュするためには、認証が必要です。AWS CLIを使って、DockerクライアントにECRへのアクセス権限を渡します。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com
-
ap-northeast-1: あなたが利用するリージョンに置き換えてください。 -
<YOUR-ACCOUNT-ID>: あなたのAWSアカウントIDに置き換えてください。
このコマンドは、一時的な認証情報(トークン)を発行し、DockerがECRにログインできるようにします。このトークンは12時間で期限切れになるため、その後は再度認証コマンドを実行する必要があります。
ステップ3: Dockerイメージにタグを付けてプッシュする
次に、ローカルでビルドしたDockerイメージに、ECRリポジトリのURIをタグ付けします。タグは、バージョン管理を行う上で非常に重要です。
# ローカルイメージに新しいタグを付ける
docker tag my-local-image:latest <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-first-app:latest
# ECRにイメージをプッシュ
docker push <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-first-app:latest
タグ付けのベストプラクティス
本番環境では、latestタグだけを使うのは危険です。バージョン管理の観点から、セマンティックバージョニングに従ってタグ付けすることが推奨されます。
# セマンティックバージョニングの例
# ローカルイメージにバージョンタグとlatestタグを付ける
docker tag my-local-image:latest <ECR-URI>/my-first-app:1.0.0
docker tag my-local-image:latest <ECR-URI>/my-first-app:latest
# それぞれをECRにプッシュ
docker push <ECR-URI>/my-first-app:1.0.0
docker push <ECR-URI>/my-first-app:latest
4. 実践!Day 6のアプリをECRにプッシュしてみよう
Day 6で作成したPythonアプリケーションをECRにプッシュする完全なコマンド例です。
cd my-web-app
docker build -t my-web-app:latest .
aws ecr create-repository --repository-name my-web-app
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com
docker tag my-web-app:latest <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:latest
docker push <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:latest
5. トラブルシューティング
よくあるエラーと解決法を知っておきましょう。
-
❌ エラー:
no basic auth credentials-
✅ 対策: 認証トークンが期限切れになっています。
aws ecr get-login-password ...コマンドを再実行してDockerに再ログインしてください。
-
✅ 対策: 認証トークンが期限切れになっています。
-
❌ エラー:
AccessDeniedException- ✅ 対策: IAMユーザーに必要なECR権限が付与されているか確認しましょう。
-
❌ エラー:
Client.TimeoutまたはConnect timeout- ✅ 対策: ネットワークの問題が考えられます。ファイアウォールやVPNがECRへの接続を妨げていないかチェックします。
6. ベストプラクティスと次へのステップ
- コスト最適化: ECRはストレージ料金(約$0.025/GB/月)とデータ転送料金がかかります。古いイメージを自動で削除するライフサイクルポリシーを設定することで、コストを抑えられます。
- セキュリティスキャン: ECRにプッシュされたイメージは、スキャンを有効化することで、自動的に脆弱性スキャンが行われ、リスクが検知されます。
- 次回への準備: 明日は、コンテナを実行するためのAWSの基盤であるEC2とFargateの比較について、より深く掘り下げます。
次回の予告
Day 11: ECSクラスターの設計:EC2とFargate、どちらを選ぶべき?
それでは、また明日お会いしましょう!