我想分享一个解决方案,允许您在不使用 NAT 网关的情况下从 AWS Lambda 函数连接到 Amazon DocumentDB,前提是两者位于同一 VPC 中。这可能是开发过程中节省成本的方法。
问题: 当直接连接到 DocumentDB 时(例如通过 SSH 或在同一 VPC 内),客户端可能无法读取数据,尽管发生了连接。发生这种情况是因为 DocumentDB 通知 Mongo 客户端连接到特定的 DNS 名称。
解决方案:
directConnection=true
参数添加到 MongoDB URI 连接字符串。这会强制 MongoDB 驱动程序直接连接到指定的主机,绕过用于副本集的常用 DNS 解析过程。mongodb://username:password@hostname:27017/database?directConnection=true
OPT:为其他 AWS API 配置 VPC 终端节点:如果您的 Lambda 函数需要访问其他 AWS API,请配置必要的 VPC 终端节点以在无需 NAT 网关的情况下启用此通信。
补充说明:
数据包捕获:可以使用
tcpdump
等数据包捕获工具观察此连接行为。
生产用途:虽然此方法适用于开发,但可能不适合生产用途,因为它偏离了标准 AWS 指南。
安全注意事项:确保遵循所有安全最佳实践,包括正确的 VPC 设置、IAM 角色和安全组配置。
我希望这可以帮助其他希望连接到 DocumentDB 的人,而不会产生 NAT 网关的额外成本,同时仍然保持通过 VPC 端点对其他 AWS 服务的访问。如果有人对此方法有进一步的见解或担忧,特别是在生产使用方面,请分享您的想法!
Python代码:
import pymongo
DOCUMENTDB_ENDPOINT = 'docdb-a.cluster-hidden.eu-central-1.docdb.amazonaws.com'
DOCUMENTDB_PORT = 27017
DOCUMENTDB_USERNAME = 'master'
DOCUMENTDB_PASSWORD = 'paasWORD123!!'
DB_NAME = 'docdb'
COLLECTION_NAME = 'collection_a'
url = f"mongodb://{DOCUMENTDB_USERNAME}:{DOCUMENTDB_PASSWORD}@{DOCUMENTDB_ENDPOINT}:{DOCUMENTDB_PORT}/?ssl=true&tlsAllowInvalidHostnames=true&tlsCAFile=ca-bundle.pem&directConnection=true&retryWrites=false"
client = pymongo.MongoClient(url)
db = client[DB_NAME]
collection = db[COLLECTION_NAME]
collection.read_any({})
client.close
我尝试购买不起作用。我删除 Nat 并且出现“连接超时”