PR

【初心者向け】AWS ECRリポジトリを完全複製するハンズオンガイド

はじめに

この記事では、AWS ECR(Elastic Container Registry)のリポジトリを「設定ごと完全に複製」する方法を、初心者の方にも分かりやすく解説します。実際に手を動かしながら学べるハンズオン形式で進めていきます。

なぜECRリポジトリの複製が必要なのか?

実際の開発現場では、以下のような場面でリポジトリの複製が必要になります:

  • バックアップ作成: 本番環境のイメージを安全な場所に保管
  • 環境分離: 開発・ステージング・本番で同じイメージを管理
  • リージョン移行: 災害対策やパフォーマンス向上のため
  • 組織変更: 部署移動やプロジェクト移管時のデータ移行

基礎知識:ECRとは?

ECR(Elastic Container Registry)とは

AWSが提供するDockerコンテナイメージの保管庫(レジストリ)です。簡単に言うと、「Dockerイメージを安全に保存・管理できるクラウドサービス」です。

重要な用語解説

📦 コンテナイメージ

  • アプリケーションとその実行環境をパッケージ化したもの
  • 例:Webアプリ + Node.js + 必要なライブラリ

🏪 リポジトリ

  • 同じアプリケーションの異なるバージョンを管理する場所
  • 例:my-web-appリポジトリにv1.0, v1.1, v2.0などを保存

🏷️ タグ

  • イメージのバージョンを識別するラベル
  • 例:latest, v1.0, productionなど

🔐 IAM権限

  • AWSリソースへのアクセス権限を管理する仕組み
  • 「誰が」「何を」「どこまで」できるかを定義

事前準備

必要なツール

1. AWS CLI

# インストール確認
aws --version

# 未インストールの場合は公式サイトからダウンロード
# https://aws.amazon.com/cli/

2. Docker

# インストール確認
docker --version

# 動作確認
docker run hello-world

3. PowerShell(Windows)または bash(Mac/Linux)

# PowerShell確認(Windows)
$PSVersionTable.PSVersion

# bash確認(Mac/Linux)
bash --version

AWS設定の確認

プロファイル設定の確認

# 設定済みプロファイルの一覧表示
aws configure list-profiles

# 特定プロファイルの設定確認
aws configure list --profile your-profile-name

アカウントIDの確認

# 現在のアカウントID取得
aws sts get-caller-identity --profile your-profile-name

必要なIAM権限の設定

なぜIAM権限が必要?

ECRの操作には適切な権限が必要です。セキュリティ上、最小限の権限のみを付与することが重要です。

必要な権限一覧

以下のIAMポリシーをユーザーまたはロールに付与してください:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:GetLifecyclePolicy",
                "ecr:GetRepositoryPolicy",
                "ecr:CreateRepository",
                "ecr:PutLifecyclePolicy",
                "ecr:SetRepositoryPolicy",
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:BatchCheckLayerAvailability"
            ],
            "Resource": "*"
        }
    ]
}

権限設定手順

  1. AWS Management Consoleにログイン
  2. IAMサービスに移動
  3. 「ポリシー」→「ポリシーの作成」
  4. 上記JSONを貼り付け
  5. ポリシー名:ECR-Clone-Policyで保存
  6. ユーザーまたはロールにポリシーをアタッチ

ハンズオン:実際にリポジトリを複製してみよう

ステップ1:現在のリポジトリ確認

まず、複製元となるリポジトリの状況を確認しましょう。

# リポジトリ一覧の確認
aws ecr describe-repositories --profile your-profile-name --region ap-northeast-1

# 特定リポジトリの詳細確認
aws ecr describe-repositories --repository-names "my-web-app" --profile your-profile-name --region ap-northeast-1

💡 ここで確認できること

  • リポジトリ名
  • 作成日時
  • イメージの暗号化設定
  • スキャン設定

ステップ2:複製スクリプトの準備

以下のスクリプトをコピーして、ecr-clone.ps1(Windows)またはecr-clone.sh(Mac/Linux)として保存してください。

