【问题标题】:How do I correctly call a lambda function in another account from a lambda?如何从 lambda 正确调用另一个帐户中的 lambda 函数?
【发布时间】:2020-11-11 02:22:24
【问题描述】:

我在从帐户 A 中的不同 lambda 调用帐户 B 中的 lambda 时遇到问题。

账户 A 的角色 arn 是 arn:aws:iam::ACCOUNT_A:role/DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP

账户 A 的角色名称是 DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP

账户B的角色名称是Chris-APIStack1-Q6AJ1PZ8V-LambdaCrossAccountExecut-1N3JU88L5AON1

账户 B 的角色 arn 是 arn:aws:lambda:us-east-1:462087996972:function:GetActiveDeviceIdsLambdaChris

对于帐户 A,我的 lambda 角色具有以下权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::ACCOUNT_B:role/Chris-APIStack1-Q6AJ1PZ8V-LambdaCrossAccountExecut-1N3JU88L5AON1",
            "Effect": "Allow"
        },
        {
            "Action": "lambda:InvokeFunction",
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:iam::ACCOUNT_B:role/Chris-APIStack1-Q6AJ1PZ8V-LambdaCrossAccountExecut-1N3JU88L5AON1",
            "Effect": "Allow"
        }
    ]
}

账户 B 中的我的 lambda 具有以下使用 cloudformation 定义的角色:

    "CrossAccountExecutionRoleDemo": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "AWS": "arn:aws:sts::ACCOUNT_A:role/DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP"
              },
              "Action": "sts:AssumeRole"
            },
            {
              "Effect": "Allow",
              "Principal": { "Service": ["lambda.amazonaws.com"] },
              "Action": ["sts:AssumeRole"]
            }
          ]
        }
      }
    },
    "CrossAccountExecutionPolicyDemo": {
      "Type": "AWS::IAM::ManagedPolicy",
      "Properties": {
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": "lambda:InvokeFunction",
              "Resource": { "Fn::GetAtt": ["GetActiveDeviceIdsLambdaDemo", "Arn"] }
            }
          ]
        },
        "Roles": [
          {
            "Ref": "CrossAccountExecutionRoleDemo"
          }
        ]
      }
    }

当我提出以下请求时,我得到一个错误

let roleArn = 'arn:aws:iam::ACCOUNT_B:role/Chris-APIStack1-Q6AJ1PZ8V-CrossAccountExecutionRol-1ANKXFZ6YS23'
sts.assumeRole(
      {
        RoleArn: roleArn,
        RoleSessionName: 'NightlySimService',
      }, function(err, res){ ... }

错误:

' AccessDenied:用户:arn:aws:sts::ACCOUNT_A:assumed-role/DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP/DeviceApiStack-nightlySimServiceLambdaA51B2AFE-JSUFU8F5BZGC 无权执行:sts:AssumeRole 资源:arn:aws:iam::ACCOUNT_B:role /Chris-APIStack1-Q6AJ1PZ8V-CrossAccountExecutionRol-1ANKXFZ6YS23F '

【问题讨论】:

  • 基本流程是:Account-A 中的 Lambda 函数调用 Role-B 上的 AssumeRole。然后它使用这些临时凭证在 Lambda-B 上调用 Invoke。 Role-A 不需要授予 Lambda-A 调用 Invoke 的权限,因为 Role-A 不会用于调用 Lamda-B。相反,需要授予 Role-B 调用 Lambda-B 的权限。

标签: amazon-web-services aws-lambda amazon-cloudformation


【解决方案1】:

我可以在角色中发现两个明显的问题,这可能是您的错误的原因。

首先。 不正确的原则

  "Principal": {
      "AWS": "arn:aws:sts::ACCOUNT_A:role/DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP"
   },

正如您所写,角色 arn 是 arn:aws:iam::ACCOUNT_A:role/DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP,与您在 Principal 中提供的内容不匹配。

第二。 资源不正确

  {
     "Action": "lambda:InvokeFunction",
     "Resource": "arn:aws:iam::ACCOUNT_B:role/Chris-APIStack1-Q6AJ1PZ8V-LambdaCrossAccountExecut-1N3JU88L5AON1",
     "Effect": "Allow"
  }

lambda:InvokeFunction 操作适用于 lambda 函数,而不是 IAM 角色。因此,Resource 应该是 lambda 的 ARN。

可能还有更多问题,目前还不是很明显。

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2022-12-05
    • 2018-10-26
    • 1970-01-01
    • 2021-09-23
    • 2019-07-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多