S3のゲートウェイエンドポイントポリシーを自アカウントのみに限定するときに許可が必要なAWS管理バケット

S3のゲートウェイエンドポイントポリシーを自アカウントのみに限定するときに許可が必要なAWS管理バケット

S3のゲートウェイエンドポイントのポリシーを aws:ResourceAccount で自アカウントのみに限定すると、ECR、dnf、Systems ManagerがAWS管理のバケットを取得できず403エラーになります。許可が必要なバケットの一覧とポリシーの例を、東京リージョンで検証しました。
2026.10.30

こんにちは、林です。

S3のゲートウェイエンドポイントのポリシーに aws:ResourceAccount の条件を付けると、VPCからアクセスできるバケットを自アカウントのもののみに限定できます。

公式ドキュメントには、この条件について次の注記があります。

アクセスされるリソースの AWS アカウント ID を指定するには、IAM ポリシーで aws:ResourceAccount キーまたは s3:ResourceAccount キーを使用できます。ただし、一部の AWS のサービス は AWS マネージドバケットへのアクセスに依存していることに注意してください。したがって、IAM ポリシーで aws:ResourceAccount キーまたは s3:ResourceAccount キーを使用することは、これらのリソースへのアクセスにも影響する可能性があります。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/privatelink-interface-endpoints.html

注記にあるAWSマネージドバケットは、たとえばECRのイメージのレイヤーやAmazon Linux 2023のパッケージが置かれているバケットです。自アカウントのみに限定すると、これらへのアクセスも拒否されます。

インターネットに出られないプライベートサブネットのEC2で、何が失敗するのか、どのバケットを許可すれば成功するのかを確かめてみました。

先に結論

東京リージョンで、自アカウントのみを許可したポリシーを試したところ、自アカウントのバケットの取得は成功し、4つの操作がS3の403エラーで失敗しました。

操作 取得に失敗したバケット
dnfでのパッケージ取得 al2023-repos-ap-northeast-1-de612dc2
ECRからのイメージ取得(docker pull) prod-ap-northeast-1-starport-layer-bucket
Patch Managerのスキャン(AWS-RunPatchBaseline) aws-ssm-ap-northeast-1、patch-baseline-snapshot-ap-northeast-1
SSM Agentの更新(AWS-UpdateSSMAgent) amazon-ssm-ap-northeast-1

これらを含むAWS管理のバケットへの s3:GetObject を許可すると、4つとも成功しました。
許可を追加したポリシーです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Access-to-own-account-buckets-only",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceAccount": "123456789012"
        }
      }
    },
    {
      "Sid": "Access-to-AWS-managed-buckets",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::prod-ap-northeast-1-starport-layer-bucket/*",
        "arn:aws:s3:::al2023-repos-ap-northeast-1-de612dc2/*",
        "arn:aws:s3:::amazon-ssm-ap-northeast-1/*",
        "arn:aws:s3:::aws-ssm-ap-northeast-1/*",
        "arn:aws:s3:::patch-baseline-snapshot-ap-northeast-1/*",
        "arn:aws:s3:::aws-patch-manager-ap-northeast-1-4849fa78f/*",
        "arn:aws:s3:::ap-northeast-1-birdwatcher-prod/*"
      ]
    }
  ]
}

許可するアクションは s3:GetObject のみです。ECRとSystems Managerのガイドの例も s3:GetObject のみで、検証でも s3:ListBucket なしで5つの操作が成功しました。

aws-patch-manager-ap-northeast-1-4849fa78f と ap-northeast-1-birdwatcher-prod は、今回の検証では確認していませんが、Systems Managerのガイドの一覧に従って含めています。

バケット名はリージョンごとに決まっていて、AWSのユーザーガイドとAWS re:Postのナレッジセンター記事に記載があります。

サービス バケット名 記載場所
ECR(イメージのレイヤー) prod-{region}-starport-layer-bucket ECRユーザーガイド「Amazon ECR の最小 Amazon S3 バケットアクセス許可」
Amazon Linux 2023(dnf) al2023-repos-{region}-de612dc2 AWS re:Post「How do I update yum or install packages without internet access」
SSM Agentの更新 amazon-ssm-{region} Systems Managerユーザーガイド「SSM Agent と AWS マネージド S3 バケットとの通信」
Patch Managerの資材 aws-ssm-{region} 同上
パッチベースラインのスナップショット patch-baseline-snapshot-{region} または patch-baseline-snapshot-{region}-{接尾辞} 同上
Patch Managerのドキュメント aws-patch-manager-{region}-{接尾辞} 同上
Distributor {region}-birdwatcher-prod 同上

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html

https://repost.aws/knowledge-center/ec2-al1-al2-update-yum-without-internet

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent-technical-details.html#ssm-agent-minimum-s3-permissions

{接尾辞} はリージョンごとに異なります。リージョンごとの実際の名前は「参照: パッチ適用オペレーション用の Amazon S3 バケット」にあります。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/patch-operations-s3-buckets.html

また、Systems Managerのガイドには、リージョンをワイルドカードにしないことについて次の注記があります。

このポリシーの特定のリージョンの代わりにワイルドカード文字 (*) を使用しないことをお勧めします。例えば、arn:aws:s3:::aws-ssm-us-east-2/* を使用して、arn:aws:s3:::aws-ssm-*/* は使用しないでください。ワイルドカードを使用すると、アクセスを付与する S3 バケットへのアクセス権が付与される場合があります。複数のリージョンでインスタンスプロファイルを使用する場合は、各リージョンの最初の Statement ブロックを繰り返すことをお勧めします。

Windows Serverを使う場合は、同じガイドに記載のある aws-windows-downloads-{region} も必要です。今回の検証はAmazon Linux 2023のため、ポリシーには入れていません。

検証方法

項目 内容
EC2 t4g.small、Amazon Linux 2023(arm64)
ネットワーク インターネットゲートウェイとNATゲートウェイのないVPCのプライベートサブネット
VPCエンドポイント(ゲートウェイ型) S3
VPCエンドポイント(インターフェイス型) ssm、ssmmessages、ec2messages、ecr.api、ecr.dkr
Docker 25.0.14
SSM Agent 3.3.5390.0
リージョン 東京(ap-northeast-1)

EC2のIAMロールには s3:Get* と s3:List* をすべてのリソースに許可し、変わる条件をエンドポイントポリシーのみにしました。docker pull の対象は、自アカウントのECRプライベートリポジトリに置いた amazonlinux:2023 です。

S3のゲートウェイエンドポイントのポリシーを3種類に切り替え、それぞれで同じ5つの操作をRun Commandで実行しました。

ポリシー 内容
既定 すべて許可(エンドポイント作成時のポリシー)
自アカウントのみ aws:ResourceAccount が自アカウントのときのみ s3:* を許可
自アカウント+AWS管理バケット 「先に結論」のポリシー

「自アカウントのみ」のポリシーです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Access-to-own-account-buckets-only",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceAccount": "123456789012"
        }
      }
    }
  ]
}

実行した5つの操作です。

  1. 自アカウントのバケットのオブジェクトを aws s3 cp で取得する
  2. dnf install でパッケージを取得する
  3. ECRのイメージを docker pull で取得する
  4. AWS-RunPatchBaseline をScanで実行する
  5. AWS-UpdateSSMAgent を実行する

結果

○は成功、×は失敗です。

操作 既定 自アカウントのみ 自アカウント+AWS管理バケット
自アカウントのバケットの取得 ○ ○ ○
dnfでのパッケージ取得 ○ × ○
ECRからのイメージ取得 ○ × ○
Patch Managerのスキャン ○ × ○
SSM Agentの更新 ○ × ○

Run Commandの実行とSession Managerの接続は、S3を使わないのでどのポリシーでも成功しました。

失敗したときのエラー

「自アカウントのみ」のポリシーで失敗した4つの操作のエラーです。いずれも、403エラーのURLにアクセスできなかったバケット名が出ています。

dnf

リポジトリのミラーリストの取得で失敗しました。

Error: Failed to download metadata for repo 'kernel-livepatch': Cannot prepare internal mirrorlist: Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/kernel-livepatch/mirrors/al2023/aarch64/mirror.list?instance_id=i-0554d801acea99583 (IP: 52.219.16.122)

docker pull

ECRの認証とマニフェストの取得は成功し、レイヤーの取得で失敗しました。エラーメッセージには、拒否したのがVPCエンドポイントポリシーであることも出ています。

denied: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/storage-access-role-prod-ap-northeast-1/xxxxxxxx is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:::prod-ap-northeast-1-starport-layer-bucket/..." because no VPC endpoint policy allows the s3:GetObject action

AWS-RunPatchBaseline

パッチ適用の資材の取得で失敗しました。

root [ERROR]: Unable to download payload: https://s3.ap-northeast-1.amazonaws.com/aws-ssm-ap-northeast-1/patchbaselineoperations/linux/payloads/patch-baseline-operations-1.252.tar.gz.

資材が前回の実行でキャッシュされている場合は、その次のパッチベースラインのスナップショットの取得で失敗しました。このエラーにはバケット名が出ないので、スナップショットの置き場である patch-baseline-snapshot-ap-northeast-1 はSystems Managerのガイドで確認しました。

root [ERROR]: Could not download a valid snapshot

AWS-UpdateSSMAgent

更新の有無を調べるマニフェストの取得で失敗しました。

failed to download file reliably, https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/ssm-agent-manifest.json, http request failed. status:403 Forbidden statuscode:403

まとめ

S3のゲートウェイエンドポイントのポリシーを自アカウントのみに限定すると失敗するAWSサービスと、許可が必要なバケットを確かめてみました。

  • ECRのイメージ取得、Amazon Linux 2023のdnf、Patch Manager、SSM Agentの更新は、AWS管理のバケットから取得できず403エラーで失敗する
  • 失敗したときのエラーには、取得できなかったバケット名が出る
  • 許可が必要なバケット名はリージョンごとに決まっていて、AWSのユーザーガイドとAWS re:Postに記載がある
  • AWS管理のバケットへの s3:GetObject を許可すると、どの操作も成功する

aws:ResourceAccount で限定するときは、使っているサービスがどのAWS管理バケットを使うかを確認し、許可しておく必要があります。

この記事がどなたかの参考になれば幸いです。最後までご覧いただきありがとうございました!

参考

https://docs.aws.amazon.com/AmazonS3/latest/userguide/privatelink-interface-endpoints.html

https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html

https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-technical-details.html

https://docs.aws.amazon.com/systems-manager/latest/userguide/patch-operations-s3-buckets.html

https://repost.aws/knowledge-center/ec2-al1-al2-update-yum-without-internet

https://dev.classmethod.jp/articles/private-ec2-ssm-vpcendpoint-policy/

https://dev.classmethod.jp/articles/tsnote-ecs-ecr-private-subnet-CannotPullContainerError-403-forbidden-solution/

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事