简体   繁体   中英

Create bucket and lambda trigger in same serverless framework

I want to create an s3 bucket, and trigger a lambda function whenever some file is uploaded to 'uploads' folder in the bucket. I want to create those resources using serverless framework in aws.

I have defined my s3 bucket configuration in under 'provider.s3', and then I am trying to reference that bucket under functions.hello.events.bucket

However, I am getting following error when i run sls package

 Serverless Error ----------------------------------------

     MyS3Bucket - Bucket name must conform to pattern (?!^(\d{1,3}\.){3}\d{1,3}$)(^(([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])$). Please check provider.s3.MyS3Bucket and/or s3 events of function "hello".

serverless.yml

service: some-service
frameworkVersion: '2'
useDotenv: true

provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  s3:
    MyS3Bucket:
      bucketName: ${env:MY_BUCKET_NAME}
      accessControl: Private
      lifecycleConfiguration:
        Rules:
          - Id: ExpireRule
            Status: Enabled
            ExpirationInDays: '7'    
package:
  individually: true

functions:
  hello:
    name: my-lambda-function
    handler: function.handler
    memorySize: 128
    timeout: 900
    events:
      - s3:
          bucket: MyS3Bucket
          event: s3:ObjectCreated:*
          rules:
            - prefix: uploads/

My next try was defining the s3 bucket under 'resources', and using the reference of the bucket in the lambda trigger. I am still getting the warning messages

Serverless: Configuration warning at 'functions.hello.events[0].s3.bucket': should be string

serverless.yml

service: some-service
frameworkVersion: '2'
useDotenv: true

provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
    
package:
  individually: true

functions:
  hello:
    name: my-lambda-function
    handler: handler.handler
    memorySize: 128
    timeout: 900
    events:
      - s3:
          bucket: 
            Ref: MyS3Bucket
          event: s3:ObjectCreated:*
          rules:
            - prefix: uploads/
          existing: true

resources:
  Resources:
    MyS3Bucket:
      Type: AWS::S3::Bucket
      Properties:
        AccessControl: Private
        BucketName: 'test.bucket'
        OwnershipControls:
          Rules:
            - ObjectOwnership: ObjectWriter
        LifecycleConfiguration:
          Rules:
            - Id: ExpireRule
              Status: Enabled
              ExpirationInDays: '7'

You should use your bucket name, not MyS3Bucket :

    events:
      - s3:
          bucket: ${env:MY_BUCKET_NAME}

Create a custom s3 bucket name variable eg

custom:
  bucket: foo-thumbnails

And use it events

events:
  - s3:
      bucket: ${self:custom.bucket}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM