AWS serverless.yml 文件详解

本文详细介绍了AWS serverless应用的核心配置文件serverless.yml,包括service、frameworkVersion、plugins、provider、functions、events、resources、variables等关键元素的作用、配置方式和用法。同时,讲解了如何创建、部署和移除service,以及如何配置Lambda函数的权限、VPC、环境变量、日志、版本管理和死信队列等。此外,还探讨了如何使用插件、自定义资源、变量引用以及如何通过CloudFormation模板进行资源管理。
摘要由CSDN通过智能技术生成

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)的创建,描述和删除权限。

参考:配置 Lambda 函数以访问 VPC 中的资源

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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值