##目的
##準備するもの
- アカウントA
- Lambda用IAM Role
- Lambda関数
- アカウントB
- assume role用 IAM Role
作成
###アカウントB
Role
ポリシーはアクセスしたいリソースによって変える
信頼関係を以下のように編集する
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::アカウントAのアカウント番号:role/LambdaのRole名"
},
"Action": "sts:AssumeRole"
}
]
}
アカウントA
policy
以下ポリシーを付けたRoleを作成
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::アカウントBのアカウント番号:role/アカウントBで作成したRole名"
}
}
Lambda関数
import boto3
def lambda_handler(context, event):
sts_connection = boto3.client('sts')
acct_b = sts_connection.assume_role(
RoleArn="arn:aws:iam::アカウントBのアカウント番号:role/アカウントBで作成したRole名",
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
client = boto3.client(
's3',
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
return "Hello from Lambda"
これでアカウントBにアクセスできるLambdaが完成
複数環境にアクセスしたい場合はCloudFormationとかでアカウントにIAMRole配ればできるようになるので
今後はここら辺を簡単に実装できる方法を考えたい、、、
###参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-function-assume-iam-role/