集成DynamoDB Table

本节我们使用SAM和DynamoDB进行集成。SAM将自动创建一张DynamoDB表,在lambda中对这张表的数据进行查询,并将结果返回给API Gateway

创建项目

执行sam init, 使用Python + zip模式,为项目命令名dynamodb-app:

image-20220307204659396

创建完成后,进入到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

image-20220307205445217

部署changeset:

image-20220307205500397

大概一分钟左右创建完成。


SAM部署完成后,我们可以一一检查SAM创建的资源:

  • DynamoDB表
  • Lambda
  • API Gateway

Lambda

在Lambda页面找到SAM创建的函数,例如dynamodb-app-helloworldpython3-lBCFr41SzfRo

SAM已经设置好环境变量:

image-20220307221522587

并且创建好了具有访问DynamoDB权限的Role:

image-20220307221541133

Role里面定义了CRUD相关的操作:

image-20220307221623796

DynamoDB表

进入DynamoDB服务页面:

image-20220307205734317

往创建的表里插入几条数据:

image-20220307205809757

image-20220307205947068

API Gateway

进入到API Gateway页面,找到URL地址:

image-20220307221833379

访问${URL}/hello, Lambda会将DynamoDB插入的数据全部取回,并返回给API Gateway:

image-20220307211028252


SAM具有创建DynamoDB表的能力,但只能创建primary key类型的表,如果要使用primary + sort key类型的表,需要提前进行创建


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