使用Go Lambda和API网关按需生成DynamoDB表
#lambda #go #dynamodb #apigateway

在我以前的post中,我们专注于设置lambda开发,拉链和上传我们的功能以及诸如丢失文件之类的问题的问题。现在让我们看一下实际构建我们的功能。

构建Golang lambda函数

此代码是创建DynamoDB表的GO函数。

package main

import (
    "context"
    "log"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/dynamodb"
)

func createDynamoDBTable(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))

    // Create DynamoDB client
    svc := dynamodb.New(sess)

    // Define the table name, attribute definitions, key schema, and provisioned throughput
    tableName := "Movies"
    input := &dynamodb.CreateTableInput{
        AttributeDefinitions: []*dynamodb.AttributeDefinition{
            {
                AttributeName: aws.String("Year"),
                AttributeType: aws.String("N"),
            },
            {
                AttributeName: aws.String("Title"),
                AttributeType: aws.String("S"),
            },
        },
        KeySchema: []*dynamodb.KeySchemaElement{
            {
                AttributeName: aws.String("Year"),
                KeyType:       aws.String("HASH"),
            },
            {
                AttributeName: aws.String("Title"),
                KeyType:       aws.String("RANGE"),
            },
        },
        ProvisionedThroughput: &dynamodb.ProvisionedThroughput{
            ReadCapacityUnits:  aws.Int64(10),
            WriteCapacityUnits: aws.Int64(10),
        },
        TableName: aws.String(tableName),
    }

    // Create the DynamoDB table
    _, err := svc.CreateTable(input)
    if err != nil {
        log.Fatalf("Got error calling CreateTable: %s", err)
        return events.APIGatewayProxyResponse{
            StatusCode: 500,
            Body:       "Error creating DynamoDB table",
        }, err
    }

    return events.APIGatewayProxyResponse{
        StatusCode: 200,
        Body:       "Created the table " + tableName,
    }, nil
}

func main() {
    lambda.Start(createDynamoDBTable)
}

首先,我们导入使用DynamoDB和lambda的GO套件。

func关键字声明我们的功能。 CTX参数提供“上下文” - 额外的信息,例如该功能的时间限制。 CTX带有详细信息,例如函数自动关闭之前剩下的时间。它还包含有关Lambda和API网关之间的请求和响应的数据。您可以将CTX视为获得聚会的位置和时间,因此您知道何时何地发生,并且在正确的位置准时到达那里。

在功能中,我们使用AWS GO SDK连接到DynamoDB。我们使用诸如AWS.String之类的点符号从其他软件包调用代码。

然后,我们创建一个带有年份和标题列的电影表。
导入的软件包就像工具包一样,让我们​​使用DynamoDB和Lambda。我们导入它们,以便我们的代码可以与这些AWS服务一起使用。

然后,创建的ynamodbtable函数使用工具包连接到dynamoDB。它通过从工具包中调用创新方法来创建表。

main()执行时首先运行。它启动了我们的表创建功能。

测试我们的功能

我们将函数缩小并上传后(请参阅详细的步骤here),让我们对其进行测试以确保其正常工作:
Test Lambda

我们正在寻找成功的结果:

Success

注意:AWS可能为您创建资源来模拟执行环境。如果您想使用API​​网关调用Lambda功能,请删除此步骤中创建的DynamoDB表。
Delete table

添加API网关以调用lambda

  • 导航到API网关服务,然后单击“创建API”以开始创建新的API。

根据您的要求选择“ HTTP API”或“ REST API”。 HTTP API适用于更简单的用例,这就是我们使用的。

  • 定义API的集成和路线

选择我们的“ lambda函数”作为集成类型。这是访问此API端点时将调用的功能。

Integration

接下来,我们将添加一条路线。路线定义了如何将传入请求映射到关联的API网关资源和集成。每个路由都可以具有不同的配置,包括集成目标(例如lambda函数),请求/响应转换和授权设置。

Add POST Route

我们的API网关将将发布 /CreateBtable请求路由到我们的lambda函数。< /p>

  • 让我们选择默认阶段并继续创建过程

Stage

  • Invoke API

为了通过我们已配置为通往 /CreateBtable的邮政路由的API网关调用我们的lambda函数,我们可以使用curl或类似的HTTP客户端的工具,或者我们可以使用诸如Postman之类的服务。这是我们可以使用命令行中的卷曲来调用lambda函数的方式:

curl -X POST <base URL of our API Gateway stage> <the path to the POST route we've defined>

Curl

和voilã!我们通过使用API​​网关调用lambda函数成功创建了一个DynamoDB表!

结论

现在,您知道如何在GO中构建lambda函数,该功能创建诸如DynamoDB表之类的资源。您还设置了API网关以按需触发它。

您拥有使用AWS制作无服务器功能的技能,并将其连接到各种服务。这为构建强大的应用程序打开了很多可能性!

快乐编码!