AWS:Lambda 权限策略可以有来自目标组的带有通配符的源吗?

Osc*_*yes 6 amazon-web-services aws-cloudformation aws-lambda

我目前正在尝试将大部分 lambda 集成与 cloudformation 堆栈中的负载平衡器设置,并且我正在向 lambda 函数添​​加权限以允许lambda:InvokeFunction来自 elbv2 目标组的操作,所以我想有权限中的 sourceArn 是这样的:

arn:aws:elasticloadbalancing:eu-west-1:######:targetgroup/*/*
Run Code Online (Sandbox Code Playgroud)

在这一点上,我只是在没有在堆栈中添加目标组资源的情况下进行测试,但是在 cloudformation 中进行部署并检查 lambda 函数的组成方式后,aws 显示错误:

An error occurred while listing alb relations: 'arn:aws:elasticloadbalancing:eu-west-1:#######:targetgroup/*/*' is not a valid target group ARN (Service: AmazonElasticLoadBalancing; Status Code: 400; Error Code: ValidationError; Request ID: 2ec4bd65-816b-11e9-b1a8-3d113de48409)
Run Code Online (Sandbox Code Playgroud)

lambda 中的策略结果是这样组成的:

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "project-dev-FixturesDashgetAllLambdaPermission-17SATFJ9GT266",
      "Effect": "Allow",
      "Principal": {
        "Service": "elasticloadbalancing.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:eu-west-1:######:function:project-dev-fixtures-getAll",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:elasticloadbalancing:eu-west-1:#######:targetgroup/*/*"
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

这是由无服务器框架完成的,但输出堆栈资源如下所示:

{
  "FixturesDashgetAllLambdaPermission": {
    "Type": "AWS::Lambda::Permission",
    "Properties": {
      "Action": "lambda:InvokeFunction",
      "Principal": {
        "Fn::Join": [
          "",
          [
            "elasticloadbalancing.",
            {
              "Ref": "AWS::URLSuffix"
            }
          ]
        ]
      },
      "FunctionName": {
        "Fn::GetAtt": [
          "FixturesDashgetAllLambdaFunction",
          "Arn"
        ]
      },
      "SourceArn": {
        "Fn::Join": [
          "",
          [
            "arn:",
            {
              "Ref": "AWS::Partition"
            },
            ":elasticloadbalancing:",
            {
              "Ref": "AWS::Region"
            },
            ":",
            {
              "Ref": "AWS::AccountId"
            },
            ":targetgroup/*/*"
          ]
        ]
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

由于 lambda 显示错误,指出 sourceArn 无效,这让我想知道 sourceArn 是否允许在目​​标组资源上使用通配符,我检查了serverless具有定义函数的默认堆栈确实生成了这样的权限,我创建了我的自己的权限基于生成的权限,唯一的区别是 sourceArn。

Osc*_*yes 1

经过多次测试,我发现AWS permission policy不支持使用通配符定位资源名称,因为我为此所做的工作是在 上完成的serverless,我最终编写了一个插件脚本来为动态创建的每个资源创建一个策略在模板化的.

当然,这最终会为模板中创建的每个 lambda 函数创建额外的资源,因此请务必记住创建的 lambda 函数的数量,因为这可能会很快达到模板中的资源限制。

我本可以仅出于此目的创建一个子模板,但目前我正在处理此问题,这似乎没有必要。