はじめに

コンテナ開発を進める中で、ビルドしたイメージをどこに保存し、どのようにデプロイ環境へ配布するかは重要な課題です。Docker Hubなどのパブリックレジストリは手軽に利用できますが、企業のプロダクション環境では、アクセス制御やセキュリティの観点からプライベートなレジストリが求められます。

Amazon ECR(Elastic Container Registry)は、AWSが提供するフルマネージドなコンテナレジストリサービスです。本記事では、ECRの基本機能からリポジトリの作成、イメージのプッシュ/プル、そして権限管理とセキュリティ設定まで、実践的な手順を解説します。

この記事を読むことで、以下のことが理解できるようになります。

  • ECRの特徴とDocker Hubなど他のレジストリとの違い
  • AWS CLIとマネジメントコンソールによるリポジトリ作成手順
  • コンテナイメージのプッシュとプルの具体的なコマンド
  • IAMポリシーとリポジトリポリシーによるアクセス制御
  • イメージスキャンとライフサイクルポリシーによるセキュリティ強化

ECRの概要とメリット

ECRとは

Amazon ECRは、Dockerコンテナイメージを保存、管理、デプロイするためのAWSマネージドサービスです。AWS環境との統合が深く、ECS、EKS、Fargate、App Runnerといったコンテナサービスとシームレスに連携できます。

flowchart LR
    subgraph Development["開発環境"]
        Dev["開発者"]
        Docker["Docker CLI"]
    end
    
    subgraph ECR["Amazon ECR"]
        Registry["プライベートレジストリ"]
        Repo1["リポジトリA"]
        Repo2["リポジトリB"]
        Registry --> Repo1
        Registry --> Repo2
    end
    
    subgraph Runtime["実行環境"]
        ECS["Amazon ECS"]
        EKS["Amazon EKS"]
        Fargate["AWS Fargate"]
    end
    
    Dev --> Docker
    Docker -->|push| Registry
    Registry -->|pull| ECS
    Registry -->|pull| EKS
    Registry -->|pull| Fargate

ECRの主なメリット

ECRを採用する主なメリットは以下の通りです。

メリット 説明
フルマネージド インフラ管理不要で、スケーラビリティと可用性をAWSが担保
AWS統合 IAM、CloudTrail、EventBridgeなどAWSサービスとネイティブ連携
セキュリティ 保存時の暗号化、転送時のTLS暗号化、脆弱性スキャン機能を標準提供
高可用性 複数のAZにイメージを自動複製し、99.9%の可用性を実現
低レイテンシ 同一リージョン内のAWSサービスからのプルは高速かつ無料

プライベートリポジトリとパブリックリポジトリ

ECRには2種類のリポジトリタイプがあります。

プライベートリポジトリ

組織内でのみ使用するイメージを保存します。IAMによるアクセス制御が適用され、認証なしではアクセスできません。企業のプロダクション環境では、ほとんどの場合このタイプを使用します。

パブリックリポジトリ(ECR Public)

オープンソースプロジェクトなど、誰でもプルできるイメージを公開する場合に使用します。Docker Hubの代替として利用でき、AWSアカウントで認証すれば月5TBまで無料で転送できます。

料金体系

ECRの料金は、ストレージ使用量とデータ転送量に基づいて計算されます。

項目 料金(東京リージョン)
ストレージ 0.10 USD/GB/月
データ転送(同一リージョン内) 無料
データ転送(リージョン外へ) 0.09 USD/GB〜
無料利用枠 500 MB/月(プライベート、12か月間)

同一リージョン内のECS、EKS、Fargateへのイメージプルは無料のため、実質的なコストはストレージ料金のみとなるケースが多いです。

リポジトリ作成手順

前提条件

ECRを操作するには、以下の環境が必要です。

  • AWS CLIがインストールされ、認証情報が設定済み
  • Dockerがインストールされている
  • ECRに対する操作権限を持つIAMユーザーまたはロール

IAMユーザーに必要な最小権限については、後述の「権限管理とセキュリティ」セクションで解説します。

マネジメントコンソールでの作成

AWSマネジメントコンソールからECRリポジトリを作成する手順は以下の通りです。

  1. AWSマネジメントコンソールにログインし、「ECR」を検索してサービス画面を開く
  2. 左メニューの「Repositories」をクリック
  3. 「リポジトリを作成」ボタンをクリック
  4. 以下の設定を入力
