我需要从单个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。
创建vpc name:test-vpc-name 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
创建互联网网关 名称:测试互联网网关
附加VPC
路由路由中的所有出站0.0.0.0/0流量
创建路由表子网关联
创建NAT网关 subnet:test-subnet-1a
我也按照以下步骤配置了弹性缓存设置
创建子网缓存组 name:test-cache-group
创建弹性缓存
类型:redis
群集名称:test-cache
子网缓存组:test-cache-group
最后,我在lambda函数上配置了新创建的vpc。然后redis-elastic缓存连接工作正常,但是dynamo db连接丢失了。我需要从单个lambda函数中正常工作。
我认为,使用NAT网关的VPC配置有些故障。
此设置中的实际问题是什么?
答案 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
编辑提供更多详细信息。