yaml SAM local 与 dynamo db
yaml SAM local with dynamo db
我正在尝试创建一组依赖于 DynamoDB 的 lambda 函数。我写了一个像这样的有效 SAM 模板:
---
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Resources:
Get:
Type: AWS::Serverless::Function
Properties:
Handler: ./lambdas/get/main
Runtime: go1.x
Events:
PostEvent:
Type: Api
Properties:
Path: /
Method: get
Portfolios:
Type: AWS::DynamoDB::Table
TableName: "entities"
Properties:
AttributeDefinitions:
-
AttributeName: "Id"
AttributeType: "S"
-
AttributeName: "Name"
AttributeType: "S"
KeySchema:
-
AttributeName: "Id"
KeyType: "HASH"
-
AttributeName: "Name"
KeyType: "RANGE"
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
Tags:
- Key: foo
Value: bar
Outputs:
Endpoint:
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"
但是当我尝试执行任何 lambda 时,它们在尝试调用 putItem
时超时。我需要做什么才能确保我的 lambda 可以与本地 dynamodb 通信?
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
endpoint := "localhost:3000"
db := dynamodb.New(sess, &aws.Config{
Endpoint: &endpoint,
})
entity := &models.Entities{}
json.Unmarshal([]byte(event.Body), portfolio)
av, err := dynamodbattribute.MarshalMap(entity)
if err != nil {
fmt.Println("Got error marshalling:")
fmt.Println(err.Error())
os.Exit(1)
}
input := &dynamodb.PutItemInput{
Item: av,
TableName: aws.String("entities"),
}
_, err = db.PutItem(input) // Times out here
if err != nil {
fmt.Println("Got error calling PutItem:")
fmt.Println(err.Error())
return events.APIGatewayProxyResponse{StatusCode: 500}, nil
}
如何确保我的 table 甚至被正确创建?
原来 SAM local 不会创建 dynamodb table:https://github.com/awslabs/aws-sam-cli/issues/105
为此,您必须手动创建 docker 容器并在 SAM 外部创建 tables。
在我正在做的一个 AWS SAM 项目中,它被证明具有创建所有必需的 DynamoDB 表、S3 存储桶等的功能。
通常,无论如何我都需要在我的集成测试中创建它们,因此提取一个通用函数来创建 AWS 依赖项很方便。
我正在尝试创建一组依赖于 DynamoDB 的 lambda 函数。我写了一个像这样的有效 SAM 模板:
---
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Resources:
Get:
Type: AWS::Serverless::Function
Properties:
Handler: ./lambdas/get/main
Runtime: go1.x
Events:
PostEvent:
Type: Api
Properties:
Path: /
Method: get
Portfolios:
Type: AWS::DynamoDB::Table
TableName: "entities"
Properties:
AttributeDefinitions:
-
AttributeName: "Id"
AttributeType: "S"
-
AttributeName: "Name"
AttributeType: "S"
KeySchema:
-
AttributeName: "Id"
KeyType: "HASH"
-
AttributeName: "Name"
KeyType: "RANGE"
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
Tags:
- Key: foo
Value: bar
Outputs:
Endpoint:
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"
但是当我尝试执行任何 lambda 时,它们在尝试调用 putItem
时超时。我需要做什么才能确保我的 lambda 可以与本地 dynamodb 通信?
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
endpoint := "localhost:3000"
db := dynamodb.New(sess, &aws.Config{
Endpoint: &endpoint,
})
entity := &models.Entities{}
json.Unmarshal([]byte(event.Body), portfolio)
av, err := dynamodbattribute.MarshalMap(entity)
if err != nil {
fmt.Println("Got error marshalling:")
fmt.Println(err.Error())
os.Exit(1)
}
input := &dynamodb.PutItemInput{
Item: av,
TableName: aws.String("entities"),
}
_, err = db.PutItem(input) // Times out here
if err != nil {
fmt.Println("Got error calling PutItem:")
fmt.Println(err.Error())
return events.APIGatewayProxyResponse{StatusCode: 500}, nil
}
如何确保我的 table 甚至被正确创建?
原来 SAM local 不会创建 dynamodb table:https://github.com/awslabs/aws-sam-cli/issues/105
为此,您必须手动创建 docker 容器并在 SAM 外部创建 tables。
在我正在做的一个 AWS SAM 项目中,它被证明具有创建所有必需的 DynamoDB 表、S3 存储桶等的功能。
通常,无论如何我都需要在我的集成测试中创建它们,因此提取一个通用函数来创建 AWS 依赖项很方便。