AWS ECR (Elastic Container Registry) に Docker イメージをプッシュする方法について、詳細な手順を解説します。
目次
前提条件
必要なツールのインストール
- AWS CLI: AWSサービスと対話するためのコマンドラインツール
- Docker: コンテナイメージのビルドと管理
# macOS (Homebrew)
brew install awscli docker
# Ubuntu
sudo apt update
sudo apt install awscli docker.io
# Windows
# Docker Desktop と AWS CLI を公式サイトからインストール
AWS認証情報の設定
# AWS CLIの設定
aws configure
# 環境変数での設定(推奨)
export AWS_ACCESS_KEY_ID="your-access-key-id"
export AWS_SECRET_ACCESS_KEY="your-secret-access-key"
export AWS_DEFAULT_REGION="us-east-1"
基本的なワークフロー
ECRへのイメージプッシュは以下の流れで行います:
- ECRリポジトリの作成(既存の場合は不要)
- Dockerイメージのビルド
- ECRへの認証
- イメージのタグ付け
- イメージのプッシュ
詳細な手順
1. ECRリポジトリの作成
AWS Management Consoleを使用する場合
- AWSコンソールにログイン
- ECRサービスを選択
- 「リポジトリの作成」をクリック
- リポジトリ名を入力(例:
my-app) - 設定を確認して作成
AWS CLIを使用する場合
# リポジトリの作成
aws ecr create-repository --repository-name my-app --region us-east-1
# リポジトリの一覧表示
aws ecr describe-repositories --region us-east-1
2. Dockerイメージのビルド
サンプルのDockerfileを作成
# Dockerfile
FROM nginx:alpine
COPY . /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
イメージのビルド
# イメージをビルド
docker build -t my-app:latest .
# ビルドされたイメージの確認
docker images
3. ECRへの認証
ECRにプッシュする前に、DockerクライアントをECRに対して認証する必要があります。
# ECRの認証トークンを取得
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
注意: 123456789012はあなたのAWSアカウントIDに置き換えてください。
4. イメージのタグ付け
ビルドしたイメージにECRリポジトリのURIをタグとして付けます。
# アカウントIDとリポジトリURIの確認
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REGION=$(aws configure get region)
REPOSITORY_URI="${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/my-app"
# イメージにタグ付け
docker tag my-app:latest ${REPOSITORY_URI}:latest
# 追加でバージョンタグも付与(オプション)
docker tag my-app:latest ${REPOSITORY_URI}:v1.0.0
5. イメージのプッシュ
タグ付けしたイメージをECRにプッシュします。
# イメージをプッシュ
docker push ${REPOSITORY_URI}:latest
docker push ${REPOSITORY_URI}:v1.0.0
# プッシュの進捗を確認
docker push ${REPOSITORY_URI}:latest
6. プッシュの確認
# ECRのイメージをリスト表示
aws ecr list-images --repository-name my-app --region us-east-1
# イメージの詳細を確認
aws ecr describe-images --repository-name my-app --region us-east-1
自動化スクリプトの例
Bashスクリプト
#!/bin/bash
# 変数の設定
REPO_NAME="my-app"
REGION="us-east-1"
TAG="latest"
# アカウントIDの取得
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
# ECRリポジトリのURI
ECR_URI="${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/${REPO_NAME}"
# リポジトリの存在確認と作成
aws ecr describe-repositories --repository-names ${REPO_NAME} --region ${REGION} > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Creating repository: ${REPO_NAME}"
aws ecr create-repository --repository-name ${REPO_NAME} --region ${REGION}
fi
# ECRへの認証
echo "Authenticating with ECR..."
aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com
# イメージのビルド
echo "Building Docker image..."
docker build -t ${REPO_NAME}:${TAG} .
# イメージのタグ付け
echo "Tagging image..."
docker tag ${REPO_NAME}:${TAG} ${ECR_URI}:${TAG}
# イメージのプッシュ
echo "Pushing image to ECR..."
docker push ${ECR_URI}:${TAG}
echo "Image pushed successfully: ${ECR_URI}:${TAG}"
トラブルシューティング
よくあるエラーと解決方法
1. “no basic auth credentials” エラー
# 解決策: ECRへの再認証
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin your-account-id.dkr.ecr.us-east-1.amazonaws.com
2. “repository does not exist” エラー
# 解決策: リポジトリの作成
aws ecr create-repository --repository-name your-repo-name --region us-east-1
3. “access denied” エラー
# 解決策: IAMポリシーの確認と付与
# 以下のポリシーが必要:
# - ecr:GetAuthorizationToken
# - ecr:InitiateLayerUpload
# - ecr:UploadLayerPart
# - ecr:CompleteLayerUpload
# - ecr:BatchCheckLayerAvailability
# - ecr:PutImage
まとめ
AWS ECRへのイメージプッシュは、適切な手順に従えばシンプルなプロセスです。重要なポイントは:
- 適切な認証: ECRへのログインを忘れずに
- 正しいタグ付け: ECRリポジトリURIを含むタグを使用
- 権限管理: 必要なIAMポリシーの適用
- セキュリティ: イメージスキャンとライフサイクルポリシーの活用
このガイドがAWS ECRを効果的に活用するための参考になれば幸いです。
