AWS ECR にイメージを Push する方法

記事内に広告が含まれています。

AWS ECR (Elastic Container Registry) に Docker イメージをプッシュする方法について、詳細な手順を解説します。

目次

  1. 前提条件
  2. 基本的なワークフロー
  3. 詳細な手順
  4. トラブルシューティング
  5. ベストプラクティス

前提条件

必要なツールのインストール

  • 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へのイメージプッシュは以下の流れで行います:

  1. ECRリポジトリの作成(既存の場合は不要)
  2. Dockerイメージのビルド
  3. ECRへの認証
  4. イメージのタグ付け
  5. イメージのプッシュ

詳細な手順

1. ECRリポジトリの作成

AWS Management Consoleを使用する場合

  1. AWSコンソールにログイン
  2. ECRサービスを選択
  3. 「リポジトリの作成」をクリック
  4. リポジトリ名を入力(例: my-app
  5. 設定を確認して作成

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へのイメージプッシュは、適切な手順に従えばシンプルなプロセスです。重要なポイントは:

  1. 適切な認証: ECRへのログインを忘れずに
  2. 正しいタグ付け: ECRリポジトリURIを含むタグを使用
  3. 権限管理: 必要なIAMポリシーの適用
  4. セキュリティ: イメージスキャンとライフサイクルポリシーの活用

このガイドがAWS ECRを効果的に活用するための参考になれば幸いです。

タイトルとURLをコピーしました