AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

部署基于 Lambda 的应用程序

基于 Lambda 的应用程序 (也称作无服务器应用程序) 由通过事件触发的函数组成。典型的无服务器应用程序包含一个或多个通过事件 (如向 Amazon S3 上传对象、Amazon SNS 通知和 API 操作) 触发的函数。这些函数既可独立运行,也可利用其他资源 (如 DynamoDB 表或 Amazon S3 存储桶)。最基本的无服务器应用程序仅包含一个函数。

AWS Lambda 提供您可以使用的 API 操作,以便以 ZIP 文件格式提供部署程序包来创建和更新 Lambda 函数。然而,本机制可能不方便用于自动执行函数部署步骤,或者协调事件源和下游资源等其他无服务器应用程序元素之间的部署和更新。例如,为了部署 Amazon SNS 触发器,您需要更新函数、Amazon SNS 主题、函数与主题之间的映射,以及 DynamoDB 表等函数所需的任何其他下游资源。

使用 AWS CloudFormation 部署无服务器应用程序

您可以使用 AWS CloudFormation 指定、部署和配置无服务器应用程序。AWS CloudFormation 是一项服务,可帮助您对 AWS 资源进行建模和设置,以便能花较少的时间管理这些资源,而将更多的时间花在运行于 AWS 中的应用程序上。您可以创建一个描述您所需的所有 AWS 资源 (如 Lambda 函数或 DynamoDB 表) 的模板,并且 AWS CloudFormation 将负责为您预配和配置这些资源。您无需单独创建和配置 AWS 资源,且无需了解 what—AWS CloudFormation 处理所有这些工作时所依赖的内容。有关更多信息,请参阅AWS CloudFormation 用户指南 中的 AWS CloudFormation 概念

使用 AWS 无服务器应用程序模型 (AWS SAM)

AWS 无服务器应用程序模型 (AWS SAM) 是定义无服务器应用程序的模型。AWS SAM 本身受 AWS CloudFormation 支持,且为表达无服务器资源定义简化的语法。规范目前包含 API、Lambda 函数和 Amazon DynamoDB 表。Apache 2.0 下的规范适用于 AWS 合作伙伴和客户,以便他们在自己的工具集中采用和扩展。有关规范详情,请参阅 AWS 无服务器应用程序模型

AWS CloudFormation 内的无服务器资源

AWS SAM 支持简化如何表达无服务器应用程序的函数、API、映射和 DynamoDB 表的特殊资源类型,以及环境变量等服务的一些功能。这些资源的 AWS CloudFormation 描述符合 AWS 无服务器应用程序模型。为了部署您的应用程序,只需在 AWS CloudFormation 模板文件 (在 JSON 或 YAML 中写入) 中指定您想要作为应用程序一部分的资源及其相关权限策略,打包您的部署项目,然后部署该模板。

带有符合 AWS SAM 模型的无服务器资源的 AWS CloudFormation 模板称为 SAM 文件或模板。

以下示例介绍如何利用 AWS SAM 声明无服务器应用程序的常见组件。请注意,HandlerRuntime 参数值应与上一节中创建函数时所用的参数值匹配。

Lambda 函数

以下内容介绍您用来描述 Lambda 函数的表示法:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: runtime CodeUri: s3://bucketName/codepackage.zip

Handler 属性的 handler 值指向包含代码的模块,您的 Lambda 函数将在调用时执行。Handler 属性的 index 值表示包含代码的文件名称。您可以尽可能多地声明您的无服务器应用程序所需的函数。

您还可以声明环境变量,这是您可以为应用程序设置的配置设置。下面介绍具有两个 Lambda 函数和一个指向 DynamoDB 表的环境变量的无服务器应用程序的示例。您可以更新环境变量,无需修改、重新打包或者重新部署您的 Lambda 函数代码。有关更多信息,请参阅 环境变量

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: PutFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Policies: AWSLambdaDynamoDBExecutionRole CodeUri: s3://bucketName/codepackage.zip Environment: Variables: TABLE_NAME: !Ref Table DeleteFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Policies: AWSLambdaDynamoDBExecutionRole CodeUri: s3://bucketName/codepackage.zip Environment: Variables: TABLE_NAME: !Ref Table Events: Stream: Type: DynamoDB Properties: Stream: !GetAtt DynamoDBTable.StreamArn BatchSize: 100 StartingPosition: TRIM_HORIZON DynamoDBTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 StreamSpecification: StreamViewType: streamview type

