作为AWS众多云服务的核心成员之一,DynamoDB得到了非常广泛的应用。下面就通过一系列教程来介绍一下如何通过AWS SDK来操作DynamoDB。本次主要介绍如何通过APIGateway Service Proxy将DynamoDB暴露为REST API。这样就可以在客户端操作DynamoDB了。

AWS DynamoDB系列教程:
- AWS DynamoDB系列之一:简介
- AWS DynamoDB教程之二:主键的设计及GSI
- AWS DynamoDB系列之三:Streams
- AWS DynamoDB系列之四:在Node.js中访问DynamoDB
- AWS DynamoDB系列之五:在本地安装DynamoDB
- AWS DynamoDB教程之六:如何使用APIGateway Service Proxy访问DynamoDB数据
- AWS DynamoDB教程之七:DynamoDB的访问控制
- AWS DynamoDB教程之八:数据备份/恢复及导出
- AWS DynamoDB教程之九:性能监测和调优,Audit Table及TTL
APIGateway Service Proxy介绍
在传统方式中,如果要提供一个API,比如REST API,需要使用APIGateway+Lambda+AWS Service(比如:DynamoDB)。如果API本身较为简单,可以省略其中的Lambda,而使用Service Proxy,也就是说,让APIGateway直接和DynamoDB交互。
在实施的时候,需要以下几个环节:
- 在DynamoDB中创建相应的表
- 在API Gateway中创建API
- 定义访问权限
创建表
在数据库中创建一个自己的表,我这里使用ScoreTable。
创建相应IAM角色
需要创建一个具有访问对应DynamoDB权限的Role: DynamoDBAPIRole。
需要将Trust Relationship对应的policy改为:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
上面Action中的AssumeRole意味着APIGateway将具有使用这个Role的权限。
将Role ARN复制下来,下一步将要使用。
创建REST API
进入APIGateway,选择REST API,只有这种类型,才能从AWS Services直接构建API:

选择:Create New API。
在选择Endpoint Type的时候:
- Regional:意味着只能在选择的region使用
- Edge optimized:意味着在不同region之间做了优化
- private:访问受限的私有API
选择Create Resource:

输入Resouce name/path:

选择:Actions > POST之后会看到如下界面:

至于如何选择对应的HTTP方法(method),以及Action文本框中的内容 (PutItem),都可以从DynamoDB的官方文档中获取。
接下来需要选择Actions > Deploy API将API发布:

发布之后会获得一个调用的URL,保存这个URL,需要注意在URL后面加上/scores。后面将用这个URL来进行测试。
测试
打开Postman,使用前面的URL创建一个Tab,然后将以下json复制到body中进行测试:
{
"TableName": "ScoreTable",
"Item": {
"studentId": {
"S": "9903"
},
"subject": {
"S": "Chemistry"
},
"score": {
"N": "78"
}
}
}
进入DynamoDB控制台,可以看到已经将这条数据插入成功了:

改进
在前面的方法中,客户端发起POST请求时,需要知道数据库中的表名,这肯定是有问题的。下面说说如何使用Mapping Template解决这个问题。
进入APIGateway,然后选择Integration Request

选择Mapping teamplates:

将下面内容复制到文本框中并保存:
{
"TableName": "ScoreTable",
"Item": {
"studentId": {
"S": "$input.path('$.studentId')"
},
"subject": {
"S": "$input.path('$.subject')"
},
"score": {
"N": "$input.path('$.score')"
}
}
}
接下来重新部署API。
在Postman中需要将Content Type改为JSON,同时发送的请求改为:
{
"studentId": "9904",
"subject": "Math",
"score": "88"
}