本节我们将先不使用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
对应DynamoDBHandler: 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环境:
在sam-app
目录下执行:
sam build
构建完成后,在当前目录生成了.aws-sam
目录,用于后续的测试或部署环节
可以使用
sudo yum install tree -y
来安装tree工具
在执行完sam build
命令后,控制台会输出[*] Invoke Function: sam local invoke
,表示我们可以使用此命令来执行测试:
测试需要本地安装Docker,Cloud 9已经为我们提前准备好Docker环境。
执行以下命令将生成的CloudFormation部署到AWS环境:
sam deploy --guided
所有参数保持默认即可(使用回车键):
部署完成:
进入AWS控制台,切换到Lambda页面,发现SAM已经为我们自动部署了资源:
Lambda的内容和代码中是一致的: