AWS Lambda 関数に、別の AWS アカウントで AWS Identity and Access Management (IAM) ロールを引き受けさせる必要があります。設定するにはどうすればよいですか。
簡単な説明
Lambda 関数が別の AWS アカウントの IAM ロールを引き受けるようにするには、次の手順を実行します。
- 関数が別の AWS アカウントで IAM ロールを引き受けることを許可する Lambda 関数の実行ロールを設定します。
- クロスアカウントの IAM ロールのトラストポリシーを変更して、Lambda 関数がロールを引き受けられるようにします。
- AWS Security Token Service (AWS STS) AssumeRole API コールを Lambda 関数のコードに追加します。
注: Lambda 関数は、次のいずれかを実行するために、別の AWS アカウントで IAM ロールを引き受けることができます。
解決方法
**注:**以下の手順例では、2 つの異なるタイプの AWS アカウントを参照しています。
- Lambda 関数 (111111111111) をホストするホームアカウントです。
- Lambda 関数が引き受ける IAM ロール (222222222222) を含むクロスアカウントです。
この手順では、以下を前提としています。
- クロスアカウントで使用する IAM ロールが作成されていること (222222222222)
関数が別の AWS アカウントで IAM ロールを引き受けることを許可する Lambda 関数の実行ロールを設定します。
「IAM アイデンティティの許可の追加および削除」の手順に従って、(アカウント 111111111111 で) Lambda 関数の実行ロールに次のポリシーステートメントを追加します。
重要: 222222222222 を、関数が引き受けるクロスアカウントロールの AWS アカウント ID に置き換えます。role-on-source-account を、引き受けたロールの名前に置き換えます。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::222222222222:role/role-on-source-account"
}
}
クロスアカウント IAM ロールの信頼ポリシーを変更して、Lambda 関数がロールを引き受けることを許可する
「ロールの信頼ポリシーの変更 (コンソール)」の手順に従って、(アカウント 222222222222 で) クロスアカウント IAM ロールの信頼ポリシーに次のポリシーステートメントを追加します。
重要: 111111111111 を、Lambda 関数が存在するアカウントの AWS アカウント ID に置き換えます。my-lambda-execution-role を関数の実行ロールの名前に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/my-lambda-execution-role"
},
"Action": "sts:AssumeRole"
}
]
}
AWS STS AssumeRole API コールを Lambda 関数のコードに追加する
「Lambda 関数オプションの設定」の手順に従って、AWS STS AssumeRole API コールを関数のコードに追加します。
注: AWS STS AssumeRole API コールは、サービスクライアントの作成に使用できる認証情報を返します。このサービスクライアントを使用することにより、Lambda 関数には、引き受けたロールによって付与された許可を有することになります。詳細については、AWS SDK for Python (Boto 3) ドキュメントの assume_role を参照してください。
AWS STS AssumeRole API コールを含む Python 関数のコード例
重要: 222222222222 を、関数が引き受けるクロスアカウントロールの AWS アカウント ID に置き換えます。role-on-source-account を、引き受けたロールの名前に置き換えます。
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
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"
関連情報
AWS Lambda のリソースベースのポリシーを使用する
AWS Lambda 許可
IAM ロール (AWS API) に切り替える
IAM ロールのトラブルシューティング
Python による Lambda 関数のビルド