本节我们使用SAM和DynamoDB进行集成。SAM将自动创建一张DynamoDB表,在lambda中对这张表的数据进行查询,并将结果返回给API Gateway
执行sam init
, 使用Python + zip
模式,为项目命令名dynamodb-app
:
创建完成后,进入到dynamodb-app
目录,更新hello_world/app.py
文件内容如下:
import boto3
import json
import os
print('Loading function')
# create the client outside of the handler
region_name = os.environ['REGION_NAME'] # 从env获取REGION_NAME,这个环境变量由template.yaml传入
dynamo = boto3.client('dynamodb', region_name=region_name)
table_name = os.environ['TABLE_NAME'] # 从env获取TABLE_NAME,这个环境变量由template.yaml传入
def respond(err, res=None):
return {
'statusCode': '400' if err else '200',
'body': err.message if err else json.dumps(res),
'headers': {
'Content-Type': 'application/json',
},
}
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
scan_result = dynamo.scan(TableName=table_name) # 扫描DynamoDB全表数据
return respond(None, res=scan_result) # 将上面的查询结果返回
更新template.yaml
内容如下:
# SAM FILE
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 # 版本和当前环境Python保持一致
CodeUri: hello_world/ # 代码目录在hello_world下面
Description: A starter AWS Lambda function.
MemorySize: 128
Timeout: 3
Environment: # 传入环境变量
Variables:
TABLE_NAME: !Ref Table
REGION_NAME: !Ref AWS::Region
Events: # API Gateway设置
HelloWorldSAMAPI:
Type: Api
Properties:
Path: /hello
Method: GET
Policies: # Lambda需要有访问DynamoDB CRUD权限
- DynamoDBCrudPolicy:
TableName: !Ref Table
Table: # 创建DynamoDB表
Type: AWS::Serverless::SimpleTable
Properties:
PrimaryKey: # Primary设置
Name: greeting
Type: String
ProvisionedThroughput: # DynamoDB RCU/WCU配置
ReadCapacityUnits: 2
WriteCapacityUnits: 2
首先build项目:sam build
然后进行部署,为stack命名为dynamodb-app
,其余全部选择y
:
部署changeset
:
大概一分钟左右创建完成。
SAM部署完成后,我们可以一一检查SAM创建的资源:
在Lambda页面找到SAM创建的函数,例如dynamodb-app-helloworldpython3-lBCFr41SzfRo
。
SAM已经设置好环境变量:
并且创建好了具有访问DynamoDB权限的Role:
Role里面定义了CRUD相关的操作:
进入DynamoDB服务页面:
往创建的表里插入几条数据:
进入到API Gateway页面,找到URL地址:
访问${URL}/hello
, Lambda会将DynamoDB插入的数据全部取回,并返回给API Gateway:
SAM具有创建DynamoDB表的能力,但只能创建primary key
类型的表,如果要使用primary + sort key
类型的表,需要提前进行创建