Windows用(PowerShell)

# ==================================================
# ECR リポジトリ :latest タグのみ複製スクリプト
# ==================================================

# 🔧 設定エリア:あなたの環境に合わせて変更してください
$awsprofile = "default"                    # AWSプロファイル名(通常は"default")
$region = "ap-northeast-1"              # AWSリージョン(東京リージョン)
$accountId = "123456789012"             # あなたのAWSアカウントID(12桁の数字)

# 📋 複製対象の設定:元のリポジトリ名 → 新しいリポジトリ名
$repoPairs = @(
    @{ Source = "my-web-app"; Target = "my-web-app-backup" },
    @{ Source = "my-api-server"; Target = "my-api-server-backup" }
)

Write-Host "🚀 ECRリポジトリ :latest タグのみ複製ツールを開始します!" -ForegroundColor Green
Write-Host "これから以下の作業を行います:" -ForegroundColor Cyan
Write-Host "1. ECRへのログイン" -ForegroundColor White
Write-Host "2. 元リポジトリの設定取得" -ForegroundColor White
Write-Host "3. 新リポジトリの作成" -ForegroundColor White
Write-Host "4. :latest タグイメージの複製" -ForegroundColor White
Write-Host "5. ポリシーの複製" -ForegroundColor White

# --- ステップ1: ECRにログイン ---
Write-Host "`n🔐 ステップ1: ECRにログインしています..." -ForegroundColor Cyan
try {
    aws ecr get-login-password --region $region --profile $awsprofile |
        docker login --username AWS --password-stdin "$accountId.dkr.ecr.$region.amazonaws.com"
    Write-Host "✅ ECRログイン成功!" -ForegroundColor Green
} catch {
    Write-Host "❌ ECRログインに失敗しました" -ForegroundColor Red
    Write-Host "確認事項:" -ForegroundColor Yellow
    Write-Host "- AWS CLIが正しく設定されているか" -ForegroundColor White
    Write-Host "- Dockerが起動しているか" -ForegroundColor White
    Write-Host "- アカウントIDが正しいか" -ForegroundColor White
    exit 1
}

# --- ステップ2〜5: リポジトリごとの処理 ---
foreach ($pair in $repoPairs) {
    $srcRepo = $pair.Source
    $dstRepo = $pair.Target
    $srcUri = "$accountId.dkr.ecr.$region.amazonaws.com/$srcRepo"
    $dstUri = "$accountId.dkr.ecr.$region.amazonaws.com/$dstRepo"
    
    Write-Host "`n📦 処理中のリポジトリ: $srcRepo → $dstRepo" -ForegroundColor Cyan
    Write-Host ("=" * 60) -ForegroundColor Gray
    
    # 元リポジトリの設定取得
    Write-Host "🔍 ステップ2: 元リポジトリの設定を取得中..." -ForegroundColor Cyan
    try {
        $srcConfigJson = aws ecr describe-repositories --repository-names $srcRepo --region $region --profile $awsprofile 2>$null
        if ($LASTEXITCODE -ne 0) {
            Write-Host "❌ リポジトリが見つかりません: $srcRepo" -ForegroundColor Red
            Write-Host "💡 リポジトリ名やリージョンを確認してください" -ForegroundColor Yellow
            continue
        }
        $srcConfig = $srcConfigJson | ConvertFrom-Json
        $repoSetting = $srcConfig.repositories[0]
        
        $encryptionType = if ($repoSetting.encryptionConfiguration) { $repoSetting.encryptionConfiguration.encryptionType } else { $null }
        $tagMutability = $repoSetting.imageTagMutability
        $scanOnPush = if ($repoSetting.imageScanningConfiguration) { $repoSetting.imageScanningConfiguration.scanOnPush } else { $false }
        
        Write-Host "✅ 設定取得完了!設定内容:" -ForegroundColor Green
        Write-Host "   🔒 暗号化: $encryptionType" -ForegroundColor White
        Write-Host "   🏷️ タグ変更可能性: $tagMutability" -ForegroundColor White
        Write-Host "   🔍 プッシュ時スキャン: $scanOnPush" -ForegroundColor White
    } catch {
        Write-Host "❌ リポジトリ設定の取得に失敗: $srcRepo" -ForegroundColor Red
        Write-Host "エラー: $($_.Exception.Message)" -ForegroundColor Red
        continue
    }
    
    # 新リポジトリ作成
    Write-Host "`n🏗️ ステップ3: 新リポジトリ作成中..." -ForegroundColor Cyan
    try {
        $createCmd = @(
            "aws", "ecr", "create-repository",
            "--repository-name", $dstRepo,
            "--region", $region,
            "--profile", $awsprofile,
            "--image-tag-mutability", $tagMutability
        )
        if ($encryptionType) {
            $createCmd += "--encryption-configuration"
            $createCmd += "encryptionType=$encryptionType"
        }
        if ($null -ne $scanOnPush) {
            $createCmd += "--image-scanning-configuration"
            $createCmd += "scanOnPush=$scanOnPush"
        }
        & $createCmd[0] $createCmd[1..($createCmd.Length - 1)] 2>$null
        
        if ($LASTEXITCODE -eq 0) {
            Write-Host "✅ 新リポジトリを作成しました: $dstRepo" -ForegroundColor Green
        } else {
            Write-Host "ℹ️ リポジトリは既に存在しています: $dstRepo" -ForegroundColor Yellow
        }
    } catch {
        Write-Host "⚠️ リポジトリ作成中にエラー発生しましたが続行します" -ForegroundColor Yellow
        Write-Host "エラー: $($_.Exception.Message)" -ForegroundColor Yellow
    }
    
    # ライフサイクルポリシー複製
    Write-Host "`n📋 ライフサイクルポリシーをチェック中..." -ForegroundColor Cyan
    try {
        $lifecyclePolicyJson = aws ecr get-lifecycle-policy --repository-name $srcRepo --region $region --profile $awsprofile 2>$null
        if ($LASTEXITCODE -eq 0) {
            $lifecyclePolicy = $lifecyclePolicyJson | ConvertFrom-Json
            $policyText = $lifecyclePolicy.lifecyclePolicyText
            
            aws ecr put-lifecycle-policy --repository-name $dstRepo --lifecycle-policy-text $policyText --region $region --profile $awsprofile | Out-Null
            
            Write-Host "✅ ライフサイクルポリシーを複製しました" -ForegroundColor Green
            Write-Host "💡 ライフサイクルポリシーは古いイメージの自動削除ルールです" -ForegroundColor Cyan
        } else {
            Write-Host "ℹ️ ライフサイクルポリシーは設定されていません" -ForegroundColor White
        }
    } catch {
        Write-Host "ℹ️ ライフサイクルポリシー取得エラー: $($_.Exception.Message)" -ForegroundColor White
    }
    
    # リポジトリポリシー複製
    Write-Host "`n🔐 リポジトリポリシーをチェック中..." -ForegroundColor Cyan
    try {
        $repoPolicyJson = aws ecr get-repository-policy --repository-name $srcRepo --region $region --profile $awsprofile 2>$null
        if ($LASTEXITCODE -eq 0) {
            $repoPolicy = $repoPolicyJson | ConvertFrom-Json
            $policyText = $repoPolicy.policyText
            
            aws ecr set-repository-policy --repository-name $dstRepo --policy-text $policyText --region $region --profile $awsprofile | Out-Null
            
            Write-Host "✅ リポジトリポリシーを複製しました" -ForegroundColor Green
            Write-Host "💡 リポジトリポリシーはアクセス権管理のルールです" -ForegroundColor Cyan
        } else {
            Write-Host "ℹ️ リポジトリポリシーは設定されていません" -ForegroundColor White
        }
    } catch {
        Write-Host "ℹ️ リポジトリポリシー取得エラー: $($_.Exception.Message)" -ForegroundColor White
    }
    
    # イメージ複製 (:latestのみ)
    Write-Host "`n🚚 ステップ4: :latest タグイメージ複製を開始します..." -ForegroundColor Cyan
    try {
        $tag = "latest"
        $srcImageFull = "$srcUri`:$tag"
        $dstImageFull = "$dstUri`:$tag"
        
        Write-Host "  🔄 :latest イメージを複製中: $srcImageFull → $dstImageFull" -ForegroundColor White
        
        # プル
        Write-Host "    ⬇️ プル中..." -ForegroundColor Gray
        docker pull $srcImageFull
        if ($LASTEXITCODE -ne 0) {
            Write-Host "    ❌ プル失敗: $srcImageFull" -ForegroundColor Red
            continue
        }
        
        # タグ付け
        Write-Host "    🏷️ タグ付け中..." -ForegroundColor Gray
        docker tag $srcImageFull $dstImageFull
        
        # プッシュ
        Write-Host "    ⬆️ プッシュ中..." -ForegroundColor Gray
        docker push $dstImageFull
        
        if ($LASTEXITCODE -eq 0) {
            Write-Host "    ✅ 複製完了: $tag" -ForegroundColor Green
        } else {
            Write-Host "    ❌ プッシュ失敗: $dstImageFull" -ForegroundColor Red
        }
        
        Write-Host "✅ :latest イメージ複製が完了しました!" -ForegroundColor Green
    } catch {
        Write-Host "❌ イメージ複製中にエラーが発生しました: $($_.Exception.Message)" -ForegroundColor Red
    }
    
    Write-Host ("=" * 60) -ForegroundColor Gray
}

