Amazon web services 无法从我的vpc配置的lambda功能连接dynamo Db

Amazon web services 无法从我的vpc配置的lambda功能连接dynamo Db,amazon-web-services,caching,aws-lambda,amazon-vpc,amazon-elasticache,Amazon Web Services,Caching,Aws Lambda,Amazon Vpc,Amazon Elasticache,我需要从一个lambda函数连接弹性缓存和dynamo db。我的代码是 exports.handler = (event, context, callback) => { var redis = require("redis"); var client; function connectRedisClient() { client = redis.createClient(6379, "dgdfgdfgdfgdfgdfgfd.use1.cache

我需要从一个lambda函数连接弹性缓存和dynamo db。我的代码是

exports.handler = (event, context, callback) => {

    var redis = require("redis");
    var client;
    function connectRedisClient() {
        client = redis.createClient(6379, "dgdfgdfgdfgdfgdfgfd.use1.cache.amazonaws.com", { no_ready_check: true });
    }

    connectRedisClient();
    client.set('sampleKey', 'Hello World', redis.print);
    console.log("set worked");
    client.quit();


    var AWS = require("aws-sdk");
    var docClient = new AWS.DynamoDB.DocumentClient();
    var table = "dummy";
    var year = 2015;
    var title = "The Big New Movie";
    var params = {
        TableName: table,
        Item: {
            "userid": "manafcj",
            "year": year,
            "title": title,
            "test1": [645645, 7988],
            "info": {
                "plot": "Nothing happens at all.",
                "rating": 0
            }
        }
    };

    console.log("Adding a new item...");
    docClient.put(params, function (err, data) {
        if (err) {
            console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("Added item:", JSON.stringify(data, null, 2));
        }
    });
    callback(null, 'Hello from Lambda');
 }; 
我在没有配置vpc的情况下执行了这个lambda代码,弹性缓存部分不起作用,但dynamo插入完成得非常完美

之后,我通过以下步骤在我的帐户中设置VPC

  • 创建专有网络 名称:测试专有网络名称 CIDR区块:172.31.0.0/16 租约:默认

  • 创建新的子网。 名称标签:test-1a CIDR区块:172.31.0.0/20

    名称标签:test-subnet-1b CIDR区块:172.31.16.0/20

  • 创建路由表 名称标签:测试路由表

  • 创建internet网关 名称:测试互联网网关

  • 连接专有网络

  • 路由路由中的所有出站0.0.0.0/0流量

  • 创建路由表子网关联

  • 创建NAT网关 子网:test-subnet-1a

  • 此外,我还通过以下步骤配置了弹性缓存设置

  • 创建子网缓存组 名称:测试缓存组

  • 创建弹性缓存
    类型:redis 集群名称:测试缓存

    子网缓存组:测试缓存组

  • 最后,我在lambda函数上配置了新创建的vpc。然后redis弹性缓存连接工作正常,但dynamo db连接丢失。我需要从一个单一的lambda函数都能很好地工作

    我认为,在使用NAT网关的VPC配置中存在一些错误


    此设置中的实际问题是什么?

    Lambda和DynamoDB在AWS公共云中执行。两者都是在面向internet的环境中执行的服务。否则,弹性缓存集群是在您自己的VPC上运行的用户管理服务

    让lambda功能访问弹性缓存群集的第一个选项是使用NAT实例将外部网络连接转发到VPC内的弹性缓存群集。您可以使用的说明来帮助您完成此任务

    第二个选项是您已经尝试过的选项。Amazon表示,当您配置此选项时,并不意味着Lambda将在VPC内执行。它定义了Lambda容器的弹性网络接口以访问您的VPC。归根结底,我不认为这有什么区别。你可以看到细节

    但关键是,执行lambda的容器只有一个弹性网络接口。如果将lambda配置为使用VPC,则网络接口将配置为使用专用IP访问子网,并失去internet连接。因此,除非您的VPC中有配置NAT实例/网关,否则它将无法访问DynamoDB

    按照你告诉我们的。您使用NAT网关配置了VPC。如果所有配置均正确,则该功能应能正常工作。也许您可以尝试第一个选项,将lambda留在VPC之外,并配置NAT网关以将内部连接路由到弹性缓存集群


    为什么不试着告诉我们结果呢?

    现在有一个相对简单的解决方案:VPC端点

    “以前,如果您希望VPC中的EC2(elroy:或lambda)实例能够访问DynamoDB,您有两个选择。您可以使用Internet网关(带有NAT网关或为实例分配公共IP)或者,您可以通过VPN或AWS Direct Connect将所有流量路由到本地基础设施,然后返回DynamoDB。”

    “DynamoDB的VPC端点使VPC中的Amazon EC2实例能够使用其私有IP地址访问DynamoDB,而不暴露于公共Internet……您的EC2实例不需要公共IP地址,您的VPC中也不需要Internet网关、NAT设备或虚拟私有网关。您可以使用端点策略来控制对DynamoDB的访问。VPC和AWS服务之间的流量不会离开亚马逊网络。"

    上面的引文来自下面的链接。请注意,对“EC2实例”的引用也适用于lambda上下文


    编辑以提供更多详细信息。

    请查看此处的图片:您是否有0.0.0.0/0路由到您的NAT网关?我面临同样的问题。有解决方案吗?您可能希望签出。分步说明是我恢复到Lambda的internet连接所需的。希望有帮助。欢迎链接到解决方案,但请确保你的答案在没有它的情况下是有用的:这样你的其他用户就会知道它是什么以及它为什么在那里,然后引用你链接到的页面中最相关的部分,以防目标页面不可用。我确实修改了我的帖子,并提供了详细信息。如果删除否决票会很好。FWIW-我在这些li中遵循了这些说明上面的nks仍然无法连接。阻塞的是NACL。因此我将以下CIDR块(52.94.0.0/22,52.119.224.0/20)添加到入站和出站允许NACL。这些来自添加到路由表的条目:pl-02cxxxxx(com.amazonaws.us-east-1.dynamodb,52.94.0.0/22,52.119.224.0/20)。希望这对其他人有所帮助。我遵循AWS官方文档并创建了端点,但我还必须为分配给我的VPC的网络ACL添加额外的规则,其中包含可在此处找到的dynamodb IP地址:(奇怪!端点旨在消除对外部通信的需要)