不能从我的vpc配置lambda函数连接dynamo Db



我需要从单个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');
 }; 

我执行这个lambda代码没有配置vpc,弹性缓存部分不工作,但发电机插入是完美的。

之后,我按照以下步骤在我的帐户中设置了VPC。

  1. 创建vpc名称:test-vpc-nameCIDR布洛克:172.31.0.0/16租赁:默认

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

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

  3. 创建路由表name tag: test-route-table

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

  5. 附加VPC

  6. 路由所有出方向0.0.0.0/0流量

  7. 创建路由表子网关联

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

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

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

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

    子网缓存组test-cache-group

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

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

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

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

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

第二个选项,就是你已经尝试过的那个。Amazon表示,当您配置此选项时,并不意味着Lambda将在VPC内执行。它定义了Lambda容器的弹性网络接口来访问您的VPC。在一天结束的时候,我不认为这有什么不同。你可以在这里看到详细信息。

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

如你方所言。已为VPC配置NAT网关。如果所有配置都正确,则应该可以正常工作。也许你可以尝试第一个选项,将lambda留在VPC之外,并配置NAT网关将入站连接路由到弹性缓存集群。 为什么不试着告诉我们结果呢?

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

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

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

以上引用来自下面的链接。注意,对"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

编辑以提供更多细节。

我偶然发现了一份我认为对我很有帮助的文档:

https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html

我已经正确设置了入站和出站的所有子网和安全组规则,但仍然超时。

我意识到我还需要AWS用户的IAM权限,以验证您可以访问私有子网。

根据文档:

When you configure VPC connectivity, Lambda uses your permissions to verify network 
resources. To configure a function to connect to a VPC, your user needs the following permissions:
User permissions
- ec2:DescribeSecurityGroups
- ec2:DescribeSubnets
- ec2:DescribeVpcs

将这些权限添加到代码中连接到AWS资源的用户访问键中,它应该可以工作。

最新更新