请注意顶部的表示法:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31

为了包含 AWS CloudFormation 模板中 AWS 无服务器应用程序模型所定义的对象,需要这样表示。

SimpleTable

SimpleTable 是使用单属性主密钥创建 DynamoDB 表的资源。如果无服务器应用程序要交互的数据只需要通过单值密钥访问,则您可以使用此简化版。您可以更新之前的示例,以使用 SimpleTable,如下所示:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: TableName: Type: AWS::Serverless::SimpleTable Properties: PrimaryKey: Name: id Type: String ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5

事件

事件是触发 Lambda 函数的 AWS 资源,例如 Amazon API Gateway 终端节点或 Amazon SNS 通知。Events 属性是您能够为每个函数设置多个事件的数组。以下内容介绍用来描述 Lambda 函数以及作为事件源的 DynamoDB 表的表示法。

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Events: Stream: Type: DynamoDB Properties: Stream: !GetAtt DynamoDBTable.StreamArn BatchSize: 100 StartingPosition: TRIM_HORIZON TableName: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5

如上所述,您可以设置多个将触发 Lambda 函数的事件源。以下示例显示了可由 HTTP PUTPOST 事件触发的 Lambda 函数。

API

使用 AWS SAM 定义 API 的方式有两种。以下示例使用 Swagger 配置基础的 Amazon API Gateway 资源:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: Api: Type: AWS::Serverless::Api Properties: StageName: prod DefinitionUri: swagger.yml

在下一个示例中,AWS::Serverless::Api 资源类型是从 AWS::Serverless::Function 资源定义的 API 事件联合添加的隐式资源类型。

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: GetFunction: Type: AWS::Serverless::Function Properties: Handler: index.get Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBReadOnlyAccess Environment: Variables: TABLE_NAME: !Ref Table Events: GetResource: Type: Api Properties: Path: /resource/{resourceId} Method: get PutFunction: Type: AWS::Serverless::Function Properties: Handler: index.put Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBFullAccess Environment: Variables: TABLE_NAME: !Ref Table Events: PutResource: Type: Api Properties: Path: /resource/{resourceId} Method: put DeleteFunction: Type: AWS::Serverless::Function Properties: Handler: index.delete Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBFullAccess Environment: Variables: TABLE_NAME: !Ref Table Events: DeleteResource: Type: Api Properties: Path: /resource/{resourceId} Method: delete Table: Type: AWS::Serverless::SimpleTable

在上述示例中,AWS CloudFormation 将自动生成带有路径 "/resource/{resourceId}" 和方法 GETPUTDELETE 的 Amazon API Gateway API

权限

您可以提供用作该函数执行角色的 AWS Identity and Access Management (IAM) 角色的 Amazon 资源名称 (ARN),如下所示:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Role:role arn

或者,您可以向 Lambda 函数资源提供一个或多个托管策略。然后,AWS CloudFormation 将使用托管策略和默认 Lambda 基本执行策略创建新的角色。

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Policies: AmazonDynamoDBFullAccess

如果以上角色和策略均未提供,则使用 Lambda 基本执行权限创建默认执行角色。

注意

除了使用无服务器资源之外,您还可以使用常规 AWS CloudFormation 语法,以表达同一模板中的资源。尽管 SAM 模型目前不包含任何资源,但仍可使用 AWS CloudFormation 语法在 AWS CloudFormation 模板中创建资源。此外,作为使用 SAM 模型的替代方案,您可以使用 AWS CloudFormation 语法表达无服务器资源。有关使用常规 CloudFormation 语法将 Lambda 函数指定为您 SAM 模板一部分的信息,请参阅 AWS CloudFormation 用户指南中的 AWS::Lambda::Function

有关无服务器应用程序示例的完整列表的信息,请参阅如何使用 AWS Lambda 的示例

下一步

创建您自己的无服务器应用程序