如何配置 Lambda 函数以从另一个 AWS 账户代入角色?

上次更新日期:2020 年 10 月 22 日

我需要 AWS Lambda 函数从另一个 AWS 账户代入角色来执行特定任务。我该如何进行配置?

简短描述

您可以出于以下原因,授予在一个账户(“账户 A”)中创建的 Lambda 函数从另一个账户(“账户 B”)代入角色的权限:

有关更多信息,请参阅将基于资源的策略用于 AWS Lambda

解决方法

如果您尚未这样做,请配置这两个 AWS Identity and Access Management (IAM) 角色

  • 执行角色 – 账户 A 中的主要角色,向 Lambda 函数授予执行其工作的权限。
  • 代入的角色 – 账户 B 中的角色,账户 A 中的 Lambda 函数会代入该角色,以获取跨账户资源的访问权限。

然后,按照以下说明操作:

1.    将该 IAM 策略附加到您的 Lambda 函数在账户 A 中的执行角色,以代入账户 B 中的角色:

注意:222222222222 替换为账户 B 的 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"
    }
}

2.    将账户 B 中代入角色的信任策略修改为以下内容:

注意:111111111111 替换为账户 A 的 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"
        }
    ]
}

3.    更新 Lambda 函数代码,以添加 AWS Security Token Service (AWS STS) AssumeRole API 调用。此调用将返回一组凭证,您可以使用这些凭证创建服务客户端。使用此客户端时,您的函数具有代入角色为其授予的权限,并且工作时被视为属于账户 B。如需更多信息,请参阅“适用于 Python (Boto 3) 的 AWS SDK”文档中的 assume_role

您可以使用以下 Python 函数代码作为自己的使用案例的示例。此代码按原样提供。

注意:222222222222 替换为账户 B 的 AWS 账户 ID。将 role-on-source-account 替换为已代入角色的名称。

import boto3

def lambda_handler(context, event):

    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"

这篇文章对您有帮助吗?


您是否需要账单或技术支持?