首页 > 解决方案 > 无法通过 CloudFormation 将 IAM 角色分配为基于 AWS Lambda 资源的策略中的委托人

问题描述

我正在尝试授予 IAM 角色在InvokeFunctionlambda 函数上执行的权限。我不能简单地将附加语句添加到 IAM 角色的语句列表以允许这样做(根据系统的设计,这不是我需要的方法)。

我尝试在 CloudFormation 模板中创建 AWS::Lambda::Permission 资源,然后执行 UpdateStack。我在 UI 中收到以下错误:

CREATE_FAILED 属性 Principal 的值必须是 String 类型

以下是在 UpdateStack 期间引发错误的 CloudFormation 资源

"ResourceBasedPermission": {
        "Type": "AWS::Lambda::Permission",
        "Properties": {
            "Action": "lambda:InvokeFunction",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXX:role/XXXXXXX"
            },
            "FunctionName": {
                "Fn::GetAtt": [
                    "LambdaFunction",
                    "Arn"
                ]
            }
        }
    }

但是,我可以在 Lambda UI 中创建这个基于资源的策略,并且在测试时可以正常工作(请参阅它在 UI 中为我呈现的策略文档):

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "test123",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::XXXXXX:role/XXXXXX"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": <arn_to_the_lambda>
    }
  ]
}

最后我不认为这是相关的......但以下消息显示在https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html的文档中:

Note 您只能在 AddPermission 和 AddLayerVersionPermission API 操作的范围内为 Lambda 资源更新基于资源的策略。目前,您无法以 JSON 格式为您的 Lambda 资源编写策略,或使用未映射到这些操作参数的条件。

标签: amazon-web-serviceslambdaaws-lambdaamazon-cloudformationamazon-iam

解决方案


推荐阅读