Lambda函数无权执行sts:AssumeRole

时间:2020-04-14 07:26:19

标签: python-3.x amazon-web-services aws-lambda

我在帐户A中有一个lambda函数,试图从帐户B中访问资源。创建了一个具有基本执行权限的新lambda角色,可以将日志上传到Cloud Watch。

这是我在Python 3.7中的功能代码:

import boto3

allProfiles = ['account2']

def lambda_handler(event, context):

    sts_connection = boto3.client('sts')
    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::2222222222:role/role-on-source-account",
        RoleSessionName="account2"
    )

    for profiles in allProfiles:
        print("\nusing profile %s" % profiles)
        newMethod..
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

还按照文档https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/

中所述修改了帐户B中假定角色的信任策略。

错误:调用AssumeRole时发生错误(AccessDenied) 操作:用户: arn:aws:sts :: 11111111:假定角色/ lambda-role / lambda函数不 授权执行:资源上的sts:AssumeRole: arn:aws:iam :: 2222222222:role / role-on-source-account“

注意:我可以在本地成功运行此代码,但不能在lambda中运行此代码。

2 个答案:

答案 0 :(得分:3)

创建了一个具有基本执行权限的新lambda角色,可以将日志上传到Cloud Watch

lambda的基本执行角色还不够。您需要明确允许您的功能AssumeRole。执行角色中的以下语句应有所帮助:

{
  "Effect": "Allow",
  "Action": [
    "sts:AssumeRole"
  ],
  "Resource": [
    "arn:aws:iam::2222222222:role/role-on-source-account"
  ]
}

答案 1 :(得分:1)

好的,我们所拥有的是:

  • 您的(您自己的受信任的帐户)帐户A需要在AccountB帐户中承担特定角色
  • 您的lambda将访问的AccountB(信任帐户)中的角色,比如说是一个存储桶。

  • AccountBBucket

您提到您的lambda具有基本执行能力,仅凭这还不够...

解决方案:

  1. 创建一个角色“ UpdateBucket”: 您需要在AccountB(帐户ID号:999)和AccountA之间建立信任。
    创建一个IAM角色,并将AccountA定义为受信任的实体,指定允许受信任的用户更新AccountB_resource(AccountBBucket)的权限策略。
    我们现在在AccountA中了

    
    
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "s3:ListAllMyBuckets",
          "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
           ],
          "Resource": "arn:aws:s3:::AccountBBucket"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
          ],
          "Resource": "arn:aws:s3:::AccountBBucket/*"
        }
      ]
    }
    
    
  2. 授予访问权限:
    我们现在将使用我们先前创建的角色,(UpdateBucket)角色
    这需要添加到您的AccountB权限中
    我们现在在AccountB中:

    {
      "Version": "2012-10-17",
      "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::999:role/UpdateBucket"
      }
    }
    
    请注意,上面的999是AccountB帐户ID,UpdateBucket是在AccountA中创建的角色
    这将创建您的lambda访问AccountB

  3. 上的存储桶所需的信任

有关此处的更多信息: Delegate Access Across AWS Accounts Using IAM Roles