【问题标题】:AWS Cloudwatch event/rule trigger Lambda Cloudformation TemplateAWS Cloudwatch 事件/规则触发器 Lambda Cloudformation 模板
【发布时间】:2022-11-03 04:23:46
【问题描述】:

在 AWS 中,我创建了一个 CloudTrail,然后由 Eventbridge 规则过滤,以仅在 CloudTrail 中查找与在 AWS 上创建的资源相对应的某些事件。原因是我为 Lambda 创建了一些代码,这些代码将根据从 Eventbridge 传递给它的事件自动标记资源。当我手动将 eventbridge 规则和 lambda 连接在一起时,一切正常。但是,当我使用 Cloudformation 部署我的堆栈时,我的 Lambda 没有将 Eventbridge 显示为该函数的事件源/触发器,我不知道为什么。下面是我的 Cloudformation 模板以及 AWS Lambda 上显示的内容与我期望看到的内容。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

# ---------------------------------------------------------------------------- #
#                               Input parameters                               #
# ---------------------------------------------------------------------------- #

Parameters:
  ProjectName:
    Type: String
    Default: 'AutoTagger'
    Description: ""

# ---------------------------------------------------------------------------- #
#                                   Resources                                  #
# ---------------------------------------------------------------------------- #

Resources:
  AutoTaggerLambda:
    Type: AWS::Serverless::Function
    Name: auto-tagger-lambda
    Properties:
      CodeUri: release/archive.zip
      Handler: auto-tagger/main.lambda_handler
      Runtime: python3.9
      Policies: [AWSLambda_FullAccess]
      MemorySize: 128
      Timeout: 30
    Tags:
      - Key: "project_name"
        Value: !Ref ProjectName

  TagEvents:
      Type: "AWS::Events::Rule"
      Properties:
        Description: "Rule to trigger lambda"
        Name: "TagEvents"
        EventPattern: {
                        "detail-type": ["AWS API Call via CloudTrail"],
                        "detail": {
                          "eventSource": ["ec2.amazonaws.com", "rds.amazonaws.com", "lambda.amazonaws.com", "s3.amazonaws.com", "dynamodb.amazonaws.com", "elasticfilesystem.amazonaws.com"],
                          "eventName": ["CreateVolume", "RunInstances", "CreateImage", "CreateSnapshot", "CreateDBInstance", "CreateFunction20150331", "UpdateFunctionConfiguration20150331v2", "UpdateFunctionCode20150331v2", "CreateBucket", "CreateTable", "CreateMountTarget"]
                        }
                      }
        State: "ENABLED"
        Targets:
          - Arn: !GetAtt AutoTaggerLambda.Arn
            Id: "TagEventsTargetLambda"

我还需要向 lambda 添加事件吗?我有点困惑。

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudformation aws-sam aws-event-bridge


    【解决方案1】:

    您缺少权限。 AWS::Lambda::Permission 资源为您的 EventBridge 规则提供调用 Lambda 的权限。它被添加到 Lambda 的resource-based policy

    PermissionForEventsToInvokeLambda:
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName: !GetAtt AutoTaggerLambda.Arn
        Action: 'lambda:InvokeFunction'
        Principal: 'events.amazonaws.com'
        SourceArn: !GetAtt TagEvents.Arn
    

    【讨论】: