hello world示例

本节我们将先不使用SAM的脚手架生成项目,而是从头开始创建文件,来体验SAM的工作方式


在Cloud 9的terminal执行以下命令生成项目的文件目录:

mkdir sam-app && cd sam-app
mkdir src
touch src/app.py
touch template.yaml

目录结构如下:

kongpingfan:~/environment $ tree 
.
└── sam-app
    ├── src
    │   └── app.py
    └── template.yaml
  • template.yaml: SAM使用 YAML 模板来描述应用程序所需的AWS资源(集成Lambda 函数、API gateway、DynamoDB 等)
  • src目录:存放lambda的代码

打开app.py, 将下以代码复制过去:

import json

print("Loading function")


def lambda_handler(event, context):
    return "Hello world"

template.yaml内容:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: A starter AWS Lambda function.
Resources:
  helloworldpython3:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: app.lambda_handler
      Runtime: python3.7
      CodeUri: src/
      Description: A starter AWS Lambda function.
      MemorySize: 128
      Timeout: 3

关于yaml模块语法的具体介绍,请参考 https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html

这里仅介绍基中一部分:

  • Type: 'AWS::Serverless::Function' 表示创建Lambda函数类型的资源。目前SAM支持三种类型: AWS::Serverless::Function 对应Lambda, AWS::Serverless::Api对应API Gateway, AWS::Serverless::SimpleTable对应DynamoDB
  • Handler: app.lambda_handler 表示Lambda的handler函数,格式为文件名 + 入口函数名。这里我们的文件名为app.py,入口函数为def lambda_hander()
  • Runtime表示Lambda的执行语言环境,由于目前Cloud 9自带的python版本为3.7,我们必须和本机的版本保持一致,否则部署时会报错
  • CodeUri:代码目录。我们的python代码放在src/目录下
  • MemorySize, Timeout:lambda的内存及超时时间配置

打包及部署

Package过程涉及到将template.yaml及代码一起打包,生成CloudFormation模板,以进行后面的测试或者部署过程

Deploying过程涉及到将上一步生成的CloudFormation资源部署到AWS环境:

image-20220305115844263

执行构建

sam-app目录下执行:

sam build

构建完成后,在当前目录生成了.aws-sam目录,用于后续的测试或部署环节

image-20220306212629055

可以使用sudo yum install tree -y来安装tree工具


执行测试:

在执行完sam build命令后,控制台会输出[*] Invoke Function: sam local invoke,表示我们可以使用此命令来执行测试:

image-20220306213145432

测试需要本地安装Docker,Cloud 9已经为我们提前准备好Docker环境。


执行部署:

执行以下命令将生成的CloudFormation部署到AWS环境:

sam deploy --guided

所有参数保持默认即可(使用回车键):

image-20220306213506641

部署完成:

image-20220306213757456

进入AWS控制台,切换到Lambda页面,发现SAM已经为我们自动部署了资源:

image-20220305143705136

Lambda的内容和代码中是一致的:

image-20220306213622710


参考: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-building.html

https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-deploying.html