Open4

別アカウントのS3バケットを読み取る方法の調査メモ

shimi7oshimi7o

S3のアクセス制御について復習。

https://qiita.com/K5K/items/ef6a02aee760b128a25b#各機能の比較

アクセス制御の方法は4種類ある。
バケット単位で制御するときは、バケットポリシーを用いるのが手軽。

  1. ACL
  2. バケットポリシー
  3. IAM
  4. パブリックブロックアクセス

https://dev.classmethod.jp/articles/s3-acl-wakewakame/

ACLを設定せずにバケットポリシーだけ設定すればよさそう。

shimi7oshimi7o

S3バケットのバケットポリシーを下記のように設定する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{アクセスを許可するAWSアカウントID}:root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::{S3バケット名}/*",
                "arn:aws:s3:::{S3バケット名}"
            ]
        }
    ]
}
shimi7oshimi7o

別アカウントのLambdaからアクセスする。
LambdaのIAMロールにS3 Full Access権限をつけておく。

import json
import boto3

client = boto3.client('s3')

def lambda_handler(event, context):
    response = client.get_object(Bucket='{バケット名}',Key='{オブジェクト名}')
    body = response['Body'].read()    
    print(body)
    
    return {
        'statusCode': 200,
    }

shimi7oshimi7o

Lambdaのテスト実行でファイルが読めることが確認できた。