无法从我的vpc配置的lambda函数

时间:2016-09-27 12:58:13

标签: 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.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 name:test-vpc-name CIDR块:172.31.0.0/16 租约:默认

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

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

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

  4. 创建互联网网关 名称:测试互联网网关

  5. 附加VPC

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

  7. 创建路由表子网关联

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

  9. 我也按照以下步骤配置了弹性缓存设置

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

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

      子网缓存组:test-cache-group

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

      我认为,使用NAT网关的VPC配置有些故障。

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

2 个答案:

答案 0 :(得分:5)

Lambda和DynamoDB在AWS Public Cloud中执行。两者都是在面向互联网的环境中执行的服务。否则,Elastic Cache Cluster是在您自己的VPC上运行的用户管理服务。

授予lambda函数弹性缓存集群访问权限的第一个选项是使用NAT实例向VPC内的Elastic Cache集群发送外部网络连接。您可以使用here中的说明来帮助您完成此任务。

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

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

按照你告诉我们的。您使用NAT网关配置了VPC。如果所有都配置正确,这应该是有效的。也许您可以尝试使用第一个选项,将lambda保留在VPC外部并配置NAT网关以将inboud连接路由到Elastic Cache Cluster。

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

答案 1 :(得分:3)

现在有一个相对简单的解决方案: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

编辑提供更多详细信息。