マルチリージョンアクセスポイントを利用して、クロスアカウント&リージョン S3 アクセスをやってみた

マルチリージョンアクセスポイントを利用して、クロスアカウント&リージョン S3 アクセスをやってみた

Clock Icon2025.04.11

はじめに

テクニカルサポートの 片方 です。
今回は東京リージョンの閉鎖的な VPC 環境(インターネット接続なし)に配置された EC2 インスタンスから、異なるアカウントの異なるリージョン S3 バケットへ、AWS CLI コマンドでアクセスする方法をご紹介します。
こちらは、以前ご紹介したブログと類似しますが、アクセス対象 S3 バケットのバケットポリシー記載が必須である点が大きく異なります。

https://dev.classmethod.jp/articles/s3-multi-region-access-point-private-vpc-s3-access/

やってみた

対象 S3 バケットへ AWS CLI コマンドでアクセス可能な状態にすることをゴールとします。
なお既に、閉鎖的な VPC 環境(インターネット接続なし)に配置された EC2 インスタンス (Amazon Linux 2023) が起動中であり、起動中 EC2 インスタンスと異なるアカウントの異なるリージョンに S3 バケットが存在する前提で進めさせていただきます。

以下が実装の流れです。

  1. マルチリージョンアクセスポイントの作成 (アクセス元アカウント側)
  2. S3 インターフェース VPC エンドポイント(com.amazonaws.s3-global.accesspoint) の作成
  3. EC2 インスタンスに関連付けたロールにポリシーを作成~追加
  4. アクセス先 S3 バケットへのバケットポリシー記載

マルチリージョンアクセスポイントの作成

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/multi-region-access-point-create-examples.html

AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。
ナビゲーションペインで、[Multi-Region Access Points] (マルチリージョンアクセスポイント) を選択します。
[マルチリージョンアクセスポイントの作成] を選択して、マルチリージョンアクセスポイントの作成を開始します。
[マルチリージョンアクセスポイント] ページの [マルチリージョンアクセスポイント名] フィールドに、マルチリージョンアクセスポイントの名前を入力します。
このマルチリージョンアクセスポイントに関連付ける "異なるアカウント" の "異なるリージョンに存在する S3 バケット" を選択します。

001

その他の設定は行わず、[マルチリージョンアクセスポイントの作成] を選択します。
作成完了まで、暫く待ちます。
作成が完了したら、ARN を控えておきます。こちらを使用してアクセスを行うためです。

002

S3 インターフェース VPC エンドポイント(com.amazonaws.s3-global.accesspoint) の作成

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/MultiRegionAccessPointsPrivateLink.html

必ず com.amazonaws.s3-global.accesspoint エンドポイントを作成してください。他のエンドポイントタイプでは、マルチリージョンアクセスポイントにアクセスできません。

ナビゲーションペインで、[エンドポイント] を選択します。
[エンドポイントを作成] を選択して作成を開始します。

01

中部へスクロールし、サービスのセクションで検索窓に S3 と記載。表示された複数の S3 に関するエンドポイントの中より、com.amazonaws.s3-global.acesspoint を選択します。

02

エンドポイントを作成する VPC を選択し、DNS 名を有効化のチェックボックスにチェックを入れます。
その後、サブネットセクションでは接続元 EC2 インスタンスが存在するサブネットを選択します。
今回は、デフォルトのセキュリティグループで、ポリシーもそのままにして作成します。

03

EC2 インスタンスに関連付けたロールにポリシーを作成~追加

ご自身の環境に合わせて適宜修正のうえ以下のポリシーを作成してください。
作成したポリシーを、EC2 インスタンスに関連付けたロールにアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3::${ACCOUNT_ID}:accesspoint/${MRAP_NAME}",
                "arn:aws:s3::${ACCOUNT_ID}:accesspoint/${MRAP_NAME}/object/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::${BUCKET_NAME}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetMultiRegionAccessPoint",
                "s3:GetMultiRegionAccessPointPolicy",
                "s3:GetMultiRegionAccessPointRoutes",
                "s3:ListMultiRegionAccessPoints"
            ],
            "Resource": "*"
        }
    ]
}

アクセス先 S3 バケットへのバケットポリシー記載

ご自身の環境に合わせて適宜修正のうえ以下のバケットポリシーを作成してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3ReadWriteAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::s3-bucket-name/*",
                "arn:aws:s3:::s3-bucket-name"
            ]
        }
    ]
}

"Principal" ではアクセス元の AWS アカウント ID を記載します

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html

補足

IAM ユーザー・ロールなどのポリシーと S3 バケットポリシー両方で明示的な許可を持っているときアクセス可能です。
存在しない場合は、以下のエラーが発生します。

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

検証してみた

エンドポイント経由でマネージドノードとして登録している EC2 インスタンス (Amazon Linux 2023) にセッションマネージャーを利用して接続します。
06

07

なお、アクセス対象の異なるアカウントの異なるリージョン (バージニア北部リージョン) に存在する S3 バケットには適当なオブジェクト (ファイル) をアップロード済みです。

003

バケット内のオブジェクトを一覧表示します。

※ コマンド例

$ aws s3 ls s3://arn:aws:s3::<アカウントID>:accesspoint/<MRAPの名前>/

実行例 ※一部マスクします

$ aws s3 ls s3://arn:aws:s3::xxxxxxxxxxxx:accesspoint/mcwu3557n8pzs.mrap/
                           PRE Test-folder/
2025-04-10 13:35:17          5 Test1.txt
2025-04-10 13:35:15          5 Test2.txt
2025-04-10 13:35:16          5 Test3.txt
sh-5.2$

004

クロスアカウントクロスリージョン S3 アクセスに成功しました!
もちろん s3api コマンドでも操作可能です。

実行例 ※一部マスクします

$ aws s3api list-objects-v2 --bucket arn:aws:s3::xxxxxxxxxxxx:accesspoint/mcwu3557n8pzs.mrap
{
    "Contents": [
        {
            "Key": "Test-folder/",
            "LastModified": "2025-04-10T13:33:41+00:00",
            "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
            "ChecksumAlgorithm": [
                "CRC64NVME"
            ],
            "ChecksumType": "FULL_OBJECT",
            "Size": 0,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "Test-folder/Test-folder-1.txt",
            "LastModified": "2025-04-10T13:35:33+00:00",
            "ETag": "\"45e64dcfaf64d4316fa2f006d6226d76\"",
            "ChecksumAlgorithm": [
                "CRC64NVME"
            ],
            "ChecksumType": "FULL_OBJECT",
            "Size": 13,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "Test1.txt",
            "LastModified": "2025-04-10T13:35:17+00:00",
            "ETag": "\"e1b849f9631ffc1829b2e31402373e3c\"",
            "ChecksumAlgorithm": [
                "CRC64NVME"
            ],
            "ChecksumType": "FULL_OBJECT",
            "Size": 5,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "Test2.txt",
            "LastModified": "2025-04-10T13:35:15+00:00",
            "ETag": "\"c454552d52d55d3ef56408742887362b\"",
            "ChecksumAlgorithm": [
                "CRC64NVME"
            ],
            "ChecksumType": "FULL_OBJECT",
            "Size": 5,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "Test3.txt",
            "LastModified": "2025-04-10T13:35:16+00:00",
            "ETag": "\"b3f66ec1535de7702c38e94408fa4a17\"",
            "ChecksumAlgorithm": [
                "CRC64NVME"
            ],
            "ChecksumType": "FULL_OBJECT",
            "Size": 5,
            "StorageClass": "STANDARD"
        }
    ],
    "RequestCharged": null,
    "Prefix": ""
}
(END)

まとめ

冒頭でお伝えした通り以前ご紹介したブログ内容と類似していますが、クロスアカウントアクセスの際には S3 バケット側でも明示的に許可が必要な点がございます。学習や仕様の再認識としても、本ブログが誰かの参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.