本文档对于windows 可能支持的并不是很好,目前已测试linux系统。
因为sam本地调试这一块网上的文档参差不齐,我在实践的过程中也遇到了很多坑,这里整理下来。
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
https://blog.csdn.net/funnyPython/article/details/105627950
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是可以修改的。
docker network create lambda-local
sam local start-api -p 3012 --docker-network lambda-local
最终的启动命令如下所示,需要在代码里面同样做修改
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保持一致,否则无法访问。这里写死了,其实是可以通过配置文件进行配置的。
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, 这两个一定不要弄反了,否则会把线上给覆盖掉的。 更多详细内容参考上面提到的文档。
curl -X POST -H “Content-Type:application/json” http://127.0.0.1:3012/hello --data ‘{“keyname”:“123”}’
aws cloudformation delete-stack --stack-name MY-NEW-STACK
必须先sam build之后,才能执行sam local start-api -p 3012 --docker-network lambda-local。因为是热加载,所以服务开启之后,只需要build之后就可以使用,无需重启start-api.
sam local invoke functionName --event filename.json
sam local generate-event s3 --bucket bucket-name --key key-name > event_file.json
然后使用有效载荷调用函数:
sam local invoke function-name -e event_file.json