AWS Lambda 関数に、別の AWS アカウントで AWS Identity and Access Management (IAM) ロールを引き受けさせたいと考えています。
簡単な説明
Lambda 関数に別のアカウントの IAM ロールを引き継がせるには、次の手順を実行します:
- Lambda 関数の実行ロールを設定して、関数が別の AWS アカウントの IAM ロールを引き受けられるようにします。
- クロスアカウント IAM ロールの信頼ポリシーを変更して、Lambda 関数がロールを引き継げるようにします。
- AWS Security Token Service (AWS STS) の AssumeRole API 呼び出しを Lambda 関数のコードに追加します。
注: Lambda 関数は別のアカウントの IAM ロールを引き受け、Amazon Simple Storage Service (Amazon S3) バケットなどのリソースにアクセスできます。Lambda 関数は、インスタンスの起動や停止などのタスクを実行する役割を担うこともできます。
解決策
注: 以下の手順例では、2 種類のアカウントを参照しています:
- ラムダ関数 111111111111 をホストするホームアカウント
- ラムダ関数が引き受ける IAM ロールを含むクロスアカウント、222222222222
前提条件
クロスアカウントで使用したい IAM ロールを作成します。
Lambda 関数の実行ロールを設定して、関数が別のアカウントの IAM ロールを引き受けられるようにします
アカウント 111111111111 の Lambda 関数の IAM ロールに次のポリシーステートメントを追加します:
注: 222222222222 を、関数が引き受けるクロスアカウントロールのアカウント 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 関数が存在するアカウントのアカウント ID に置き換え、my-lambda-execution-role を関数の IAM ロールの名前に置き換えます。
{
"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 関数のコードに追加します
AWS STS AssumeRole API 呼び出しを関数のコードに追加するには、「Lambda 関数オプションの設定」のステップを完了してください。
**注:**AWS STS AssumeRole API 呼び出しは、サービスクライアントの作成に使用できる認証情報を返します。サービスクライアントを使用すると、引き受けたロールに付与された権限が Lambda 関数に付与されます。詳細については、AWS 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 のリソースベースのポリシーを使用します
Lambda リソースアクセス許可
IAM ロールへの切り替え (AWS API)
IAM ロールのトラブルシューティング
Python によるLambda 関数の構築