python-3.x Lambda函数未被授权执行sts:AssumeRole

bis0qfac  于 2023-05-19  发布在  Python
关注(0)|答案(3)|浏览(94)

我在帐户A中有一个lambda函数,试图从帐户B访问资源。创建了一个新的lambda角色,具有基本的执行权限,可以将日志上传到云监视。
下面是我在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!')
    }

还修改了帐户B中假定角色的信任策略,如文档中所述:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/
错误:调用AssumeRole操作时发生错误(AccessDenied):用户:arn:aws:sts::1111111:assumed-role/lambda-role/lambda-function未被授权执行:sts:资源上的AssumeRole:arn:aws:iam::2222222222:role/role-on-source-account”
注意:我可以在我的本地成功运行这个,但不能在lambda中运行。

v2g6jxz6

v2g6jxz61#

创建了一个新的lambda角色,具有基本的执行权限,可以将日志上传到云监视
lambda的基本执行角色是不够的。您需要显式地允许您的函数AssumeRole。执行角色中的以下语句应该有所帮助:

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

vc9ivgsu2#

好的,我们有:

  • 您的(您自己的 * 受信任的 * 帐户)帐户A需要在帐户B中承担特定的角色
  • 在AccountB(trusting 帐户)中的角色,您的lambda将访问该角色,比方说是一个bucket上。
  • 帐户BBucket

你提到你的lambda有基本的执行,光是这是不够的...
解决方案:
1.创建角色“UpdateBucket”:您需要在AccountB(帐户ID号:999)和AccountA之间建立信任。
创建IAM角色并将AccountA定义为可信实体,指定允许可信用户更新AccountB_resource(AccountBBucket)的权限策略。
我们现在在A账户

{
  "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/*"
    }
  ]
}

1.授予访问权限:
我们现在将使用我们之前创建的角色,即(UpdateBucket)角色
这需要添加到您的AccountB权限中
我们现在在帐户B:``

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::999:role/UpdateBucket"
  }
}

请注意,上面的999是AccountB帐户ID,UpdateBucket是在AccountA中创建的角色
这将创建您所需的信任,以便您的lambda访问AccountB上的存储桶
更多信息在这里:Delegate Access Across AWS Accounts Using IAM Roles

pu3pd22g

pu3pd22g3#

解决方案:等待几分钟。
原因:返回的STS信息已缓存。它可以在容器上持续一段时间。要在本地删除缓存(在Mac上),可以运行

rm -rf ~/.aws/cli/cache/

相关问题