Lambdaから別アカウントのS3にアクセスしてみました。


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

前提

・Lambda 関数のアカウントを111111111111とし、S3バケットのアカウントを222222222222とします。
・別アカウント(222222222222)のS3バケットが作成済みであること
・別アカウント(222222222222)で使用する IAM ロールが作成され、AmazonS3ReadOnlyAccessがアタッチされていること。

構成図

手順

アカウント111111111111の作成手順

ロール作成とポリシーのアタッチを下記のリンクを参照
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_job-functions_create-policies.html

my-lambda-execution-roleの作成
説明:関数が別の AWS アカウントで IAM ロールを引き受けることを許可する Lambda 関数の実行ロールを設定します。

ポリシーの作成

Account222222222222-S3Read
※「222222222222」をS3バケットのアカウントに読み替えてください。

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::222222222222:role/role-on-source-account"
    }
}

ポリシーのアタッチ

下記のポリシーを「my-lambda-execution-role」ロールにアタッチします。
・Account222222222222-S3Read(別アカウント(222222222222)のS3バケットアクセス用ポリシー)
・AWSLambdaExecute(Lambda実行ポリシー)

アタッチ済みの画面が下記ようになります。

Lambda関数の作成

Lambda関数のコード(Python)
※「222222222222」をS3バケットのアカウントに読み替えてください。

import boto3

def lambda_handler(event, context):

    sts_connection = boto3.client('sts')
    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::222222222222:role/role-on-source-account",
        RoleSessionName="cross_acct_lambda"
    )

    ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
    SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
    SESSION_TOKEN = acct_b['Credentials']['SessionToken']

    # create service client using the assumed role credentials, e.g. S3
    s3 = boto3.resource('s3',
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY,
        aws_session_token=SESSION_TOKEN,
    )

    bucket = s3.Bucket('kbydev3-tyo-s3-test01')
    print(bucket.name)
    print([obj_summary.key for obj_summary in bucket.objects.all()])

Lambdaの作成

Lambda関数のコード(Python)を下記の画面にコピーペーストして、「Deploy」をクリックします。

アカウント222222222222の作成手順

ロールの確認

(222222222222)で使用する IAM ロールが作成され、AmazonS3ReadOnlyAccessがアタッチされていることを確認します。
※上記のロールが作成されていることを前提としていますが、
作成されてない場合、作成してください。(作成方法を下記のリンクを参照)
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_job-functions_create-policies.html

IAM ロールとアタッチされているポリシーが下記のように表示されます。

信頼関係の更新

信頼関係ポリシーのjson
※「111111111111」をLambdaのアカウントに読み替えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/my-lambda-execution-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

信頼関係を更新すると下記のように表示されます。

Lamdbaの動作確認

S3バケットの確認(アカウント222222222222)


Lamdba関数のテスト(アカウント111111111111)
テストの作成

テスト実行

ログの確認

参考

別の AWS アカウントで IAM ロールを引き受けるように Lambda 関数を設定するにはどうすればよいですか?

Last modified: 2022-05-03

Author