【问题标题】:Cant connect dynamo Db from my vpc configured lambda function无法从我的 vpc 配置的 lambda 函数连接 dynamoDb
【发布时间】:2017-02-05 02:59:30
【问题描述】:

我需要从单个 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。

  1. 创建 vpc 名称:测试-vpc-名称 CIDR 块:172.31.0.0/16 租户:默认

  2. 创建一个新子网。 名称标签:test-subnet-1a CIDR 块:172.31.0.0/20

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

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

  4. 创建互联网网关 名称:test-internet-gateway

  5. 附加 VPC

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

  7. 创建路由表子网关联

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

我还按照以下步骤配置了我的弹性缓存设置

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

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

    子网缓存组:test-cache-group

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

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

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

【问题讨论】:

  • 看这里的图片:docs.aws.amazon.com/AmazonVPC/latest/UserGuide/… 你有 0.0.0.0/0 路由到你的 NAT 网关吗?
  • 我也面临同样的问题。有什么解决办法吗?
  • 您可能想查看this article。一步一步的说明是我恢复到我的 Lambda 的互联网连接所需要的。希望对您有所帮助。

标签: amazon-web-services caching aws-lambda amazon-vpc amazon-elasticache


【解决方案1】:

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

向 lambda 函数授予对弹性缓存集群的访问权限的第一个选项是使用 NAT 实例将外部网络连接转发到 VPC 内的弹性缓存集群。您可以使用来自this document 的说明来帮助您完成这项任务。

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

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

正如你告诉我们的那样。您为 VPC 配置了 NAT 网关。如果所有配置都正确,这应该可以工作。也许您可以尝试第一个选项,将您的 lambda 留在您的 VPC 之外并配置 NAT 网关以将入站连接路由到您的弹性缓存集群。

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

【讨论】:

    【解决方案2】:

    现在有一个相对简单的解决方案: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 服务之间的流量不会离开 Amazon 网络。"

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

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

    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/vpc-endpoints-dynamodb.html

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

    【讨论】:

    • 欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.
    • 我确实详细修改了我的帖子。如果能删除该反对票就好了。
    • FWIW - 我按照上面这些链接中的说明进行操作,但仍然无法连接。阻塞的是NACL。因此,我将以下 CIDR 块(52.94.0.0/22、52.119.224.0/20)添加到入站和出站 ALLOW NACL。这些来自添加到路由表的条目:pl-02cxxxxx (com.amazonaws.us-east-1.dynamodb, 52.94.0.0/22, 52.119.224.0/20)。希望这对其他人有帮助。
    • 我遵循了官方 AWS 文档并创建了端点,但是我还必须向分配给我的 VPC 的网络 ACL 添加额外的规则,其中包含可以在此处找到的 dynamodb IP 地址:ip-ranges.amazonaws.com/ip-ranges.json(奇怪!端点是旨在消除对外部流量的需求)
    猜你喜欢
    • 2021-04-06
    • 2021-09-06
    • 2021-01-07
    • 2018-10-20
    • 2016-12-26
    • 2018-01-03
    • 1970-01-01
    • 2020-03-02
    • 2019-11-19
    相关资源
    最近更新 更多