我需要从单个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。
创建vpc名称:test-vpc-nameCIDR布洛克:172.31.0.0/16租赁:默认
创建新子网。名称标签:test-subnet-1aCIDR块:172.31.0.0/20
名称标签:test-subnet-1bCIDR块:172.31.16.0/20
创建路由表name tag: test-route-table
创建internet网关名称:test-internet-gateway
附加VPC
路由所有出方向0.0.0.0/0流量
创建路由表子网关联
创建NAT网关子网:test-subnet-1a
我还按照以下步骤配置了我的弹性缓存设置
创建子网缓存组名称:test-cache-group
创建弹性缓存
类型:复述,集群名称: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资源的用户访问键中,它应该可以工作。