7
3

More than 3 years have passed since last update.

S3バケットのクロスアカウントアクセス

Posted at

概要

アカウントAで作成したS3バケットのオブジェクトを、アカウントBから取得する方法です。(クロスアカウントというらしい)
方法(こちらを参照)は以下のようにいくつかあるようです。

  1. リソースベースのポリシーと AWS Identity and Access Management (IAM) ポリシー (S3 バケットオブジェクトへのプログラムによるアクセス専用)
  2. リソースベースのアクセスコントロールリスト (ACL) と IAM ポリシー (S3 バケットオブジェクトへのプログラムによるアクセス専用)
  3. クロスアカウント IAM ロール (S3 バケットオブジェクトへのプログラムおよびコンソールによるアクセス)

本記事では1のリソースベースのポリシーとIAMポリシーでアクセス許可をする手順を記載します。

実行環境

AWSアカウント 2つ必要
AWS S3

手順

1. アカウントAでバケットを作成する

アカウントAで、アカウントBがアクセスできるバケットを作成する。
既存のバケットを参照したい場合は作成する必要はありません。

2. アカウントBでアカウントAのバケットにアクセスするためのポリシーを作成する

ポリシーは以下のようにします。今回は簡単なバケット内データ取得のみを付与してみます。(GetObject、ListBucket)

ポリシー(JSON)
{
   "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で作成したユーザです。

S3バケットポリシー
{
   "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で簡単にアクセスを試すと以下のようになります。

アクセスプログラム.py
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/

以上 :slight_smile:

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3