python - 如何以编程方式将 lambda 监听器规则注册到 ALB?

标签 python amazon-web-services aws-lambda

鉴于 Cloudformation 目前不支持 ALB Lambda 集成,我正在尝试编写一个简单的脚本来创建目标组,将 lambda 注册到目标组,然后将监听器规则指向该目标组。

当我通过用户界面执行此操作时,这是有效的,但是我尝试将 lambda 目标注册到目标组失败(在 python 脚本和 cli 中):

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the RegisterTargets operation: elasticloadbalancing principal does not have permission to invoke <LAMBDA ARN> from target group <TARGET GROUP ARN>

下面是执行此操作的 python 脚本:

import boto3
import os

environment = os.environ['ENV']
cloudformation = boto3.resource('cloudformation')
elb = boto3.client('elbv2')

stack = cloudformation.Stack('boomerang')

output = [x for x in stack.outputs if x['ExportName'] == 'boomerang-beacon-lambda'][0]
beacon_arn = output['OutputValue']

response = elb.create_target_group(
  TargetType='lambda',
  Name='public-%s-boomerang-beacon' % environment
)

target_group_arn = response['TargetGroups'][0]['TargetGroupArn']

elb.register_targets(
  TargetGroupArn=target_group_arn,
  Targets=[
    {
      'Id': beacon_arn
    },
  ]
)

谢谢

最佳答案

您必须创建添加 lambda 函数权限,以允许 elasticloadbalancing 主体调用您的 lambda 函数。 使用 CloudFormation,您可以添加以下资源以使其正常工作。

  LambdaFunctionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt LambdaTargetFunction.Arn
      Principal: elasticloadbalancing.amazonaws.com
      SourceArn: !Ref TargetGroup

有关 Lambda 添加权限功能的更多信息,请访问:https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html

关于python - 如何以编程方式将 lambda 监听器规则注册到 ALB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54072326/

相关文章:

python - 使用 Python 解析 DOM 以提取数据

python - 打印与我要附加到的数组不匹配

amazon-web-services - 在 DynamoDB 中批量查询 GSI?

amazon-web-services - Amazon Batch Job 不会终止

node.js - 对 salesforce 应用程序实现 oauth 登录,但刷新 token 未定义

amazon-web-services - 事件驱动的 Lambda 消息的分类?

Python 无法创建文件错误 [错误 : 183]

python - 如何在缩略图库中制作可点击的 kivy 图像

symfony - 使用 EC2 部署 Symfony2 - 最佳实践

jenkins - 如何使用 AWS Lambda 函数将文件从 S3 复制到 EC2 实例?