ECR APIのインターフェイスエンドポイントを設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、VPCにECR APIのインターフェイスエンドポイントを設定する手順について、リスクと対策を解説します。

ポリシーの説明
Amazon Elastic Container Registry (ECR) は、Dockerコンテナイメージを安全に保存・管理・配布するためのフルマネージドサービスです。通常、ECR APIへのアクセスはインターネット経由で行われますが、VPCインターフェイスエンドポイント(AWS PrivateLink)を設定することで、VPC内からプライベートにアクセスすることが可能になります。
ECRへのアクセスには、以下の3つのエンドポイントが必要です:
- com.amazonaws.region.ecr.api: ECR APIの呼び出し(リポジトリ管理、認証など)
- com.amazonaws.region.ecr.dkr: Docker Registry APIの呼び出し(イメージのpush/pull)
- com.amazonaws.region.s3: イメージレイヤーの保存(ゲートウェイエンドポイント)
このポリシーは、ECR APIへのアクセスがインターネットゲートウェイやNATゲートウェイを経由せず、VPC内のプライベートなインターフェイスエンドポイントを通じて行われるように設定されているかを確認します。これにより、コンテナイメージの取得やプッシュ時の通信がAWSのプライベートネットワーク内に留まり、セキュリティが大幅に向上します。
修復方法
前提条件
修復を開始する前に、以下の前提条件を確認してください:
ネットワーク要件:
- VPCでDNSホスト名とDNS解決が有効化されている
- プライベートサブネットが複数のアベイラビリティーゾーンに配置されている
- ルートテーブルが適切に設定されている
必要な権限:
ec2:CreateVpcEndpoint
ec2:ModifyVpcEndpoint
ec2:DescribeVpcEndpoints
ec2:CreateSecurityGroup
コスト見積もり:
- インターフェイスエンドポイント: $0.01/時間/AZ(月額約$7.30/AZ)
- データ処理: $0.01/GB
- 3つのAZに配置した場合: 約$22/月/エンドポイント
コンソールでの修復手順
AWSのコンソールを使用して、ECR APIのVPCインターフェイスエンドポイントを作成します。
- VPCコンソールを開く
- AWSマネジメントコンソールにログイン「VPC」サービスを選択左側のナビゲーションペインから「エンドポイント」を選択

- エンドポイントの作成
- 「エンドポイントの作成」ボタンをクリック
- 「サービスカテゴリ」で「AWSサービス」を選択
- 「サービス名」で以下の2つのサービスを検索して選択(両方必要):
com.amazonaws.region.ecr.api
(ECR API用) – 例:com.amazonaws.ap-northeast-1.ecr.api
com.amazonaws.region.ecr.dkr
(Docker Registry API用) – 例:com.amazonaws.ap-northeast-1.ecr.dkr
- VPCとサブネットの選択
- エンドポイントを作成するVPCを選択プライベートサブネットを選択(複数のアベイラビリティーゾーンから選択することを推奨)

- セキュリティグループの設定
- 新しいセキュリティグループを作成するか、既存のものを選択
- インバウンドルールを以下のように設定:
Type: HTTPS Protocol: TCP Port Range: 443 Source: VPC CIDR (例: 10.0.0.0/16) またはコンテナを実行するセキュリティグループ Description: Allow HTTPS from VPC for ECR access
- アウトバウンドルールは不要
- DNS設定の確認
- 「プライベートDNS名を有効にする」オプションにチェックを入れる
- これにより、ECRのパブリックDNS名が自動的にVPCエンドポイントに解決されます
- エンドポイントポリシーの設定(オプション)
- デフォルトの「フルアクセス」ポリシーを使用するか、カスタムポリシーを作成
- 特定のリソースやアクションへのアクセスを制限する場合はカスタムポリシーを使用
- S3ゲートウェイエンドポイントの確認
- ECRはイメージレイヤーの保存にS3を使用するため、S3のゲートウェイエンドポイントも必要

