Handler.py首先从环境变量中提取默认值
s3 = boto3.client('s3')
size = int(os.environ['THUMBNAIL_SIZE'])
Events block.在aws lambda里面有很多event可以被trigger, 比如s3, dynamodb等等。这里我们使用s3
functions:
s3-thumbnail-generator:
handler: handler.s3_thumbnail_generator
events:
- s3:
bucket: ${self:custom.bucket}
event: s3:ObjectCreated:*
rules:
- suffix: .png
- 这里rules设置为后缀为.png的对象。也就是说,其他发生在bucket的任何操作,比如delete, someting gets erased,不会trigger我们这里要启用的函数。可是如果对象是一个png文件,如果它被创建了(s3:ObjectCreated), 就会trigger这里的函数.
- ${self:custom.bucket}是定义了一个serverless framework的变量.把全局变量custom.bucket: stephane-s3-thumbnail-generator引用到这里.custom这样定义这样就能反复使用bucket这个变量
custom:
bucket: stephane-s3-thumbnail-generator
pythonRequirements:
dockerizePip: true
- 通过plugins来设置整个环境需要预先安装的python库.
plugins:
- serverless-python-requirements
-
同时要注意s3: 后面的空格数要是两个tabs,否则会报错:“Configuration warning at ‘functions[‘s3-thumbnail-generator’].events[0]’: unsupported function event”
-
Suffix:跟.png要有个空格,保证suffix是个object
-
这里一定要把bucket: stephane-s3-thumbnail-generator改为bucket: yourname-s3-thumbnail-generator. 因为amazon s3有一个global namespace,类似跨用户的全局变量空间,不能有两个s3 bucket有相同的名称,否则会不断报错。
Jianhuas-MBP-3:python-s3-thumbnail jianhuama$ sls deploy -v ...... S3BucketStephanes3thumbnailgenerator CloudFormation - CREATE_FAILED - AWS::S3::Bucket - S3BucketStephanes3thumbnailgenerator ...... Serverless Error --------------------------------------- An error occurred: S3BucketStephanes3thumbnailgenerator - stephane-s3-thumbnail-generator already exists. Get Support -------------------------------------------- Docs: docs.serverless.com Bugs: github.com/serverless/serverless/issues Issues: forum.serverless.com Your Environment Information --------------------------- Operating System: darwin Node Version: 15.5.0 Framework Version: 2.19.0 Plugin Version: 4.4.2 SDK Version: 2.3.2 Components Version: 3.4.7
如果报错,要先运行
sls remove
, 然后改变custom变量,再重新部署。
关于s3 bucket的命名:
https://docs.rightscale.com/faq/clouds/aws/What_are_valid_S3_bucket_names.html#:~:text=Amazon%20S3%20has%20a%20global,name%20when%20creating%20S3%20buckets.