異なる AWS アカウントに AWS Identity and Access Management (IAM) エンティティと Amazon Simple Storage Service (Amazon S3) バケットがあります。IAMエンティティに、Amazon S3 アクセスポイントを介してクロスアカウントでバケットにアクセスする権限を付与したいと考えています。アクセスポイントは Amazon Virtual Private Cloud (Amazon VPC) に制限されています。
簡単な説明
1 つの AWS アカウントにある IAM ロールまたはユーザーに、別の AWS アカウントの Amazon S3 バケットへのアクセス権を、Amazon VPC に制限された S3 アクセスポイントを通じて付与できます。
IAM エンティティがアカウント A にあり、S3 バケットがアカウント B にあるとします。VPC に制限された S3 アクセスポイントを通じて IAM エンティティにバケットへのアクセス権を付与するには、次の手順を完了してください。
- Amazon S3 アクセスポイントを作成し、アカウント B のバケットにアタッチします。
- アカウント A に Amazon S3 VPC ゲートウェイエンドポイントを作成します。
- アクセスポイント、バケット、IAM エンティティにポリシーをアタッチします。
**注:**アカウント A の IAM ID は、アカウント B の S3 バケットと同じ AWS リージョンにある必要があります。
解決策
Amazon S3 アクセスポイントを作成してアカウント B のバケットにアタッチする
Amazon S3 アクセスポイントを作成してアカウント B のバケットにアタッチするには、次の手順を実行します。
- Amazon S3 コンソールを開きます。
- ナビゲーションペインで、[アクセスポイント] を選択します。
- [アクセスポイントの作成] を選択します。
- [アクセスポイント名] に、アクセスポイントの名前を入力します。アクセスポイントに名前を付ける方法の詳細については、「Amazon S3 アクセスポイントの命名規則」を参照してください。
- [バケット名] で [このアカウントのバケットを選択] を選択し、アクセスポイントをアタッチするバケット名を入力します。
- [ネットワークオリジン] には、[仮想プライベートクラウド (VPC)] を選択します。
- [VPC ID] には、他の AWS アカウント (アカウント A) の VPC ID を入力します。
- [このアクセスポイントのパブリックアクセスブロック設定] で、アクセスポイントに適用するパブリックアクセスをブロックする設定を選択します。
**注:**アクセスポイントを作成した後は、そのアクセスポイントの「パブリックアクセスブロック」設定を変更することはできません。
- アクセスポイントポリシーは空白のままにします。
- [アクセスポイントの作成] を選択します。
アカウント A に Amazon S3 VPC ゲートウェイエンドポイントを作成する
アカウント B の Amazon S3 バケットへのアクセスを許可する S3 VPC ゲートウェイエンドポイントをアカウント A に作成するには、次の手順を実行します。
- Amazon VPC コンソールを開きます。
- ナビゲーションペインで [エンドポイント] を選択します。
- [エンドポイントの作成] を選択します。
- [サービスカテゴリ] で [AWS サービス] を選択します。
- [サービス] に [Type = Gateway] というフィルターを追加し、[com.amazonaws<region>.s3] を選択します。
- [VPC] には、アカウント B でアクセスポイントの作成に使用した VPC を選択します。
- [ルートテーブル] では、エンドポイントに使用する必要があるルートテーブルを選択します。
- [ポリシー] で [フルアクセス] を選択して、VPCエンドポイント経由で全リソースに対する全プリンシパルの操作を許可します。または、[カスタム] を選択し、必要な S3 アクションを許可する独自のポリシーを使用してください。
たとえば、次の VPC エンドポイントポリシーは、すべてのバケットに対してすべての S3 アクションを許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:*"
}
]
}
**注:**ゲートウェイエンドポイントは、他の AWS リージョンからのアクセスを許可しません。
アクセスポイント、バケット、IAM エンティティにポリシーをアタッチする
アカウント A の IAM エンティティにアクセスポイント経由でアカウント B のバケットへのアクセスを許可するには、以下にポリシーをアタッチする必要があります。
- アクセスポイント
- S3 バケット
- IAM エンティティ
アクセスポイントポリシー
アカウント A の IAM エンティティに、アカウント B の S3 アクセスポイントへのアクセス許可を付与するには、以下のポリシーをアクセスポイントにアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateControlToAccessPoint",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::AccountA-ID:user/user1",
"arn:aws:iam::AccountA-ID:role/role01"
]
},
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-acess-point/object/*",
"arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point"
]
}
]
}
バケットポリシー
アカウント A の IAM エンティティにアクセスポイント経由でアカウント B のバケットへのアクセス許可を付与するには、バケットに次のポリシーをアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::AccountA-ID:user/user1",
"arn:aws:iam::AccountA-ID:role/role01"
]
},
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": {
"StringEquals": {
"s3:DataAccessPointArn": "arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point"
}
}
}
]
}
IAM ポリシー
アカウント A の IAM エンティティに、アカウント B のバケットとアクセスポイントへのアクセス許可を付与するには、IAM エンティティに次のポリシーをアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountAccessToBucketAndAP",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point",
"arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point/object/*",
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
アクセスポイントを介してバケットで S3 操作を実行する AWS CLI サンプルコマンド
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
アクセスポイントからオブジェクトを一覧表示するには、ls コマンドを実行します。
aws s3 ls arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point
アクセスポイント経由でファイルをアップロードするには、cp コマンドを実行します。
aws s3 cp file.txt s3://arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point
cp コマンドを使用して、アクセスポイントからファイルをダウンロードすることもできます。
aws s3 cp s3://arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point file.txt
**注:**リクエストは、バケットと同じ VPC および同じリージョン内にあるAmazon Elastic Compute Cloud (Amazon EC2) インスタンスから発信される必要があります。