我已经在我的 AWS VPC 和我的 mongodb 集群之间设置了 VPC 对等。 lambda 函数连接到 VPC,由 cognito 触发,并负责与 Mongo 对话。
VPC在terraform中配置如下:
data "aws_availability_zones" "available" {}
# VPC
resource "aws_vpc" "lambda_vpc" {
cidr_block = var.vpc_cidr
enable_dns_hostnames = true
enable_dns_support = true
tags = {
"Name" = "${terraform.workspace}_vpc_for_lambda"
}
}
# Subnets
resource "aws_subnet" "vpc_private_subnet" {
depends_on = [aws_vpc.lambda_vpc]
count = length(data.aws_availability_zones.available.names)
vpc_id = aws_vpc.lambda_vpc.id
cidr_block = # the cidr for the subnet (removed for this post)
availability_zone = data.aws_availability_zones.available.names[count.index]
}
# Route table
resource "aws_route_table" "lambda_route_table" {
vpc_id = aws_vpc.lambda_vpc.id
}
# Security Groups
resource "aws_security_group" "lambda_security" {
name = "lambda_vpc_security_group"
vpc_id = aws_vpc.lambda_vpc.id
egress {
description = "The required network traffic rule for connecting to Atlas" # https://www.mongodb.com/docs/atlas/security-vpc-peering/#aws-vpc-peering-prerequisites"
protocol = "6" # this is TCP
from_port = 27015
to_port = 27017
cidr_blocks = var.mongodb_cidr_block
}
}
然后我有:
从 terraform 配置可以看出,我没有互联网网关。这是有目的的,lambda 不需要与互联网对话,只需要通过 VPC 对等连接与 MongoDB 集群对话。
lambda 附加到的安全组(与配置中的相同)具有在 mongo 文档中指定的规则 --> https://www.mongodb.com/docs/atlas/security-vpc -对等/#aws-vpc-对等-先决条件
在 Mongo 方面,我列入白名单的初始 IP 地址包括 AWS VPC CIDR 块和
0.0.0.0/0
。似乎一切正常。但是,我想将列入白名单的 IP 锁定为仅 VPC CIDR 和我使用的 IP。据我所知,进入 Mongo 的流量始终来自 AWS VPC,因为这就是配置在 terraform 和 AWS 控制台中所说的内容。但是,当我删除 0.0.0.0/0
规则时,lambda 不再能够连接到 MongoDB 集群。我不明白为什么会这样,当然它不需要这条规则来连接,因为流量不是来自任何不属于 VPC CIDR 的 IP。
从那时起,我也尝试将安全组ID添加到白名单IP列表中(这是Mongo IP访问列表似乎支持的东西。)但这也没有解决问题。
有人知道为什么会这样吗?
编辑:
我已将流日志添加到 VPC 以尝试根据此处的文档调试流量 --> https://aws.amazon.com/blogs/aws/learn-from-your-vpc-flow-logs -with-additional-meta-data/
我确保让流日志显示源和目标 IP 以及我认为会有趣的其他字段。从结果来看,似乎绝对没有来自我的 lambda 的流量通过 VPC。 .
lambda 的流量是否有可能不经过 VPC,因为它附加到它?关于可能出什么问题的任何想法?
如果实例是问题所在,解决方案是将实例类型更改为任何不是:Atlas M0(免费集群)、M2、M5 或无服务器实例。
你分享的配置似乎是正确的,所以在更改实例后IP白名单中没有0.0.0.0/0的连接应该是正常的。