設定項目 推奨値 説明
可視性 プライベート 組織内利用の場合
リポジトリ名 my-app 小文字、数字、ハイフン、スラッシュが使用可能
タグのイミュータビリティ 有効 同一タグの上書きを防止
プッシュ時にスキャン 有効 脆弱性の自動検出
暗号化設定 AES-256 デフォルトで十分な場合が多い
  1. 「リポジトリを作成」をクリックして完了

AWS CLIでの作成

AWS CLIを使用してリポジトリを作成する場合は、以下のコマンドを実行します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 基本的なリポジトリ作成
aws ecr create-repository \
  --repository-name my-app \
  --region ap-northeast-1

# 推奨設定を含む作成
aws ecr create-repository \
  --repository-name my-app \
  --region ap-northeast-1 \
  --image-tag-mutability IMMUTABLE \
  --image-scanning-configuration scanOnPush=true \
  --encryption-configuration encryptionType=AES256

作成されたリポジトリの情報を確認するには、以下のコマンドを使用します。

1
2
3
4
5
6
7
# リポジトリ一覧の取得
aws ecr describe-repositories --region ap-northeast-1

# 特定のリポジトリ情報を取得
aws ecr describe-repositories \
  --repository-names my-app \
  --region ap-northeast-1

実行結果の例は以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{
    "repositories": [
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/my-app",
            "registryId": "123456789012",
            "repositoryName": "my-app",
            "repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app",
            "createdAt": "2026-01-25T10:00:00+09:00",
            "imageTagMutability": "IMMUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": true
            },
            "encryptionConfiguration": {
                "encryptionType": "AES256"
            }
        }
    ]
}

イメージのプッシュとプル

ECRへの認証

ECRにイメージをプッシュまたはプルするには、まずDockerクライアントをECRに認証する必要があります。認証トークンは12時間有効です。

1
2
3
4
# ECRへのログイン(リージョンとアカウントIDを指定)
aws ecr get-login-password --region ap-northeast-1 | \
  docker login --username AWS --password-stdin \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

123456789012の部分は、自身のAWSアカウントIDに置き換えてください。アカウントIDは以下のコマンドで確認できます。

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

認証が成功すると、「Login Succeeded」というメッセージが表示されます。

イメージのプッシュ

ローカルでビルドしたDockerイメージをECRにプッシュする手順は以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1. ローカルでイメージをビルド
docker build -t my-app:v1.0.0 .

# 2. ECRのリポジトリURIでタグ付け
docker tag my-app:v1.0.0 \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.0.0

# 3. ECRにプッシュ
docker push \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.0.0

プッシュが完了したら、リポジトリ内のイメージを確認できます。

1
2
3
4
# リポジトリ内のイメージ一覧を取得
aws ecr list-images \
  --repository-name my-app \
  --region ap-northeast-1

イメージのプル

ECRからイメージをプルする手順は以下の通りです。認証が済んでいれば、通常のdocker pullコマンドと同様に実行できます。

1
2
3
4
5
6
7
# ECRからイメージをプル
docker pull \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.0.0

# プルしたイメージでコンテナを起動
docker run -d -p 8080:80 \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.0.0

タグ付けのベストプラクティス

コンテナイメージのタグ付けは、運用の効率性とトレーサビリティに大きく影響します。

タグ形式 用途
セマンティックバージョン v1.2.3 リリースバージョン管理
Gitコミットハッシュ abc1234 ビルドの追跡
ビルド番号 build-456 CI/CDパイプラインとの連携
日付 2026-01-25 日次ビルドの識別

latestタグの使用は本番環境では推奨されません。どのバージョンがデプロイされているか不明確になり、ロールバックが困難になるためです。

権限管理とセキュリティ

IAMポリシーによるアクセス制御

ECRへのアクセスは、IAMポリシーで制御します。用途に応じた最小権限の原則に基づいたポリシー設計が重要です。

読み取り専用アクセス(プル用)

ECSタスクロールやEC2インスタンスプロファイルに付与する、イメージのプルのみを許可するポリシーです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ],
            "Resource": "arn:aws:ecr:ap-northeast-1:123456789012:repository/my-app"
        },
        {
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}

プッシュとプル両方のアクセス(CI/CD用)