Write-Host "`n🎉 全リポジトリの複製処理が完了しました!" -ForegroundColor Green
Write-Host "確認コマンド実行→   aws ecr describe-repositories --region $region --profile $awsprofile" -ForegroundColor White

Linux用

#!/bin/bash

# ==================================================
# ECR リポジトリ :latest タグのみ複製スクリプト (Linux版)
# ==================================================

# 🔧 設定エリア:あなたの環境に合わせて変更してください
AWS_PROFILE="default" # AWSプロファイル名(通常は"default")
REGION="ap-northeast-1" # AWSリージョン(東京リージョン)
ACCOUNT_ID="123456789012" # あなたのAWSアカウントID(12桁の数字)

# 📋 複製対象の設定:元のリポジトリ名 → 新しいリポジトリ名
# 複数のリポジトリを設定する場合は、以下の形式で追加してください
declare -A REPO_PAIRS=(
["my-web-app"]="my-web-app-backup"
["my-api-server"]="my-api-server-backup"
)

# 色付きメッセージ関数
print_green() { echo -e "\033[32m$1\033[0m"; }
print_cyan() { echo -e "\033[36m$1\033[0m"; }
print_yellow() { echo -e "\033[33m$1\033[0m"; }
print_red() { echo -e "\033[31m$1\033[0m"; }
print_white() { echo -e "\033[37m$1\033[0m"; }
print_gray() { echo -e "\033[90m$1\033[0m"; }

