如何配置 Lambda 函数以代入另一个 AWS 账户中的 IAM 角色?
上次更新日期:2022 年 2 月 17 日
我需要 AWS Lambda 函数代入另一个 AWS 账户中的 AWS Identity and Access Management(IAM)角色。该如何设置?
简短描述
要让您的 Lambda 函数代入其他 AWS 账户中的 IAM 角色,请执行以下操作:
- 配置 Lambda 函数的执行角色以允许该函数代入另一个 AWS 账户中的 IAM 角色。
- 修改跨账户 IAM 角色的信任策略,以允许您的 Lambda 函数代入该角色。
- 将 AWS Security Token Service(AWS STS)AssumeRole API 调用添加到 Lambda 函数的代码中。
注意:Lambda 函数可以代入另一个 AWS 账户中的 IAM 角色以执行以下任一操作:
- 访问资源 – 例如,访问某个 Amazon Simple Storage Service(Amazon S3)存储桶。
- 执行任务 – 例如,启动和停止实例。
解决方法
注意:下面的示例过程涉及两种不同类型的 AWS 账户:
- 托管 Lambda 函数的主账户(111111111111)。
- 包含 Lambda 函数要代入的 IAM 角色的跨账户(222222222222)
该过程代入:
- 您已创建要在跨账户(222222222222)中使用的 IAM 角色
配置 Lambda 函数的执行角色以允许该函数代入另一个 AWS 账户中的 IAM 角色
按照添加和删除 IAM 身份权限中的说明,将以下策略语句添加到 Lambda 函数的执行角色(在账户 111111111111 中):
重要提示:将 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 函数代入该角色
按照修改角色信任策略(控制台)中的说明,将以下策略语句添加到跨账户 IAM 角色的信任策略(在账户 222222222222 中)中:
重要提示:用 Lambda 函数所在账户的 AWS 账户 ID 替换 111111111111。将 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 函数具有代入角色授予的权限。有关更多信息,请参阅适用于 Python 的 AWS 开发工具包 (Boto 3) 文档中的 assume_role。
包含 AWS STS AumerOLE API 调用的 Python 函数代码示例
重要提示:将 22222222222222 替换为函数代入的跨账户角色的 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"