AWS 发布用于本地构建和测试 AWS Lambda 无服务器应用的“SAM Local”

  • Daniel Bryant
  • 大愚若智

2017 年 8 月 22 日

话题:AWSDevOps语言 & 开发

AWS 最近发布了一款测试版的新工具SAM Local,该工具可以帮助开发者在本地计算机上更轻松地构建并测试无服务器AWS Lambda应用程序。SAM Local 提供的核心功能包括:在本地运行的 Docker 中测试 AWS Lambda 函数,借助 SAM 模板通过一个简单的 CLI 启动本地 API 网关并置于 Lambda 函数之前,验证 SAM 模板,以及针对 S3、Kinesis、CloudTrail 等各种 AWS 事件源的测试工作生成示例载荷。

AWS 去年发布的无服务器应用程序模型(Serverless Application Model,SAM),意在帮助开发者更轻松地部署无服务器应用。SAM 是一种开源规范,基于AWS CloudFormation构建并对其进行了扩展,这是 AWS 提供的基础架构即代码(IaC)产品,可供开发者以声明的方式指定云资源的部署和配置。

SAM Local的主要功能包括:

通过 SAM Local 在本地运行无服务器项目和函数需要安装并运行 Docker,此时 SAM Local 将使用 DOCKER_HOST 环境变量连接 Docker 守护进程。SAM Local 可通过NPM安装(npm install -g aws-sam-local),或可从原代码库直接安装最新版(访问 github.com/awslabs/aws-sam-loca,并创建一个名为aws-sam-local,而非sam的二进制文件)。

开发者可通过增强的 CloudFormation 模板格式指定函数的部署配置以及相关的集成式 AWS 资源(这种格式最终会转换为标准的 CloudFormation 模板)。例如,下列template.yaml文件定义了一个简单的 DynamoDB 表,一个基于 Python 的 Lambda 函数(源代码包含在一个单独的文件中,其名称可通过'Handler property' lambda_function.py 指定),以及一个支持 GET 和 POST 方法的 API 网关实例。

---
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  VotesTable:
    Type: "AWS::Serverless::SimpleTable"
  VoteSpacesTabs:
    Type: "AWS::Serverless::Function"
    Properties:
      Timeout: 30
      Runtime: python3.6
      Handler: lambda_function.lambda_handler
      Policies: AmazonDynamoDBFullAccess
      Environment:
        Variables:
          TABLE_NAME: !Ref VotesTable
      Events:
        GetVotes:
          Properties:
            Method: get
            Path: /
          Type: Api
        Vote:
          Properties:
            Method: post
            Path: /
          Type: Api

Randall Hunt撰写的一篇AWS 博客文章提供了 SAM 部署与 API 网关集成的范例,并演示了 SAM Local 对整个开发流程提供的帮助。相关说明已经很完善,但实际使用时需要首先创建相应的 DynamoDB 表,随后才能测试函数(例如下列示例通过AWS CLI执行了create-table命令),此外在针对测试用途运行本地 DynamoDB时,还需要将函数中的 DynamoDB 主机名改为计算机的本地网络 IP 地址,不能直接使用localhost,这是因为函数实际上运行在 Docker 容器内,而 Mac 或 Windows 上的 Docker 都运行在自己的虚拟机内,此时localhost代表不同的上下文。


aws dynamodb create-table \
    --table-name spaces-tabs-votes \
    --attribute-definitions \
        AttributeName=id,AttributeType=S \
    --key-schema AttributeName=id,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
    --endpoint-url http://localhost:8000  

SAM Local 可以针对测试用途生成 AWS 服务事件,例如运行sam local generate-event <service>这样的 CLI 命令,此外还可通过受支持的 IDE 进行交互式调试。在 Java 和 Node.js 中,-d 标志和端口可传递至sam local CLI 命令,借此可立刻启动调试器。AWS 博客建议对 Python 使用诸如epdb这样的二进制库。

在本地开发并测试无服务器应用后,可以使用 SAM CLI 将应用程序打包并部署到生产环境。sam package命令可将代码压缩为 Zip 格式,上传至 S3,并生成一个可直接通过 AWS CloudFormation 部署至 Lambda 的 SAM 文件。sam deploy命令可将打包后的 SAM 模板部署至 CloudFormation。sam packagesam deploy的作用分别等同于 AWS CLI 中的aws cloudformation packageaws cloudformation deploy命令。

有关 SAM Local 的更多信息可访问 AWS 博客文章:“新增 - AWS SAM Local (Beta) – 本地构建并测试无服务器应用程序”,或访问该项目的GitHub 代码库

阅读英文原文AWS Release ‘SAM Local’ to Facilitate Local Build and Test of AWS Lambda Serverless Applications

AWSDevOps语言 & 开发