この記事は公開されてから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 関数を設定するにはどうすればよいですか?