我需要从单个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。
>
创建vpc名称:测试vpc名称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
创建internet网关名称:测试internet网关
附加VPC
路由中所有出站0.0.0.0/0流量
创建路由表子网关联
创建NAT网关子网:test-subnet-1a
我还通过以下步骤配置了弹性缓存设置
> < li>
创建子网缓存组名称:test-cache-group
创建弹性缓存
类型:redis集群名称:test-cache
子网缓存组:测试缓存组
最后,我在lambda函数上配置了新创建的vpc。那么redis-elastic缓存连接工作正常,但是dynamo db连接丢失。我需要两者都在一个lambda函数中正常工作。
我认为,使用NAT网关的VPC配置存在一些错误。
此设置中的实际问题是什么?
现在有一个相对简单的解决方案:VPCendpoint。
“以前,如果您希望VPC中的EC2(elroy:或lambda)实例能够访问DynamoDB,您有两种选择。您可以使用Internet网关(带有NAT网关或为实例分配公共IP),也可以通过VPN或AWS Direct Connect将所有流量路由到本地基础设施,然后返回Dynamo DB。”
“DynamoDB 的 VPC 终端节点使 VPC 中的 Amazon EC2 实例能够使用其私有 IP 地址访问 DynamoDB,而无需暴露在公有互联网上...您的 EC2 实例不需要公有 IP 地址,并且您的 VPC 中也不需要互联网网关、NAT 设备或虚拟私有网关。您可以使用终端节点策略来控制对 DynamoDB 的访问。您的 VPC 和 AWS 服务之间的流量不会离开亚马逊网络。"
以上引用来自以下链接。请注意,对“EC2 实例”的引用也适用于 lambda 上下文。
看https://aws.amazon.com/blogs/aws/new-vpc-endpoints-for-dynamodb/
和
http://docs . AWS . Amazon . com/Amazon dynamodb/latest/developer guide/VPC-endpoints-dynamo db . html
已编辑以提供更多详细信息。
Lambda 和迪纳摩数据库在 AWS 公有云中执行。两者都是在面向互联网的环境中执行的服务。否则,弹性缓存集群是在您自己的 VPC 上运行的用户托管服务。
让lambda函数访问弹性缓存集群的第一个选项是使用NAT实例将外部网络连接到VPC内部的弹性缓存集群。您可以使用本文档中的说明来帮助您完成此任务。
第二个选项,是您已经尝试过的选项。Amazon表示,当您配置此选项时,并不意味着Lambda将在您的VPC中执行。它定义了什么Lambda容器的弹性网络接口来访问您的VPC。归根结底,我不认为这有什么区别。您可以在此处查看详细信息。
但关键是,执行lambda的容器只有一个弹性网络接口。如果将lambda配置为使用VPC,则网络接口将配置为使用专用IP访问子网,并断开互联网连接。因此,除非您在VPC中配置了NAT实例/网关,否则它将无法访问DynamoDB。
根据你告诉我们的。您使用NAT网关配置了VPC。如果所有配置都正确,这应该可以工作。也许您可以尝试第一个选项,将lambda放在VPC之外,并配置NAT网关以将入站连接路由到Elastic Cache Cluster。
为什么不试着告诉我们结果呢?
我已经在docker容器中安装了dynamodb,并且可以通过命令行从中写入和读取记录。然而,当我尝试使用Python3连接到数据库时,我得到了一个错误。 无法连接到终结点URL:“http://localhost:8000/“:EndpointConnectionError 这是我的代码片段
在过去的几个小时里,我一直在调试、配置和命名它,我似乎不明白为什么会发生这种情况。 我正在尝试调用一个 lambda 函数,该函数只是从 ec2 中检索基本信息。当我在aws控制台中测试此lambda函数时,它似乎工作正常。但是,使用以下代码在另一个lambda中调用它; 它只是超时了。没有任何反应…两个Lambda都连接到VPC和所有子网 我认为是我的新VPC导致了这个问题。我的VPC包括: 1
我在VPC中使用AWS Chalice托管了一个Lambda函数,因为我希望它访问一个无服务器的Aurora DB实例。现在,我还希望这个函数将send_message()转换为SQS。
我正在使用一些在VPC内部运行的AWS Lambda函数,这些函数需要连接到后端Mongo Atlas数据库进行数据存储/检索。 我是用Javascript编码的,所以很自然地使用了官方的MongoDB Node JS客户端来建立连接。我面临的问题是,每当我进行一些并发lambda调用时,其中一些调用都无法成功建立连接,并且基本上一直挂起,直到Lambda超时。例如,如果要调用5个不同的函数,2个
我所做的: 我在这些帐户之间创建了VPC对等连接 还连接到每个VPC的Internet网关 路由表也已配置(允许来自两侧的流量) 案例1: “ErrorMessage”:“调用Invoke操作时发生错误(AccessDeniedException):User:arn:aws:sts::Account-a:Assumed-Role/Role-for-VPC-peering-test/lambda1_