##概要
アカウントAで作成したS3バケットのオブジェクトを、アカウントBから取得する方法です。(クロスアカウントというらしい)
方法(こちらを参照)は以下のようにいくつかあるようです。
- リソースベースのポリシーと AWS Identity and Access Management (IAM) ポリシー (S3 バケットオブジェクトへのプログラムによるアクセス専用)
- リソースベースのアクセスコントロールリスト (ACL) と IAM ポリシー (S3 バケットオブジェクトへのプログラムによるアクセス専用)
- クロスアカウント IAM ロール (S3 バケットオブジェクトへのプログラムおよびコンソールによるアクセス)
本記事では1のリソースベースのポリシーとIAMポリシーでアクセス許可をする手順を記載します。
##実行環境
AWSアカウント 2つ必要
AWS S3
##手順
1. アカウントAでバケットを作成する
アカウントAで、アカウントBがアクセスできるバケットを作成する。
既存のバケットを参照したい場合は作成する必要はありません。
2. アカウントBでアカウントAのバケットにアクセスするためのポリシーを作成する
ポリシーは以下のようにします。今回は簡単なバケット内データ取得のみを付与してみます。(GetObject、ListBucket)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::accountA.test.bucket",
"arn:aws:s3:::accountA.test.bucket/*"
]
}
]
}
3. アカウントBでユーザを作成する
2で作成したポリシーを付与したユーザを作成します。
細かいことは書きませんが、作成は以下のようになります。
-
アカウントBからアカウントAバケットのアクセスはプログラムからのアクセスのみとしたいので、作成時に選択する「AWSアクセスの種類を選択」は「プログラムによるアクセス」を選択します。
-
2で作成したポリシーをアタッチ
作成時にcredential情報が作成されますが、プログラムからのアクセスする場合に利用するので取得しておく。
4. アカウントAで作成したバケットにポリシーを設定する
accountBuserは3で作成したユーザです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::120912091209:user/accountBuser"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::accountA.test.bucket",
"arn:aws:s3:::accountA.test.bucket/*"
]
}
]
}
以上でアカウントBからアカウントAのS3バケットにアクセスする準備は完了となります。
あとはプログラムから取得できるか試してみてください。
おまけ
一応Python Boto3で簡単にアクセスを試すと以下のようになります。
import boto3
session = boto3.session.Session(aws_access_key_id='アカウントBのアクセスキー',
aws_secret_access_key='アカウントBのシークレットキー',
region_name='ap-northeast-1')
s3client = session.client('s3')
response = s3client.list_objects(Bucket='アカウントAのバケット',
Prefix='バケットのオブジェクト')
print(response)
##参考
Amazon S3 バケット内のオブジェクトへのクロスアカウントアクセスを提供するには、どうしたらいいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cross-account-access-s3/
以上