ECR:コンテナイメージの保存と取得
DockerイメージをAmazon ECRにプッシュし、ライフサイクルポリシーで古いイメージを整理し、ECSタスクにイメージを安全にプルします。
「ECR:コンテナイメージの保存と取得」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。
Amazon ECRとは
Amazon Elastic Container Registry(ECR)は、完全マネージド型でDocker互換のコンテナイメージレジストリです。AWS内でコンテナイメージを安全に保存、管理、デプロイできます。ECRにより、独自のレジストリインフラストラクチャを運用する必要がなくなり、ECS、EKS、Lambda(コンテナイメージ)、CodeBuildとネイティブに統合できます。ECRに保存されたイメージは高可用性のためにレプリケートされ、セキュリティの脆弱性を自動的にスキャンできます。
ECRのプライベートリポジトリとパブリックリポジトリ
ECRは2種類のリポジトリをサポートします。Amazon ECRのプライベートリポジトリでは、イメージの取得にAWS認証が必要です。独自アプリケーションのイメージに適しています。アクセスはIAMポリシーとリポジトリのリソースポリシーによって制御します。ECR Public Gallery(public.ecr.aws)のパブリックリポジトリでは、インターネット上のどこからでも認証なしでイメージを取得できます。オープンソースのベースイメージ、公開ツール、AWS提供のイメージ(Lambdaベースイメージ、ECS最適化AMIイメージ)に適しています。パブリックリポジトリには無料の取得枠がありますが、認証されていないリクエストにはレート制限があります。
# Create a private ECR repository
aws ecr create-repository \
--repository-name 'myapp/backend' \
--image-scanning-configuration scanOnPush=true \
--image-tag-mutability IMMUTABLEDockerからECRへの認証
プライベートECRイメージをプッシュまたはプルするには、DockerがAWS認証情報を使って認証する必要があります。aws ecr get-login-passwordを使って一時認証トークンを取得し、それをdocker loginにパイプします。トークンの有効期間は12時間です。CI/CDパイプラインでは、プッシュの前にトークンを更新してください。ECSタスクエージェント、Lambda、EKSワーカーノードはIAMロールを使ってECRに自動認証するため、AWS環境で実行時にイメージを取得する際の手動ログインは不要です。
# Authenticate Docker CLI to ECR
aws ecr get-login-password --region us-east-1 | \
docker login \
--username AWS \
--password-stdin \
123456789012.dkr.ecr.us-east-1.amazonaws.comECRへのイメージのプッシュ
ECRにイメージをプッシュする標準的な手順は次のとおりです。(1) Dockerイメージをローカルでビルドする。(2) ECRリポジトリURI(形式:account.dkr.ecr.region.amazonaws.com/repo-name:tag)を使ってイメージにタグ付けする。(3) タグ付けしたイメージをプッシュする。ECRは各イメージレイヤーを個別に保存し、複数のイメージで共通するレイヤーを重複排除するため、ストレージコストを削減できます。イミュータブルタグを使うとタグの上書きを防止でき、デプロイしたイメージのバージョンを安定させ、監査可能にできます。
# Build, tag, and push
docker build -t myapp/backend .
docker tag myapp/backend \
123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp/backend:v1.2.3
docker push \
123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp/backend:v1.2.3イメージタグの可変性
IMMUTABLEタグを使うと、タグが別のイメージで上書きされるのを防げます。タグの可変性がIMMUTABLEの場合、既存のタグに新しいイメージをプッシュすると失敗するため、新しいタグを使う必要があります。これは本番環境のベストプラクティスです。:v1.2.3が常にまったく同じイメージダイジェストを参照することが保証され、信頼性の高いロールバックと監査が可能になります。MUTABLEタグは、開発ブランチや本番環境以外での利便性のための:latestタグにのみ使用してください。
脆弱性のイメージスキャン
プッシュ時スキャンを有効にすると、イメージのプッシュ時に既知のCVEを自動的にスキャンできます。ECRでは、Amazon Inspectorとの統合による拡張スキャン、またはオープンソースのClairスキャナーを利用した組み込みのBasic Scanningを使用します。拡張スキャンでは、プッシュ時だけでなく継続的なスキャンが行われ、OSパッケージと言語固有のパッケージ(Node.js、Python、Java)が対象になります。スキャン結果はECRコンソールで確認するか、EventBridgeの通知をセキュリティチームに送信して確認します。
# Enable enhanced scanning for a registry
aws ecr put-registry-scanning-configuration \
--scan-type ENHANCED \
--rules '[{"repositoryFilters": [{"filter": "*", "filterType": "WILDCARD"}], "scanFrequency": "CONTINUOUS_SCAN"}]'ライフサイクルポリシーによるイメージコストの管理
ECRでは、1か月あたりのGB単位でストレージ料金が発生します。管理しないと古いイメージが無期限に蓄積し、コストが増加します。ライフサイクルポリシーを使うと、ルールに基づいてイメージを自動的に期限切れにし、削除できます。たとえば、タグ付けされたリリースを最新の10個だけ残したり、7日より古いタグなしイメージを削除したりできます。ライフサイクルポリシーは毎日実行されます。コミットのたびに新しいイメージをプッシュするCI/CDパイプラインでは、毎週数百個のイメージが蓄積する可能性があるため、特に重要です。
aws ecr put-lifecycle-policy \
--repository-name 'myapp/backend' \
--lifecycle-policy-text '{
"rules": [
{
"rulePriority": 1,
"description": "Keep last 10 tagged images",
"selection": {"tagStatus": "tagged", "tagPrefixList": ["v"], "countType": "imageCountMoreThan", "countNumber": 10},
"action": {"type": "expire"}
},
{
"rulePriority": 2,
"description": "Delete untagged images after 7 days",
"selection": {"tagStatus": "untagged", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 7},
"action": {"type": "expire"}
}
]
}'クロスアカウントのイメージアクセス
Account AのECRリポジトリからAccount BのECS/EKS/Lambdaへイメージを取得するには、Account AのECRリポジトリにリポジトリポリシー(リソースベースポリシー)を設定し、Account BのIAMプリンシパルにecr:GetDownloadUrlForLayer、ecr:BatchGetImage、ecr:BatchCheckLayerAvailabilityの呼び出しを許可します。これによりアカウント間でイメージをコピーする必要がなくなり、イメージを一元管理しながら分散して利用できます。
マルチリージョンデプロイのためのECRレプリケーション
ECRレプリケーションは、プライマリレジストリから他のAWSリージョン(必要に応じて他のアカウント)にイメージを自動的にコピーします。別のリージョンのECSタスクがイメージを取得すると、ローカルのリージョンレジストリから取得するため、データ転送コストとイメージ取得のレイテンシーを削減できます。レジストリレベルでレプリケーションルールを設定し、レプリケートするリポジトリ、送信先のリージョンとアカウントを指定します。レプリケーションは非同期で、ほぼリアルタイムに行われます。
aws ecr put-replication-configuration \
--replication-configuration '{
"rules": [{
"destinations": [
{"region": "eu-west-1", "registryId": "123456789012"},
{"region": "ap-southeast-1", "registryId": "123456789012"}
],
"repositoryFilters": [{"filter": "prod/*", "filterType": "PREFIX_MATCH"}]
}]
}'ECRの暗号化
ECRはサーバー側の暗号化を使って、保存中のイメージを暗号化します。デフォルトではAWS管理キー(AWS_MANAGED_KEY)を使用します。さらに細かい制御と監査性が必要な場合は、カスタマーマネージドKMSキー(CMK)を設定します。CMKを使うと、キーのローテーションを制御でき、キーを無効化してアクセスを取り消せます。また、CloudTrailですべての復号操作を監査できます。規制への準拠(PCI-DSS、HIPAA、FedRAMP)で顧客管理の暗号化キーが必要な場合は、KMS暗号化を有効にしてください。
CI/CDパイプラインでECSとECRを使用する
ECRを使用するECSの完全なCI/CDパイプラインは次のようになります。(1) 開発者がコードをGitにプッシュする。(2) CodeBuildがDockerイメージをビルドし、コミットSHAタグを付けてECRにプッシュする。(3) CodePipelineが新しいイメージURIでECSタスク定義を更新する。(4) ECSがサービスのローリング更新を実行し、ECRから新しいイメージを取得する。ECSタスクはタスク実行ロールを使ってECRに自動認証するため、実行時のイメージ取得用にパイプラインで認証情報を管理する必要はありません。
クイックチェック
このレッスンで扱ったAWS Solutions Architect(SAA-C03)の概念について、理解度を確認します。
レッスンのまとめ
このレッスンでは、次のことを学びました。ECRプライベートリポジトリは、IAMでアクセスを制御したコンテナイメージ、 本番環境の安定性を保つイミュータブルタグ、Inspectorによる自動脆弱性スキャンを提供します。ライフサイクルポリシーは、古いイメージやタグなしイメージを自動的に期限切れにして、活発なCI/CD環境でのストレージコストを管理します。ECRレプリケーションは、マルチリージョンデプロイのために他のリージョンやアカウントへイメージをコピーし、取得時のレイテンシーを削減します。次は、ECSサービスのAuto Scalingとロードバランシングの統合について学びます。
よくある質問
「ECR:コンテナイメージの保存と取得」レッスンは無料ですか?
はい。「ECR:コンテナイメージの保存と取得」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。
「ECR:コンテナイメージの保存と取得」で何を学びますか?
DockerイメージをAmazon ECRにプッシュし、ライフサイクルポリシーで古いイメージを整理し、ECSタスクにイメージを安全にプルします。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AWS Solutions Architectを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ECR:コンテナイメージの保存と取得」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAWS Solutions Architectレッスンでコードを書いて実行できますか?
はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ECS クラスター、タスク定義、サービス
- EC2起動タイプとFargateの比較
- ECR:コンテナイメージの保存と取得
- ECSサービスのオートスケーリングとロードバランシング