AWS DynamoDB教程之六:如何使用APIGateway Service Proxy访问DynamoDB数据


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

AWS DynamoDB

AWS DynamoDB系列教程:

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:

DynamoDB教程

选择:Create New API。

在选择Endpoint Type的时候:

  • Regional:意味着只能在选择的region使用
  • Edge optimized:意味着在不同region之间做了优化
  • private:访问受限的私有API

选择Create Resource:

DynamoDB教程

输入Resouce name/path:

DynamoDB教程

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

DynamoDB教程

至于如何选择对应的HTTP方法(method),以及Action文本框中的内容 (PutItem),都可以从DynamoDB的官方文档中获取。

接下来需要选择Actions > Deploy API将API发布:

DynamoDB教程

发布之后会获得一个调用的URL,保存这个URL,需要注意在URL后面加上/scores。后面将用这个URL来进行测试。

测试

打开Postman,使用前面的URL创建一个Tab,然后将以下json复制到body中进行测试:

{
  "TableName": "ScoreTable",
  "Item": {
    "studentId": {
      "S": "9903"
    },
    "subject": {
      "S": "Chemistry"
    },
    "score": {
      "N": "78"
    }
  }
}

进入DynamoDB控制台,可以看到已经将这条数据插入成功了:

DynamoDB教程

改进

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

进入APIGateway,然后选择Integration Request

DynamoDB教程

选择Mapping teamplates:

DynamoDB教程

将下面内容复制到文本框中并保存:

{
  "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"
}

文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !
  目录