【问题标题】:Lambda function is not authorized to perform sts:AssumeRoleLambda 函数无权执行 sts:AssumeRole
【发布时间】:2020-07-26 21:09:04
【问题描述】:

我在账户 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::11111111:assumed-role/lambda-role/lambda-function 不是 授权执行: sts:AssumeRole 对资源: arn:aws:iam::2222222222:role/role-on-source-account"

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

【问题讨论】:

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


    【解决方案1】:

    好的,我们现在拥有的是:

    • 您(您自己的信任帐户)accountA 需要在 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 account Id,UpdateBucket是AccountA中创建的角色
      这将为您的 lambda 创建访问 AccountB 上的存储桶所需的信任

    更多信息在这里: Delegate Access Across AWS Accounts Using IAM Roles

    【讨论】:

    • 如文档“使用 IAM 角色跨 AWS 账户委派访问”中所述,如何在 lambda 中获取凭证:access_key、secret_key 和 session_id?
    • 您的用户/lambda 需要担任该角色。阅读我之前发送的链接,当您访问“使用 AssumeRole (AWS API)”时,请继续使用此链接:docs.aws.amazon.com/IAM/latest/UserGuide/…
    • 肯定的事,很高兴我能帮上忙 :)
    【解决方案2】:

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

    lambda 的基本执行角色是不够的。您需要明确允许您的函数使用AssumeRole。您执行角色中的以下语句应该会有所帮助:

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

    【讨论】:

    • 随着这一变化,我添加了信任关系,现在我没有收到未经授权的错误,但无法从账户 B 获取 ec2 数据,仅从账户 A 获取数据。
    • 可能与您的函数本身有关。在问题中,问题是AssumeRole权限,问题似乎解决了。也许可以针对您遇到的新问题专门提出新问题?
    猜你喜欢
    • 2023-03-19
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多