Ресурс с идентификатором [ApiGatewayLambdaS3Event] недопустим. свойство BucketName не определено для ресурса типа S3

#python-3.x #amazon-web-services #amazon-s3 #aws-sam

#python-3.x #amazon-web-services #amazon-s3 #aws-sam

Вопрос:

Я добавляю событие S3 в свой файл sam.yaml для запуска лямбда-функции при добавлении файла в корзину.

Триггер для этих функций, которые я буду создавать, будет для существующих сегментов S3. Смогу ли я создать триггеры для существующих сегментов с помощью SAM или мне нужно будет создавать триггеры вручную?

Однако я получаю следующую ошибку

 Resource with id [ApiGatewayLambdaS3Event] is invalid. property BucketName not defined for resource of type S3
 

Вот мой шаблон.файл yaml, который я создал со всеми лямбда-функциями и триггерами, которые я пытаюсь создать.

 AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: CD Demo Lambda
Resources:
  CDDemoLambda:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.6
      CodeUri: ./FunctionOne
      FunctionName: CDDemoLambda
      Description: 'Lambda function for CD Demo Test'
      MemorySize: 128
      Timeout: 30
      Events:
        getAZsAPI:
          Type: Api
          Properties:
            Path: /getazs
            Method: get
            
  HelloWorld:
    Type: 'AWS::Serverless::Function'
    Properties:
      AutoPublishAlias: qaTest
      Handler: qa-hello-world.lambda_handler
      Runtime: python3.6
      CodeUri: ./FunctionTwo
      FunctionName: HelloWorld
      Description: 'Hello WOrld'
      
  ApiGatewayLambda:
    Type: 'AWS::Serverless::Function'
    Properties:
      AutoPublishAlias: apigateway
      Handler: lambdafunctionthree.lambda_handler
      Runtime: python3.6
      FunctionName: ApiGatewayLambda
      CodeUri: ./FunctionThree
      Description: 'Hello WOrld'
 

Какие изменения мне нужно внести, чтобы добавить триггер события S3, который будет создан вместе с моей лямбда-функцией.

Ответ №1:

Из документации

Вы можете дополнительно смешивать и сопоставлять, какие события вы хотите, чтобы ваш лямбда-код вызывался.

     AWSTemplateFormatVersion: '2010-09-09'
    Transform: 'AWS::Serverless-2016-10-31'
    Description: CD Demo Lambda
    Resources:
    CDDemoLambda:
        Type: 'AWS::Serverless::Function'
        Properties:
        Handler: lambda_function.lambda_handler
        Runtime: python3.6
        CodeUri: ./FunctionOne
        FunctionName: CDDemoLambda
        Description: 'Lambda function for CD Demo Test'
        MemorySize: 128
        Timeout: 30
        Events:
            getAZsAPI:
            Type: Api
            Properties:
                Path: /getazs
                Method: get
    SrcBucket:
        Type: 'AWS::S3::Bucket'

    HelloWorld:
        Type: 'AWS::Serverless::Function'
        Properties:
        AutoPublishAlias: qaTest
        Handler: qa-hello-world.lambda_handler
        Runtime: python3.6
        CodeUri: ./FunctionTwo
        FunctionName: HelloWorld
        Description: 'Hello WOrld'
        Policies:
            S3ReadPolicy:
            BucketName: !Ref SrcBucket
            Events:
                CreateThumbnailEvent:
                Type: S3
                Properties:
                    Bucket: !Ref SrcBucket
                    Events: s3:ObjectCreated:*

    LambdaInvokePermission:
        Type: 'AWS::Lambda::Permission'
        Properties:
        FunctionName: !GetAtt HelloWorld.Arn
        Action: 'lambda:InvokeFunction'
        Principal: 's3.amazonaws.com'
        SourceAccount: !Sub ${AWS::AccountId}
        SourceArn: !GetAtt SrcBucket.Arn

    ApiGatewayLambda:
        Type: 'AWS::Serverless::Function'
        Properties:
        AutoPublishAlias: apigateway
        Handler: lambdafunctionthree.lambda_handler
        Runtime: python3.6
        FunctionName: ApiGatewayLambda
        CodeUri: ./FunctionThree
        Description: 'Hello WOrld'
 

Комментарии:

1. привет, спасибо, действительно ценю это. смогу ли я использовать свое существующее ведро или мне нужно указать новое имя ведра?