- 既に作成されていない場合は、以下の手順で作成:
- サービス名:
com.amazonaws.region.s3
- エンドポイントタイプ: Gateway
- ルートテーブル: プライベートサブネットのルートテーブルを選択
- サービス名:
- CloudWatch Logsエンドポイントも推奨(ECRのプルスルーキャッシュルール使用時)
Terraformでの修復手順
ECR APIのインターフェイスエンドポイントを設定するTerraformコードのサンプルです。
※ あくまで実装サンプルとして変数やID指定については適当な値を注入しているため、適切な値に修正してください。
# ========================================
# ECR API用のVPCエンドポイント
# ========================================
resource "aws_vpc_endpoint" "ecr_api" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${data.aws_region.current.name}.ecr.api"
vpc_endpoint_type = "Interface"
subnet_ids = aws_subnet.private[*].id
security_group_ids = [aws_security_group.vpce_sg.id]
private_dns_enabled = true # 重要: プライベートDNSを有効化
# エンドポイントポリシー(必要に応じてカスタマイズ)
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = "*"
Action = "*"
Resource = "*"
Condition = {
StringEquals = {
"aws:PrincipalAccount" = data.aws_caller_identity.current.account_id
}
}
}
]
})
tags = {
Name = "${var.environment}-ecr-api-endpoint"
Environment = var.environment
Service = "ECR API"
}
lifecycle {
create_before_destroy = true
}
}
# ========================================
# Docker Registry API用のVPCエンドポイント
# ========================================
resource "aws_vpc_endpoint" "ecr_dkr" {
count = var.enable_ecr_endpoints ? 1 : 0
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${data.aws_region.current.name}.ecr.dkr"
vpc_endpoint_type = "Interface"
subnet_ids = aws_subnet.private[*].id
security_group_ids = [aws_security_group.vpce_sg.id]
private_dns_enabled = true # 重要: プライベートDNSを有効化
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = "*"
Action = "*"
Resource = "*"
Condition = {
StringEquals = {
"aws:PrincipalAccount" = data.aws_caller_identity.current.account_id
}
}
}
]
})
tags = {
Name = "${var.environment}-ecr-dkr-endpoint"
Environment = var.environment
Service = "Docker Registry"
}
lifecycle {
create_before_destroy = true
}
}
# ========================================
# S3ゲートウェイエンドポイント(ECRがイメージ保存に使用)
# ========================================
resource "aws_vpc_endpoint" "s3" {
count = var.enable_ecr_endpoints ? 1 : 0
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${data.aws_region.current.name}.s3"
route_table_ids = aws_route_table.private[*].id
# S3エンドポイントポリシー(ECRバケットへのアクセスを制限)
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = "*"
Action = [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
]
Resource = [
"arn:aws:s3:::prod-${data.aws_region.current.name}-starport-layer-bucket/*",
"arn:aws:s3:::prod-${data.aws_region.current.name}-starport-layer-bucket"
]
}
]
})
tags = {
Name = "${var.environment}-s3-gateway-endpoint"
Environment = var.environment
Service = "S3 for ECR"
}
}
最後に
この記事では、VPCにECR APIのインターフェイスエンドポイントを設定する手順について、包括的なリスク分析と実践的な対策を解説しました。
重要なポイントのまとめ:
- ECRへのアクセスには3つのエンドポイント(ECR API、Docker Registry、S3)が必要
- プライベートDNSを有効にすることで、既存のアプリケーションコードの変更なしに移行可能
- 月額コストは約$22/エンドポイントだが、NAT Gatewayのデータ転送コスト削減で相殺可能
- セキュリティ、コンプライアンス、パフォーマンスの観点から導入を強く推奨
ECRのVPCエンドポイントを設定することで、コンテナイメージの転送をAWSのバックボーンネットワーク内に限定し、セキュリティリスクを大幅に低減できます。特に、機密性の高いアプリケーションや規制の厳しい業界では、この設定は必須と言えるでしょう。
この問題の検出は弊社が提供するSecurifyのCSPM機能で自動的に検出・管理することが可能です。運用負荷を大幅に軽減しながら、セキュリティレベルを向上させる製品となっていますので、ぜひ興味がある方はお問い合わせください。
最後までお読みいただきありがとうございました。この記事が皆さんのECRセキュリティ強化の一助となれば幸いです。