Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@libra_lt

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

More than 1 year has passed since last update.

概要

アカウント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:

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
libra_lt
東京でシステムエンジニアやってます。 Java歴が長いですが、今はPythonを使う機会が多いです。あとRailsは少しだけ。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?