# 必要なコマンドの存在確認
check_requirements() {
local missing_commands=()

if ! command -v aws &> /dev/null; then
missing_commands+=("aws-cli")
fi

if ! command -v docker &> /dev/null; then
missing_commands+=("docker")
fi

if ! command -v jq &> /dev/null; then
missing_commands+=("jq")
fi

if [ ${#missing_commands[@]} -ne 0 ]; then
print_red "❌ 以下のコマンドがインストールされていません:"
for cmd in "${missing_commands[@]}"; do
print_white " - $cmd"
done
print_yellow "必要なパッケージをインストールしてから再実行してください。"
exit 1
fi
}

print_green "🚀 ECRリポジトリ :latest タグのみ複製ツールを開始します!"
print_cyan "これから以下の作業を行います:"
print_white "1. 必要なツールの確認"
print_white "2. ECRへのログイン"
print_white "3. 元リポジトリの設定取得"
print_white "4. 新リポジトリの作成"
print_white "5. :latest タグイメージの複製"
print_white "6. ポリシーの複製"

# --- ステップ1: 必要なコマンドの確認 ---
print_cyan "\n🔍 ステップ1: 必要なツールを確認しています..."
check_requirements
print_green "✅ 必要なツールが揃っています!"

# --- ステップ2: ECRにログイン ---
print_cyan "\n🔐 ステップ2: ECRにログインしています..."
if aws ecr get-login-password --region "$REGION" --profile "$AWS_PROFILE" | \
docker login --username AWS --password-stdin "$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com"; then
print_green "✅ ECRログイン成功!"
else
print_red "❌ ECRログインに失敗しました"
print_yellow "確認事項:"
print_white "- AWS CLIが正しく設定されているか"
print_white "- Dockerが起動しているか"
print_white "- アカウントIDが正しいか"
exit 1
fi

# --- ステップ3〜6: リポジトリごとの処理 ---
for SRC_REPO in "${!REPO_PAIRS[@]}"; do
DST_REPO="${REPO_PAIRS[$SRC_REPO]}"
SRC_URI="$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$SRC_REPO"
DST_URI="$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$DST_REPO"

print_cyan "\n📦 処理中のリポジトリ: $SRC_REPO → $DST_REPO"
print_gray "============================================================"

# 元リポジトリの設定取得
print_cyan "🔍 ステップ3: 元リポジトリの設定を取得中..."

SRC_CONFIG_JSON=$(aws ecr describe-repositories \
--repository-names "$SRC_REPO" \
--region "$REGION" \
--profile "$AWS_PROFILE" 2>/dev/null)

if [ $? -ne 0 ]; then
print_red "❌ リポジトリが見つかりません: $SRC_REPO"
print_yellow "💡 リポジトリ名やリージョンを確認してください"
continue
fi

# jqを使用してJSON解析
ENCRYPTION_TYPE=$(echo "$SRC_CONFIG_JSON" | jq -r '.repositories[0].encryptionConfiguration.encryptionType // "null"')
TAG_MUTABILITY=$(echo "$SRC_CONFIG_JSON" | jq -r '.repositories[0].imageTagMutability')
SCAN_ON_PUSH=$(echo "$SRC_CONFIG_JSON" | jq -r '.repositories[0].imageScanningConfiguration.scanOnPush // false')

print_green "✅ 設定取得完了!設定内容:"
print_white " 🔒 暗号化: $ENCRYPTION_TYPE"
print_white " 🏷️ タグ変更可能性: $TAG_MUTABILITY"
print_white " 🔍 プッシュ時スキャン: $SCAN_ON_PUSH"

# 新リポジトリ作成
print_cyan "\n🏗️ ステップ4: 新リポジトリ作成中..."

CREATE_CMD="aws ecr create-repository --repository-name $DST_REPO --region $REGION --profile $AWS_PROFILE --image-tag-mutability $TAG_MUTABILITY"

if [ "$ENCRYPTION_TYPE" != "null" ]; then
CREATE_CMD="$CREATE_CMD --encryption-configuration encryptionType=$ENCRYPTION_TYPE"
fi

if [ "$SCAN_ON_PUSH" != "false" ]; then
CREATE_CMD="$CREATE_CMD --image-scanning-configuration scanOnPush=$SCAN_ON_PUSH"
fi

if eval "$CREATE_CMD" 2>/dev/null; then
print_green "✅ 新リポジトリを作成しました: $DST_REPO"
else
print_yellow "ℹ️ リポジトリは既に存在しています: $DST_REPO"
fi

# ライフサイクルポリシー複製
print_cyan "\n📋 ライフサイクルポリシーをチェック中..."

LIFECYCLE_POLICY_JSON=$(aws ecr get-lifecycle-policy \
--repository-name "$SRC_REPO" \
--region "$REGION" \
--profile "$AWS_PROFILE" 2>/dev/null)

if [ $? -eq 0 ]; then
POLICY_TEXT=$(echo "$LIFECYCLE_POLICY_JSON" | jq -r '.lifecyclePolicyText')

if aws ecr put-lifecycle-policy \
--repository-name "$DST_REPO" \
--lifecycle-policy-text "$POLICY_TEXT" \
--region "$REGION" \
--profile "$AWS_PROFILE" >/dev/null; then
print_green "✅ ライフサイクルポリシーを複製しました"
print_cyan "💡 ライフサイクルポリシーは古いイメージの自動削除ルールです"
fi
else
print_white "ℹ️ ライフサイクルポリシーは設定されていません"
fi

# リポジトリポリシー複製
print_cyan "\n🔐 リポジトリポリシーをチェック中..."

REPO_POLICY_JSON=$(aws ecr get-repository-policy \
--repository-name "$SRC_REPO" \
--region "$REGION" \
--profile "$AWS_PROFILE" 2>/dev/null)

if [ $? -eq 0 ]; then
POLICY_TEXT=$(echo "$REPO_POLICY_JSON" | jq -r '.policyText')

if aws ecr set-repository-policy \
--repository-name "$DST_REPO" \
--policy-text "$POLICY_TEXT" \
--region "$REGION" \
--profile "$AWS_PROFILE" >/dev/null; then
print_green "✅ リポジトリポリシーを複製しました"
print_cyan "💡 リポジトリポリシーはアクセス権管理のルールです"
fi
else
print_white "ℹ️ リポジトリポリシーは設定されていません"
fi

# イメージ複製 (:latestのみ)
print_cyan "\n🚚 ステップ5: :latest タグイメージ複製を開始します..."

TAG="latest"
SRC_IMAGE_FULL="$SRC_URI:$TAG"
DST_IMAGE_FULL="$DST_URI:$TAG"

print_white " 🔄 :latest イメージを複製中: $SRC_IMAGE_FULL → $DST_IMAGE_FULL"

# プル
print_gray " ⬇️ プル中..."
if ! docker pull "$SRC_IMAGE_FULL"; then
print_red " ❌ プル失敗: $SRC_IMAGE_FULL"
continue
fi

# タグ付け
print_gray " 🏷️ タグ付け中..."
docker tag "$SRC_IMAGE_FULL" "$DST_IMAGE_FULL"

# プッシュ
print_gray " ⬆️ プッシュ中..."
if docker push "$DST_IMAGE_FULL"; then
print_green " ✅ 複製完了: $TAG"
print_green "✅ :latest イメージ複製が完了しました!"
else
print_red " ❌ プッシュ失敗: $DST_IMAGE_FULL"
fi

print_gray "============================================================"
done

print_green "\n🎉 全リポジトリの複製処理が完了しました!"
print_white "確認コマンド実行→ aws ecr describe-repositories --region $REGION --profile $AWS_PROFILE"

ステップ3:設定値の変更

スクリプトを開いて、以下の部分をあなたの環境に合わせて変更してください:

# 🔧 ここを変更してください
$profile = "default"                    # あなたのAWSプロファイル名
$region = "ap-northeast-1"              # 使用するAWSリージョン
$accountId = "123456789012"             # あなたのAWSアカウントID

# 📋 複製したいリポジトリを指定
$repoPairs = @(
    @{ Source = "既存のリポジトリ名"; Target = "新しいリポジトリ名" }
)

設定値の確認方法

アカウントIDの確認

aws sts get-caller-identity --query Account --output text

プロファイル名の確認

aws configure list-profiles

既存リポジトリの確認

aws ecr describe-repositories --query 'repositories[].repositoryName' --output table

ステップ4:スクリプトの実行

Windows(PowerShell)での実行

# PowerShellを管理者として実行
# スクリプトファイルがある場所に移動
cd C:\path\to\your\script

# 実行ポリシーの確認(必要に応じて)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# スクリプト実行
.\ecr-clone.ps1

Mac/Linux(bash)での実行

# ターミナルを開く
# スクリプトファイルがある場所に移動
cd /path/to/your/script

# 実行権限を付与
chmod +x ecr-clone.sh

# スクリプト実行
./ecr-clone.sh

ステップ5:実行結果の確認

スクリプト実行中に表示される情報を確認しましょう:

✅ 正常な場合の表示例

🚀 ECRリポジトリ完全複製ツールを開始します!
🔐 ステップ1: ECRにログインしています...
✅ ECRログイン成功!

📦 処理中のリポジトリ: my-web-app → my-web-app-backup
🔍 ステップ2: 元リポジトリの設定を取得中...
✅ 設定取得完了!以下の設定で複製します:
   🔒 暗号化設定: AES256
   🏷️ タグ変更可能性: MUTABLE
   🔍 プッシュ時スキャン: true

❌ エラーが発生した場合

❌ ECRログインに失敗しました
確認事項:
- AWS CLIが正しく設定されているか
- Dockerが起動しているか
- アカウントIDが正しいか

よくあるエラーと解決方法

🚨 エラー1: 認証に失敗する

Error response from daemon: unauthorized

原因と解決法

  • AWS CLIの設定を確認:aws configure list
  • 正しいプロファイルを指定しているか確認
  • IAM権限が正しく設定されているか確認

🚨 エラー2: リポジトリが見つからない

RepositoryNotFoundException

原因と解決法

  • リポジトリ名の綴りを確認
  • 正しいリージョンを指定しているか確認
  • リポジトリが実際に存在するか確認:aws ecr describe-repositories

🚨 エラー3: ディスク容量不足

No space left on device

原因と解決法

  • 不要なDockerイメージを削除:docker system prune -a
  • ディスクの空き容量を確保
  • 一度に処理するリポジトリ数を減らす

🚨 エラー4: 権限不足

AccessDeniedException

原因と解決法

  • 必要なIAM権限が付与されているか確認
  • 特にecr:CreateRepository権限を確認
  • IAMポリシーの設定を見直す

実行後の確認作業

AWS Management Consoleでの確認

  1. ECRサービスに移動
    • AWS Management Console → ECR
  2. リポジトリ一覧で確認
    • 新しいリポジトリが作成されているか
    • イメージが正しく複製されているか
  3. 設定の確認
    • 暗号化設定
    • スキャン設定
    • ライフサイクルポリシー

コマンドでの確認

# 新しいリポジトリの確認
aws ecr describe-repositories --repository-names "your-new-repo-name"

# イメージ一覧の確認
aws ecr list-images --repository-name "your-new-repo-name"

# イメージの詳細確認
aws ecr describe-images --repository-name "your-new-repo-name"

セキュリティのベストプラクティス

🔐 認証情報の管理

  • AWS CLIの認証情報をスクリプトに直接記載しない
  • IAMロールの使用を推奨
  • 定期的なアクセスキーのローテーション

🛡️ 権限の最小化

  • 必要最小限のIAM権限のみを付与
  • リソースベースの権限制限を活用
  • 定期的な権限の見直し

📊 監査とログ

  • CloudTrailでAPI呼び出しを記録
  • ECRのアクセスログを監視
  • 不正なアクセスの検知

まとめ

このハンズオンガイドを通じて、以下のことを学びました:

📚 学んだこと

  • ECRの基本概念: リポジトリ、イメージ、タグの関係
  • 完全複製の意味: 設定やポリシーも含めた複製
  • AWS CLIとDockerの連携: 認証からイメージ操作まで
  • エラーハンドリング: よくあるエラーと対処法

🎯 実践的なスキル

  • ECRリポジトリの設定確認方法
  • PowerShell/bashスクリプトの実行
  • AWSサービス間の権限管理
  • トラブルシューティング手法

🚀 次のステップ

  1. 自動化の検討: CI/CDパイプラインへの組み込み
  2. 監視の強化: CloudWatchアラームの設定
  3. コスト最適化: 不要なイメージの定期削除
  4. セキュリティ強化: イメージスキャンの活用

ECRリポジトリの完全複製は、本番環境の運用において重要なスキルです。この記事で学んだ内容を基に、安全で確実なコンテナイメージ管理を実践してください。

🔗 参考資料

質問やフィードバックがありましたら、お気軽にコメントでお知らせください!

コメント

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