使用直接连接从 AWS Lambda 连接到 DocumentDB(无需 NAT 网关)(在同一 VPC 中)

问题描述 投票:0回答:1

我想分享一个解决方案,允许您在不使用 NAT 网关的情况下从 AWS Lambda 函数连接到 Amazon DocumentDB,前提是两者位于同一 VPC 中。这可能是开发过程中节省成本的方法。

问题: 当直接连接到 DocumentDB 时(例如通过 SSH 或在同一 VPC 内),客户端可能无法读取数据,尽管发生了连接。发生这种情况是因为 DocumentDB 通知 Mongo 客户端连接到特定的 DNS 名称。

解决方案

  1. 将 Lambda 和 DocumentDB 放置在同一 VPC 中
  2. 使用直接连接参数:将
    directConnection=true
    参数添加到 MongoDB URI 连接字符串。这会强制 MongoDB 驱动程序直接连接到指定的主机,绕过用于副本集的常用 DNS 解析过程。
mongodb://username:password@hostname:27017/database?directConnection=true

OPT:为其他 AWS API 配置 VPC 终端节点:如果您的 Lambda 函数需要访问其他 AWS API,请配置必要的 VPC 终端节点以在无需 NAT 网关的情况下启用此通信。

补充说明

  1. 数据包捕获:可以使用

    tcpdump
    等数据包捕获工具观察此连接行为。

  2. 生产用途:虽然此方法适用于开发,但可能不适合生产用途,因为它偏离了标准 AWS 指南。

  3. 安全注意事项:确保遵循所有安全最佳实践,包括正确的 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
lambda amazon-vpc aws-documentdb aws-documentdb-mongoapi
1个回答
0
投票

我尝试购买不起作用。我删除 Nat 并且出现“连接超时”

© www.soinside.com 2019 - 2024. All rights reserved.