aws sam 在服务器本地开发(打通dynamoDB与start-api)

章学义
2023-12-01

ubuntu14.04下sam本地测试, 把sam和dynamoDB连起来!!!

本文档对于windows 可能支持的并不是很好,目前已测试linux系统。
因为sam本地调试这一块网上的文档参差不齐,我在实践的过程中也遇到了很多坑,这里整理下来。

sam 和dynamoDB连起来主要参考下面两个链接:

https://stackoverflow.com/questions/48926260/connecting-aws-sam-local-with-dynamodb-in-docker

https://stackoverflow.com/questions/55602574/putting-to-local-dynamodb-table-with-python-boto3-times-out

需要安装的东西

java版本需要jdk8以上,安装参考:

https://blog.csdn.net/funnyPython/article/details/105627950

docker安装
配置sam IAM credentials

https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/SettingUp.DynamoWebService.html#SettingUp.DynamoWebService.GetCredentials

因为我所使用的docker删除命令有问题,修改了一下源码。目前修改删除为停止容器。如果没有遇到类似问题可以忽视。如需删除已停止容器,可执行

docker container prune

这里可能还需要指出的一点,为什么要指定dynamodb端口。因为dynamodb默认的端口是8000端口,服务器上目前已有服务占用,所以对dynamodb端口做修改。修改端口为8110. 修改docker镜像参考:

https://stackoverflow.com/questions/56878656/change-amazon-dynamodb-local-port

注意:

从0到1的启动流程并非都需要执行一遍,如果已经执行过一遍,而且dynamodb镜像已经启动起来,接下来只需要在所需要测试的lambda函数路径下,启动api即可。即

sam local start-api -p 3012 --docker-network lambda-local  # 这里的端口2012是可以修改的。

从0到1的启动过程:

docker 建立网络

docker network create lambda-local

修改本地启动命令

sam local start-api -p 3012 --docker-network lambda-local

配置docker并启动

最终的启动命令如下所示,需要在代码里面同样做修改

docker run -d -p 8110:8110 --name dynamodb --network=lambda-local amazon/dynamodb-local -jar DynamoDBLocal.jar -port 8110 -sharedDb

这里8110是指定端口,使用的镜像是amazon/dynamodb-local, -sharedDb必须要加,否则导出的数据没有数据。

'use strict';

const AWS = require('aws-sdk');
const options = {
    region: 'localhost',
    endpoint: 'http://dynamodb:8110',
  };
let dynamo = new AWS.DynamoDB.DocumentClient(options);

上面这里很重要,endpoint这里必须和hostname保持一致,否则无法访问。这里写死了,其实是可以通过配置文件进行配置的。

如果使用的过程遇到问题,执行如下命令测试docker dynamodb是否可以使用。

aws dynamodb list-tables --endpoint-url http://0.0.0.0:8110

正常情况下会显示如下内容:

{
"TableNames": []
}

做到这步之后,我们需要把线上的表结构给下载下来,

如果需要建表需要自行建立,当然,如果觉得麻烦可以手动在图形化界面进行建立,然后通过代码进行拉取。可参考:

https://github.com/bchew/dynamodump
https://stackoverflow.com/questions/42100210/how-to-export-an-existing-dynamo-table-schema-to-json
https://stackoverflow.com/questions/18896329/export-data-from-dynamodb

具体的使用如下:

python dynamodump.py -m backup -r us-east-1 -s student --host localhost --port 8110 # 此命令用于下载schema文件到本地。

python dynamodump.py -m restore -r local -s student --host localhost --port 8110 

上面这两个命令要想执行,同样要配置密钥,同aws, 只不过密钥存放的位置在~/.boto当中。

具体讲解一下: backup是用于备份的,比如我的区域是us-east-1, 表名叫student.然后指定本地端口路径。就可以把线上的给拉取下来。

restore是从备份里面进行重建的,所以是local, 这两个一定不要弄反了,否则会把线上给覆盖掉的。 更多详细内容参考上面提到的文档。

测试项目使用的url.

curl -X POST -H “Content-Type:application/json” http://127.0.0.1:3012/hello --data ‘{“keyname”:“123”}’

删除sam创建的堆栈

aws cloudformation delete-stack --stack-name MY-NEW-STACK

api业务拆分

关于使用start-api需要注意的一些点。

必须先sam build之后,才能执行sam local start-api -p 3012 --docker-network lambda-local。因为是热加载,所以服务开启之后,只需要build之后就可以使用,无需重启start-api.

sam命令调试

sam local invoke functionName --event filename.json

sam s3本地调试

sam local generate-event s3 --bucket bucket-name --key key-name > event_file.json

然后使用有效载荷调用函数:

sam local invoke function-name -e event_file.json

 类似资料: