如何将Dynamodb Local集成到AWS Cloud Development Kit中

问题描述

使用aws-cdk时,如何将DynamoDB Local集成到开发过程中?例如,以下应用程序(使用“示例应用程序”模板)可以工作,但是一个应用程序如何运行sam local invoke <id of the backendHandler lambda>并指向在您的计算机上运行的DynamoDB Local实例(而不是必须运行cdk deploy)看到实际效果

// lib/minimal-app-stack.ts

import * as apiGateway from "@aws-cdk/aws-apigateway";
import * as cdk from "@aws-cdk/core";
import {MinimalBackend} from "./minimal-backend";

export class MinimalAppStack extends cdk.Stack {
    constructor(scope: cdk.App,id: string,props?: cdk.StackProps) {
        super(scope,id,props);

        const minimalBackend = new MinimalBackend(this,"MinimalBackend");

        new apiGateway.LambdaRestApi(this,"Endpoint",{
            handler: minimalBackend.handler
        });
    }
}

// lib/minimal-backend.ts

import * as cdk from "@aws-cdk/core";
import * as dynamodb from "@aws-cdk/aws-dynamodb";
import * as lambda from "@aws-cdk/aws-lambda";

export class MinimalBackend extends cdk.Construct {
    public readonly handler: lambda.Function;

    constructor(scope: cdk.Construct,id: string) {
        super(scope,id);

        const minimalTable = new dynamodb.Table(this,"MinimalTable",{
            partitionKey: {
                name: "id",type: dynamodb.AttributeType.STRING
            }
        });

        this.handler = new lambda.Function(this,"BackendHandler",{
            code: lambda.Code.fromAsset("lambda"),handler: "backendHandler.handler",runtime: lambda.Runtime.NODEJS_12_X,environment: {
                TABLE_NAME: minimalTable.tableName
            }
        });

        minimalTable.grantReadWriteData(this.handler);
    }
}

// lambda/backendHandler.ts

// @ts-ignore
/// <reference types="aws-sdk" />

import AWS = require("aws-sdk");

const tableName = process.env.TABLE_NAME || "";
const dynamo = new AWS.DynamoDB.DocumentClient();

async function getAllItems() {
    const scanResult = await dynamo
        .scan({
            TableName: tableName
        })
        .promise();

    return scanResult;
}

exports.handler = async function (event: AWSLambda.APIGatewayEvent) {
        const response = await getAllItems();
        const data = response.Items || [];
        const stringifiedData = JSON.stringify(data,undefined,2);

        return {
            statusCode: 200,headers: {
                "Access-Control-Allow-Origin": "*","Access-Control-Allow-Methods": "OPTIONS,GET,POST,DELETE"
            },body: stringifiedData
        }
};

如果我在普通节点应用程序内部,则可以使用以下命令访问DynamoDB Local实例:

const docclient = new AWS.DynamoDB.DocumentClient( {
    region: "us-west-2",endpoint: "http://localhost:8000",convertEmptyValues: true
});

虽然不确定如何将其集成到aws-cdk中。有什么想法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)