如何创建仅限于一个 TargetGroup 的权限?

如何创建仅限于一个 TargetGroup 的权限?

如何创建仅限于一个 TargetGroup 的权限(授予调用某个 lambda 函数的权限)?

这听起来可能很简单,但问题有几个不同的复杂之处:

  • 如果没有SourceArn: !Ref MyTargetGroup下面示例中的部分,我假设权限将允许所有 TargetGroup 调用 MyLambda,而不仅仅是我想要的那个(对吗?)。
  • 我需要继续DependsOn: LambdaInvokePermission使用 TargetGroup,否则从头开始部署时启动有时会失败(如果 TargetGroup 恰好是在 Permission 之前创建的,就会发生这种情况,因为 TargetGroup 没有权限调用 lambda,整个启动将失败)。
  • 通过添加SourceArn: !Ref MyTargetGroup如下例所示的内容,我引入了循环依赖,这是不行的。
  MyTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    DependsOn: LambdaInvokePermission
    Properties:
      HealthCheckEnabled: false
      TargetType: lambda
      Targets:
        - Id: !GetAtt MyLambda.Arn

  LambdaInvokePermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt MyLambda.Arn
      Action: lambda:InvokeFunction
      Principal: elasticloadbalancing.amazonaws.com
      SourceArn: !Ref MyTargetGroup

我还尝试为 TargetGroup 指定一个明确的名称,然后静态构造 SourceArn(以避免模板中出现明确的循环依赖),但它不起作用,因为TargetGroups 始终会在 ARN 末尾附加一些随机字符串

有任何想法吗?

(这个问题最初发布于 Stack Overflow,但我收到反馈说它更适合这里。)

答案1

因此,在与 AWS 支持人员取得联系后,我感觉我并没有错。他们的推荐的解决方案方法是给 TargetGroup 指定一个明确的名称,然后在 SourceArn 末尾使用通配符来绕过附加到 TargetGroups ARN 的随机字符串。以下是示例:

MyTargetGroup:
  Type: AWS::ElasticLoadBalancingV2::TargetGroup
  DependsOn: LambdaInvokePermission
  Properties:
    Name: my-target-group
    HealthCheckEnabled: false
    TargetType: lambda
    Targets:
      - Id: !GetAtt MyLambda.Arn

LambdaInvokePermission:
  Type: AWS::Lambda::Permission
  Properties:
    FunctionName: !GetAtt MyLambda.Arn
    Action: lambda:InvokeFunction
    Principal: elasticloadbalancing.amazonaws.com
    SourceArn: !Sub "arn:${AWS::Partition}:elasticloadbalancing:${AWS::Region}:${AWS::AccountId}:targetgroup/my-target-group/*"

这种方法的缺点是,通过明确命名资源,将来修改它们会变得更加困难。因此,如果您有任何其他想法,欢迎分享。

相关内容