serverless.yml文件的作用
- service: 声明一个serverless的service
- frameworkVersion:用于指定部署时需要的serverless版本,可以使用sls -v命令查看本地安装的serverless的版本
- plugins:定义service用到的plugin
- provider: 定义云服务提供者,比如aws
- functions:在service中定义一个或多个函数,对于aws来说,就是lambda函数
- events:定义触发函数的事件,比如http 请求,在events中定义的资源在部署时会自动创建
- resources:定义函数使用到的一系列的资源,比如AWS DynamoDB table
- variables: 可以使用变量来进行灵活配置
service
一个service可以认为是一个工程,service通过其根目录下的serverless.yml文件定义了service提供的lambda函数,触发lambda函数的events,以及lambda函数用到的各种resources.
创建service
可以使用serverless create命令使用模版创建一个service,详情请参考: AWS Serverless CLI命令参考2--Create&Install.
每个serverless.yml文件都会被翻译成一个AWS CloudFormation模版,在部署时会使用该模版创建一个CloudFormation stack.
部署service
可以使用serverless deploy命令对service进行部署,详情请参考: AWS Serverless CLI命令参考3--package&deploy
删除部署的service
可以使用serverless remove命令对service进行部署,详情请参考: AWS Serverless CLI命令参考5--rollback&remove
frameworkVersion
通过在serverless.yml文件中指定frameworkVersion属性,可以对部署该service所需的serverless的版本进行限制.通过限制版本可以避免由serverless版本升级导致的错误.
如果制定了该属性, 在运行serverless命令时会检查serverless的版本与文件中定义的版本是否一致.
指定一个确定的版本:
# serverless.yml
frameworkVersion: "=1.0.3"
service: users
provider:
name: aws
runtime: java8
memorySize: 512
指定一个版本范围
#Version Range
# serverless.yml
frameworkVersion: ">=1.0.0 <2.0.0"
service: users
provider:
name: aws
runtime: java8
memorySize: 512
plugins
插件就是用于创建新的或者扩展原有的serverless framework命令的自定义的js代码.serverless framework本身由一组核心插件构成.
插件类型包括external plugins 和 core plugins.
安装插件
external plugins需要为每个service单独安装,在service的根目录下执行如下命令即可:
npm install --save custom-serverless-plugin
使用插件
在serverless.yml中的plugins属性中指定service需要使用的插件
plugins:
- plugin1
- plugin2
配置插件
可以通过serverless.yml的custom属性配置plugin
plugins:
- custom-serverless-plugin
custom:
customkey: customvalue
provider
用于指定服务提供商,以及lambda函数或其他资源用到的公共配置等,如果lambda函数没有对这些配置进行覆盖,则会使用provider中定义的配置.
custom:
configFile: ${file(config.yml)}
provider:
name: aws
region: ${self:custom.configFile.region}
stage: ${self:custom.configFile.stage}
variant: ${self:custom.configFile.variant}
runtime: java8
timeout: 30 # The default is 6 seconds. Note: API Gateway current maximum is 30 seconds
memorySize: 1024 # Overwrite the default memory size. Default is 1024. Increase by 64.
deploymentBucket: ${self:custom.configFile.deploymentBucket}
environment: ${file(config.yml)}
stackName: ${self:provider.stage}-${self:provider.variant}-${self:service}
versionFunctions: ${self:custom.configFile.versionFunctions}
functions
配置
aws的所有lambda函数都定义在functions属性下,provider中可以对所有的function进行权限全局配置,比如runtime, timeout,每个function可以对provider的配置进行重写.
# serverless.yml
service: myService
provider:
name: aws
runtime: nodejs12.x
memorySize: 512 # optional, in MB, default is 1024
timeout: 10 # optional, in seconds, default is 6
versionFunctions: false # optional, default is true
tracing:
lambda: true # optional, enables tracing for all functions (can be true (true equals 'Active') 'Active' or 'PassThrough')
functions:
hello:
handler: handler.hello # required, handler set in AWS Lambda
name: ${opt:stage, self:provider.stage, 'dev'}-lambdaName # optional, Deployed Lambda name
description: Description of what the lambda function does # optional, Description to publish to AWS
runtime: python2.7 # optional overwrite, default is provider runtime
memorySize: 512 # optional, in MB, default is 1024
timeout: 10 # optional, in seconds, default is 6
provisionedConcurrency: 3 # optional, Count of provisioned lambda instances
reservedConcurrency: 5 # optional, reserved concurrency limit for this function. By default, AWS uses account concurrency limit
tracing: PassThrough # optional, overwrite, can be 'Active' or 'PassThrough'
functions属性下可以定义多个function
service: myService
provider:
name: aws
runtime: nodejs12.x
functions:
functionOne:
handler: handler.functionOne
description: optional description for your Lambda
functionTwo:
handler: handler.functionTwo
functionThree:
handler: handler.functionThree
function 可以通过单独的ymal文件进行定义,并在serverless.yml文件中引入
# serverless.yml
---
functions:
- ${file(../foo-functions.yml)}
- ${file(../bar-functions.yml)}
# foo-functions.yml
getFoo:
handler: handler.foo
deleteFoo:
handler: handler.foo
权限
lambda函数与其他aws资源进行交互时,需要具有访问被访问资源的权限,可以通过provider.iamRoleStatements
属性设置lambda函数的权限,也可以通过provider.role或者在定义function时指定role来配置函数权限.
provider.iamRoleStatements
# serverless.yml
service: myService
provider:
name: aws
runtime: nodejs12.x
iamRoleStatements: # permissions for all of your functions can be set here
- Effect: Allow
Action: # Gives permission to DynamoDB tables in a specific region
- dynamodb:DescribeTable
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: 'arn:aws:dynamodb:us-east-1:*:*'
- Effect: 'Allow'
Action:
- 's3:ListBucket'
# You can put CloudFormation syntax in here. No one will judge you.
# Remember, this all gets translated to CloudFormation.
Resource: { 'Fn::Join': ['', ['arn:aws:s3:::', { 'Ref': 'ServerlessDeploymentBucket' }]] }
- Effect: 'Allow'
Action:
- 's3:PutObject'
Resource:
Fn::Join:
- ''
- - 'arn:aws:s3:::'
- 'Ref': 'ServerlessDeploymentBucket'
- '/*'
functions:
functionOne:
handler: handler.functionOne
memorySize: 512
provider.role
# serverless.yml
service: new-service
provider:
name: aws
role: arn:aws:iam::YourAccountNumber:role/IamRole1
functions:
# use role
functionOne:
handler: handler.functionOne
functionTwo:
handler: handler.functionTwo
role: arn:aws:iam::YourAccountNumber:role/IamRole2
VPC配置
可以通过在 lambda函数的配置中添加vpc属性配置来对特定的lambda函数进行vpc配置,也可以在provider中添加添加vpc属性配置来对所有的lambda函数进行vpc配置。两个都定义时,lambda函数的配置优先级高。
vpc配置必须包含 securityGroupIds
和subnetIds
属性。
# serverless.yml
service: service-name
provider:
name: aws
vpc:
securityGroupIds:
- securityGroupId1
- securityGroupId2
subnetIds:
- subnetId1
- subnetId2
functions:
hello: # this function will overwrite the service level vpc config above
handler: handler.hello
vpc:
securityGroupIds:
- securityGroupId1
- securityGroupId2
subnetIds:
- subnetId1
- subnetId2
users: # this function will inherit the service level vpc config above
handler: handler.users
VPC IAM权限
使用vpc配置时必须保证lambda函数的执行权限包含 Elastic Network Interfaces (ENI)的创建,描述和删除权限。
VPC Lambda Internet 访问权限
默认配置下,当lambda函数在vpc内运行时,它会失去对Internet的访问权限,因此无法使用一些AWS资源。
为了使lambda函数能够访问S3和DynamoDB,需要创建一个VPC end point,参考 VPC Endpoint for Amazon S3。
为了使lambda函数能够Kinesisi streams,需要在运行lambda的子网内配置一个NAT Gateway,参考Enable Outgoing Internet Access within VPC。
环境变量
可以通过在 lambda函数的配置中添加environment属性配置来对特定的la