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

时间:2019-05-28 17:48:29

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

我目前正在尝试通过cloudformation堆栈中的负载均衡器设置来实现大部分lambda集成,并且我正要向lambda函数添加权限以允许来自elbv2目标的操作lambda:InvokeFunction -group,所以我考虑将sourceArn授予这样的权限:

arn:aws:elasticloadbalancing:eu-west-1:######:targetgroup/*/*

这时我只是在测试中没有在堆栈中添加目标组资源,而是在以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)

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

这是通过无服务器框架完成的,但是输出堆栈资源看起来像这样:

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

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

3 个答案:

答案 0 :(得分:0)

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

当然,这最终为模板中创建的每个lambda函数创建了一个额外的资源,因此请务必牢记已创建的lambda函数的数量,因为这可能会迅速达到模板中的资源限制。 / p>

我本可以仅为此目的创建一个子模板,但此刻我正在研究它,似乎没有必要。

答案 1 :(得分:0)

1)在AWS :: Lambda :: Permission中使用通配符“ *”创建堆栈 2)成功创建堆栈后,需要对AWS :: Lambda :: Permission进行更改,即,对创建堆栈期间获得的AWS :: Lambda :: Permission的TargetGroup ARN进行硬编码。仅需要更改此代码块(在最后一行中,需要指定在初始堆栈创建期间创建的目标组的完整ARN)。

HelloWorldFunctionInvokePermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt HelloWorldFunction1234.Arn
      Action: 'lambda:InvokeFunction'
      Principal: elasticloadbalancing.amazonaws.com
      SourceArn: 'arn:aws:elasticloadbalancing:us-east-1:123456789:targetgroup/Example-TargetGroup/1234123213'

堆栈更新:当需要对堆栈进行更新(涉及更改目标组)时,应遵循以下步骤。

在模板中更新AWS :: ElasticLoadBalancingV2 :: TargetGroup逻辑名称(如果需要创建新的目标组),并删除AWS :: Lambda :: Permission资源中的'SourceArn'值和属性,并更新堆栈。重新添加“ SourceArn”属性和目标组的新ARN。

答案 2 :(得分:0)

我解决循环依赖问题,并通过以下方式将所有资源都放在一个CloudFormation模板中:

  1. 创建默认权限(没有sourceArn,principal = elasticloadbalancing.amazonaws.com)
  2. 创建目标组(dependsOn = 1)
  3. 创建权限(sourceArn = targetGroup)
  4. 创建自定义资源(lambda,dependsOn = 2&3),从lambda的策略中删除默认权限