当前位置: 首页 > 知识库问答 >
问题:

无法从我的vpc配置的lambda函数连接发电机Db

颜永怡
2023-03-14

我需要从单个lambda函数连接弹性缓存和发电机数据库。我的代码是

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代码,弹性缓存部分不起作用,但是发电机插入完美地完成了。

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

>

  • 创建vpc名称:测试vpc名称CIDR块:172.31.0.0/16租约:默认

    创建新子网。name tag:test-subnet-1a CIDR块:172.31.0.0/20

    name tag:test-subnet-1b CIDR块:172.31.16.0/20

    创建路由表名称标签:test-route-table

    创建internet网关名称:测试internet网关

    附加VPC

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

    创建路由表子网关联

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

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

    > < li>

    创建子网缓存组名称:test-cache-group

    创建弹性缓存
    类型:redis集群名称:test-cache

    子网缓存组:测试缓存组

    最后,我在lambda函数上配置了新创建的vpc。那么redis-elastic缓存连接工作正常,但是dynamo db连接丢失。我需要两者都在一个lambda函数中正常工作。

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

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

  • 共有2个答案

    万俟英锐
    2023-03-14

    现在有一个相对简单的解决方案:VPCendpoint。

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

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

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

    看https://aws.amazon.com/blogs/aws/new-vpc-endpoints-for-dynamodb/

    http://docs . AWS . Amazon . com/Amazon dynamodb/latest/developer guide/VPC-endpoints-dynamo db . html

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

    卢树
    2023-03-14

    Lambda 和迪纳摩数据库在 AWS 公有云中执行。两者都是在面向互联网的环境中执行的服务。否则,弹性缓存集群是在您自己的 VPC 上运行的用户托管服务。

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

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

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

    根据你告诉我们的。您使用NAT网关配置了VPC。如果所有配置都正确,这应该可以工作。也许您可以尝试第一个选项,将lambda放在VPC之外,并配置NAT网关以将入站连接路由到Elastic Cache Cluster。

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

     类似资料:
    • 我已经在docker容器中安装了dynamodb,并且可以通过命令行从中写入和读取记录。然而,当我尝试使用Python3连接到数据库时,我得到了一个错误。 无法连接到终结点URL:“http://localhost:8000/“:EndpointConnectionError 这是我的代码片段

    • 在过去的几个小时里,我一直在调试、配置和命名它,我似乎不明白为什么会发生这种情况。 我正在尝试调用一个 lambda 函数,该函数只是从 ec2 中检索基本信息。当我在aws控制台中测试此lambda函数时,它似乎工作正常。但是,使用以下代码在另一个lambda中调用它; 它只是超时了。没有任何反应…两个Lambda都连接到VPC和所有子网 我认为是我的新VPC导致了这个问题。我的VPC包括: 1

    • 我在VPC中使用AWS Chalice托管了一个Lambda函数,因为我希望它访问一个无服务器的Aurora DB实例。现在,我还希望这个函数将send_message()转换为SQS。

    • 我正在使用一些在VPC内部运行的AWS Lambda函数,这些函数需要连接到后端Mongo Atlas数据库进行数据存储/检索。 我是用Javascript编码的,所以很自然地使用了官方的MongoDB Node JS客户端来建立连接。我面临的问题是,每当我进行一些并发lambda调用时,其中一些调用都无法成功建立连接,并且基本上一直挂起,直到Lambda超时。例如,如果要调用5个不同的函数,2个

    • 我有一个面向互联网的V2 ELB。当我从笔记本电脑连接到VPC时,它可以将请求路由到VPC中的实例。然而,当我试图从同一VPC内的另一个实例连接到它时,安全组防火墙规则会阻止连接。 我可以让VPC中的实例连接到ELB的唯一方法是向世界开放https端口(443)。 我做错了什么? ELB(https://elb.domain.com)具有以下属性: 面向互联网,V2(非经典ELB) 从我的笔记本电