CI/CDパイプラインでイメージをビルド・プッシュするための権限です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload"
            ],
            "Resource": "arn:aws:ecr:ap-northeast-1:123456789012:repository/my-app"
        },
        {
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}

管理者アクセス

リポジトリの作成・削除を含む全ての操作を許可するポリシーです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ecr:*",
            "Resource": "*"
        }
    ]
}

リポジトリポリシーによるクロスアカウントアクセス

複数のAWSアカウント間でイメージを共有する場合は、リポジトリポリシーを使用します。

1
2
3
4
5
# リポジトリポリシーの設定
aws ecr set-repository-policy \
  --repository-name my-app \
  --policy-text file://repository-policy.json \
  --region ap-northeast-1

repository-policy.jsonの内容は以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCrossAccountPull",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::987654321098:root"
            },
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ]
        }
    ]
}

この設定により、アカウント987654321098からのイメージプルが許可されます。

イメージスキャンによる脆弱性検出

ECRには、コンテナイメージの脆弱性を検出するスキャン機能が組み込まれています。

基本スキャン

AWSが提供する無料のスキャン機能です。CVE(Common Vulnerabilities and Exposures)データベースに基づいて、OSパッケージの脆弱性を検出します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 手動でスキャンを実行
aws ecr start-image-scan \
  --repository-name my-app \
  --image-id imageTag=v1.0.0 \
  --region ap-northeast-1

# スキャン結果を取得
aws ecr describe-image-scan-findings \
  --repository-name my-app \
  --image-id imageTag=v1.0.0 \
  --region ap-northeast-1

拡張スキャン(Enhanced Scanning)

Amazon Inspectorと連携した高度なスキャン機能です。OSパッケージに加えて、プログラミング言語のパッケージ(npm、pip、Maven等)の脆弱性も検出できます。追加料金が発生しますが、より包括的なセキュリティ評価が可能です。

ライフサイクルポリシーによるコスト最適化

古いイメージを自動削除するライフサイクルポリシーを設定することで、ストレージコストを抑制できます。

1
2
3
4
5
# ライフサイクルポリシーの設定
aws ecr put-lifecycle-policy \
  --repository-name my-app \
  --lifecycle-policy-text file://lifecycle-policy.json \
  --region ap-northeast-1

lifecycle-policy.jsonの内容は以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
    "rules": [
        {
            "rulePriority": 1,
            "description": "タグなしイメージを7日後に削除",
            "selection": {
                "tagStatus": "untagged",
                "countType": "sinceImagePushed",
                "countUnit": "days",
                "countNumber": 7
            },
            "action": {
                "type": "expire"
            }
        },
        {
            "rulePriority": 2,
            "description": "最新10個以外のイメージを削除",
            "selection": {
                "tagStatus": "tagged",
                "tagPrefixList": ["v"],
                "countType": "imageCountMoreThan",
                "countNumber": 10
            },
            "action": {
                "type": "expire"
            }
        }
    ]
}

イミュータブルタグの活用

タグのイミュータビリティを有効にすると、一度プッシュしたタグを上書きできなくなります。これにより、意図しないイメージの置き換えを防止し、デプロイの再現性を保証できます。

1
2
3
4
5
# 既存リポジトリのイミュータビリティ設定を変更
aws ecr put-image-tag-mutability \
  --repository-name my-app \
  --image-tag-mutability IMMUTABLE \
  --region ap-northeast-1

まとめ

本記事では、Amazon ECRによるコンテナイメージ管理の基本を解説しました。

ECRは、AWS環境でコンテナを運用する際の標準的なレジストリサービスです。IAMによるきめ細かなアクセス制御、イメージスキャンによる脆弱性検出、ライフサイクルポリシーによるコスト最適化など、エンタープライズ向けの機能が充実しています。

ECRを効果的に活用するためのポイントは以下の通りです。

  • リポジトリ作成時にイミュータブルタグとプッシュ時スキャンを有効化する
  • IAMポリシーで最小権限の原則に基づいたアクセス制御を実装する
  • ライフサイクルポリシーで古いイメージを自動削除してコストを抑える
  • CI/CDパイプラインと連携してイメージのビルドとプッシュを自動化する

次のステップとして、ECSやEKSとの連携、マルチリージョンレプリケーション、GitHub ActionsやCodePipelineとのCI/CD統合などを学ぶことで、より実践的なコンテナ運用が可能になります。

参考リンク