如何创建仅限于一个 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/*"
这种方法的缺点是,通过明确命名资源,将来修改它们会变得更加困难。因此,如果您有任何其他想法,欢迎分享。