gpt4 book ai didi

node.js - AWS SAM 本地 + DynamoDB 本地

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:20 25 4
gpt4 key购买 nike

我目前正在使用 Docker 测试 AWS SAM 和 DynamoDB Local。

这是我遵循的步骤(主要在互联网上找到)

  1. 使用docker network create local-dev创建新的docker网络。
  2. 运行 DynamoDB Local docker run -d -v "$PWD":/dynamodb_local_db -p 8000:8000 --network local-dev --name dynamodb amazon/dynamodb-local。到目前为止,我可以使用 AWS CLI 创建和列出表。
  3. 然后,我继续运行 AWS SAM sam local start-api --docker-network local-dev。一切看起来都很好。
  4. 调用了 lambda.js,但 console.log(err)console.log(data) 似乎没有结果。

不知道哪里出了问题。请帮我。预先感谢您!

lambda.js

const services = require('./services.js');
const AWS = require('aws-sdk');

let options = {
apiVersion: '2012-08-10',
region: 'ap-southeast-1',
}

if(process.env.AWS_SAM_LOCAL) {
options.endpoint = new AWS.Endpoint('http://localhost:8000')
}

const dynamoDB = new AWS.DynamoDB(options);

exports.getUser = async (event, context) => {

let params = {};

dynamoDB.listTables(params, (err, data) => {
if(err) console.log(err)
else console.log(data)
})

return true;
}

模板.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Serverless Resources


Parameters:

FunctionsCodeBucket:
Type: String
Description: CodeBucket
FunctionsCodeKey:
Type: String
Description: CodeKey
FunctionsCodeVersion:
Type: String
Description: CodeVersion
NodeEnv:
Type: String
Description: NodeEnv

Globals:
Api:
Cors:
AllowMethods: "'OPTIONS,POST,GET,DELETE,PUT'"
AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,Api-Key,api-key'"
AllowOrigin: "'*'"
Function:
Timeout: 300
Runtime: nodejs10.x
MemorySize: 128
CodeUri: ./

Resources:
DevResources:
Type: AWS::Serverless::Function
Properties:
Handler: "index.routes"
Environment:
Variables:
NODE_ENV: !Ref NodeEnv
# REGION: !Ref "AWS::Region"

Policies:
- Version: '2012-10-17'
Statement:
- Action:
- dynamodb:*
Effect: Allow
Resource: "*"
Events:
GetUser:
Type: Api
Properties:
Path: /user
Method: get

最佳答案

您的 lambda 函数不会等待 dynamoDB.listTables手术。您可以使用 dynamoDB.listTables 的 promise 版本来修复此问题如下:

exports.getUser = async (event, context) => {

let params = {};

try {
const resp = await dynamoDB.listTables(params).promise();
console.log(resp);
} catch (err) {
console.log(err)
}
};

您可能需要做的另一件事是为您的 dynamodb 容器分配一个网络别名(您可以使用 --network-alias=<container_name> 选项来做到这一点),例如,让我们将别名设置为 dynamodb

docker run -d -v "$PWD":/dynamodb_local_db -p 8000:8000 --network local-dev --network-alias=dynamodb --name dynamodb amazon/dynamodb-local

之后,您可以在 lambda 函数中使用此网络别名:

if(process.env.AWS_SAM_LOCAL) {
options.endpoint = new AWS.Endpoint('http://dynamodb:8000')
}

关于node.js - AWS SAM 本地 + DynamoDB 本地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58838142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com