

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 建造一个包含 MongoDB Atlas 的 AWS 着陆区
<a name="build-aws-landing-zone-that-includes-mongodb-atlas"></a>

*Igor Alekseev，Amazon Web Services*

*Anuj Panchal，MongoDB*

## Summary
<a name="build-aws-landing-zone-that-includes-mongodb-atlas-summary"></a>

此模式描述了如何构建与 MongoDB Atlas 集群集集成的 AWS 着陆区。该基础设施使用 Terraform 脚本自动部署。

结构良好的多账户 AWS 环境（称为 landing [zon](https://docs.aws.amazon.com/prescriptive-guidance/latest/strategy-migration/aws-landing-zone.html) e）可提供可扩展性和安全性，尤其适合企业。它充当快速部署工作负载和应用程序的基础，有助于确保人们对安全和基础设施的信心。构建登录区需要仔细考虑技术和业务因素，包括账户结构、网络、安全和访问管理。这些考虑因素应与贵组织未来的发展和业务目标保持一致。

此模式的使用案例包括下述内容。
+ **企业 SaaS 和 PaaS 平台：**运行的多租户软件即服务 (SaaS) 应用程序和平台即服务 (PaaS) 平台 AWS 可以使用此设置来帮助提供对 MongoDB Atlas 的安全、私密访问，而无需通过公共互联网暴露数据。
+ **高度监管的行业**：银行、金融服务、医疗保健和政府工作负荷要求严格遵守健康保险便携性和责任法案 (HIPAA)、支付卡行业数据安全标准 (PCI DSS)、系统和组织控制2 () 和《通用数据保护条例》(GDPRSOC2) 等标准将受益于：
  + 通过加密的私有连接 AWS PrivateLink
  + MongoDB 副本集的多可用区高可用性
+ **安全 AI/ML 工作负载**：Amazon Bedrock、Amazon AI 或自定义 A SageMaker I 模型中的训练或推理管道可以安全地在 MongoDB Atlas 中获取和存储数据。 PrivateLink
+ **灾难恢复和业务连续性**：多可用区设计可确保单个可用区故障不会中断工作负载。跨可用区的 Atlas 副本集可确保自动实现故障转移。这对于金融科技（fintech）应用程序、数字银行或医疗保健监控等始终在线的服务至关重要。

## 先决条件和限制
<a name="build-aws-landing-zone-that-includes-mongodb-atlas-prereqs"></a>

**先决条件**
+ 组织所有者可以访问 MongoDB Atlas，因此您可以创建 Atlas API 密钥。有关此要求的信息，请参阅 MongoDB 文档中的[管理组织访问权限](https://www.mongodb.com/docs/atlas/tutorial/manage-organizations/)。
+ 一个活跃的 [AWS 账户](https://aws.amazon.com/resources/create-account/)。
+ [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)，已安装并配置。
+ 使用 MongoDB 版本 6.0 或更高版本创建的 MongoDB Atlas 集群。
+ 熟悉 MongoDB 和 MongoDB Atlas。有关更多信息，请参阅 [MongoDB Atlas 文档](https://www.mongodb.com/docs/atlas/)。

**限制**
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然后选择相应服务的链接。

## 架构
<a name="build-aws-landing-zone-that-includes-mongodb-atlas-architecture"></a>

以下参考架构图说明了与 MongoDB Atlas 私有端点集成的 AWS 着陆区的部署设置。该参考架构演示了如何建立与 MongoDB Atlas 集成的安全、可扩展且高度可用的 AWS 着陆区。通过结合多可用区部署、最低权限安全控制和私有连接等 AWS 最佳实践，该设计使组织能够为现代应用程序提供强大的环境。

![与 MongoDB Atlas 集成的 AWS 登录区的多可用区架构。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/72d335b9-b5b1-4fe2-9972-65edbec60ab1/images/82a8cc98-6f22-4e28-a236-57a809930055.png)


此架构包含以下内容：

**VPC**
+ 单个虚拟私有云（VPC）跨越三个可用区。
+ VPC 细分为与每个可用区对齐的子网。这些子网分发工作负载以实现高可用性。

**互联网访问**
+ 互联网网关为有需要的资源（例如应用程序或堡垒主机）提供出站互联网连接。
+ 公有子网可以包含 NAT 网关，它允许私有子网工作负载下载更新、补丁和其他必需的软件包，而无需将其直接暴露于公共互联网。

**私有子网和路由表**
+ 应用程序组件、微服务或其他敏感资源通常位于私有子网中。
+ 专用路由表控制流量。将私有子网的出站流量定向到 NAT 网关，以实现安全、仅限出站的互联网访问。
+ 来自互联网的入站请求流经公有子网中的弹性负载均衡器或堡垒主机（如果使用），然后相应地路由到私有子网资源。

**通过 MongoDB Atlas 进行连接 PrivateLink**
+ 该架构使用 PrivateLink （通过 VPC 终端节点）安全地连接到 MongoDB Atlas，而无需将您的数据暴露给公共互联网。
+ 请求仍保留在主 AWS 干网络上。传输中的数据受益于 PrivateLink 加密，并且永远不会通过公共互联网路由。
+ MongoDB Atlas 专用 VPC 托管您的主节点和辅助节点，并为您的托管数据库集群提供安全、隔离的环境。

**多可用区部署**
+ 关键基础设施组件（例如 NAT 网关和应用程序子网）分布在至少三个可用区中。如果可用区出现中断，该架构可确保其余可用区中的工作负载保持正常运行。
+ 默认情况下，MongoDB Atlas 通过副本集提供高可用性，并确保您的数据库层保持容错能力。关键基础设施分布在至少三个可用区中，以确保弹性。

## 工具
<a name="build-aws-landing-zone-that-includes-mongodb-atlas-tools"></a>

**AWS 服务**
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 有助于您通过 API 调用来替换代码中的硬编码凭证（包括密码），以编程方式检索密钥。

**其他产品和工具**
+ [MongoDB Atlas](https://www.mongodb.com/atlas) 是一种完全托管式数据库即服务（DbaaS），用于在云中部署和管理 MongoDB 数据库。
+ [Terraform](https://www.terraform.io/) 是一款基础设施即代码 (IaC) 工具 HashiCorp ，可帮助您创建和管理云和本地资源。在这种模式中，您可以使用 Terraform 运行脚本，以便在和 AWS MongoDB Atlas 上部署所需资源。

**代码存储库**

此模式的代码可在[AWS 和 MongoDB Atlas](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone) 着陆区存储库中找到。 GitHub 

## 操作说明
<a name="build-aws-landing-zone-that-includes-mongodb-atlas-epics"></a>

### 完成发现和评测
<a name="complete-discovery-and-assessment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确定关键利益相关者。 | 确定参与您的登录区项目的所有关键利益相关者和团队成员。这可能包括以下角色：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/build-aws-landing-zone-that-includes-mongodb-atlas.html) | 迁移主管 | 
| 创建结构蓝图。 | 创建一份蓝图，概述您 AWS 和 MongoDB Atlas 启用的着陆区的所需结构。 | 迁移主管 | 
| 创建架构计划。 | 与您的应用程序架构师合作，分析需求并设计可容错、有弹性的架构。此模式提供了一个入门架构模板供您参考。您可以自定义此模板以满足组织的安全和基础设施需求。 | 云架构师 | 
| 规划设置和部署。 | 与所有利益相关者一起确定架构将如何部署、如何实施安全措施以及任何其他方面，以确保与组织和请求团队的利益保持一致。 | 迁移主管、 DevOps 工程师、数据库管理员 | 

### 设置 MongoDB Atlas 环境
<a name="set-up-the-mongodb-atlas-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | 运行以下命令从[GitHub 存储库](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone)中克隆代码：<pre>git clone https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone</pre> | 应用程序开发者、 DevOps 工程师 | 
| 获取您的 Atlas 组织 ID。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/build-aws-landing-zone-that-includes-mongodb-atlas.html) | 数据库管理员 | 
| 生成 Atlas 组织级 API 密钥。 | 要在 Atlas 中生成组织级 API 密钥，请按照 [MongoDB 文档](https://www.mongodb.com/docs/atlas/configure-api-access/#grant-programmatic-access-to-an-organization)中的说明操作。 | 数据库管理员 | 
| 在中创建密钥 AWS Secrets Manager。 | 将上一步中生成的 MongoDB Atlas API 密钥作为键值对密钥存储在 Secrets Manager 中。有关说明，请参阅 [Secrets Manager 文档](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。 | DevOps 工程师 | 
| 选择 Atlas 集群层。 | 要选择正确的 Atlas 集群层，请按照 [MongoDB 文档](https://www.mongodb.com/docs/atlas/sizing-tier-selection/)中的说明操作。 | 数据库管理员 | 

### 设置 AWS 环境
<a name="set-up-the-aws-environments"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改 Terraform 脚本。 | 在存储 GitHub 库的本地副本中，更新 [modules/mongodb-atlas/main.tf](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone/blob/3748350730ec2ac7ab64662d536b67b4840c667c/modules/mongodb-atlas/main.tf#L12) 文件中的密钥名称（第 12 行），这样 Terraform 就可以在部署期间从 Secrets Manager 检索凭证。 | DevOps 工程师 | 
| 创建 AWS 访问密钥 ID 和私有密钥。 | 要创建您的 AWS 访问密钥 ID 和密钥，请按照 re AWS : Post 文章中的说明[如何创建 AWS 访问](https://repost.aws/knowledge-center/create-access-key)密钥？<br />最佳做法是为策略分配所需的最低权限，但对于这种情况，请选择 `AdministratorAccess` 策略。<br />创建访问密钥后，请查看 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)，以了解管理访问密钥的最佳实践。 | DevOps 工程师 | 
| 分配弹性 IP 地址。 | 分配至少两个弹性 IP 地址 IDs。有关说明，请参阅 [Amazon Virtual Private Cloud（Amazon VPC）文档](https://docs.aws.amazon.com/vpc/latest/userguide/WorkWithEIPs.html)。 | DevOps 工程师 | 
| 创建 S3 存储桶。 | 按照 [Amazon Simple Storage Service（Amazon S3）文档](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)中的说明，创建 S3 存储桶来存储 Terraform 部署状态。 | DevOps 工程师 | 
| 更新用于存储的 S3 存储桶。 | 更新本地版本 [environments/development/main.tf](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone/blob/83e0b52cc4a8c12b24b54edeecbae496880d3615/environments/development/main.tf#L16) 中的 S3 存储桶信息，使其与您在上一步中创建的存储桶的名称和区域相匹配，并指定 key prefix。例如：<pre>terraform {<br />       ...<br />  backend "s3" {<br />    bucket = "startup-name-product-terraform"<br />    key    = "network/dev"<br />    region = "ap-southeast-1"<br />  }<br />}</pre><br />在本示例中，您可以将 Terraform 配置为使用密钥前缀 `network/dev` 来组织 Terraform 状态文件。您可以将该值更改为 `prod` 或 `staging` 以匹配要创建的环境。有关使用多种环境的信息，请参阅本节的最后一步。<br />有关 Amazon S3 键前缀的更多信息，请参阅 Amazon S3 文档中的[使用前缀组织对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html)。 | DevOps 工程师 | 
| 设置 Terraform 变量。 | 示例登录区使用 [Terraform 变量定义文件](https://www.terraform.io/docs/language/values/variables.html#variable-definitions-tfvars-files)定义输入变量值。<br />变量文件位于 [environments/development/variables.tf。](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone/blob/main/environments/development/variables.tf)可以在 [environments/development/terraform.tfv](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone/blob/main/environments/development/terraform.tfvars) ars 文件中设置变量值。按照 GitHub 存储库的自述[文件中所述](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone/blob/main/README.md#terraform-variables)配置这些变量。 | DevOps 工程师 | 
| 设置环境变量。 | 如果您计划在本地计算机上运行 Terraform 脚本，请设置以下环境变量：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/build-aws-landing-zone-that-includes-mongodb-atlas.html)<br />有关设置环境变量的更多信息，请参阅 [AWS Command Line Interface （AWS CLI）文档](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html#envvars-set)。 | DevOps 工程师 | 
| 检查 VPC 配置。 | 要遵循推荐的最佳实践 AWS，请在 Terraform 脚本中配置 VPC 和子网 CIDRs、NAT 网关、路由和路由表的设置以满足组织的需求。有关详细信息，请参阅存储库的[自述文件](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone/blob/main/README.md#vpc-configurations)。 GitHub  | DevOps 工程师 | 
| 标记资源。 | 在 Terraform 脚本部署 AWS 资源时，您可以标记资源以对其进行监控。有关示例，请参阅 GitHub 存储库的[自述文件](https://github.com/mongodb-partners/AWS-MongoDB-Atlas-Landing-Zone/blob/main/README.md#resource-taggings)。有关通过成本和使用率等标签监控资源的信息，请参阅 AWS Billing 文档中的[激活用户定义的成本分配标签](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/activating-tags.html)。 | DevOps 工程师 | 
| 使用多种环境。 |  GitHub 存储库提供了一个`development`环境文件夹。您还可将自己的环境添加到环境文件夹中。<br />要添加环境，请将 `development` 文件夹复制到 `environments` 下的新文件夹（例如，`prod` 或 `staging`）。然后，您可以使用新值更新 `terraform.tfvars` 文件。 | DevOps 工程师 | 

### 部署登录区
<a name="deploy-the-landing-zone"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 初始化 Terraform 工作目录。 | 要初始化工作目录并下载必要的软件包，请运行以下命令：<pre>terraform init</pre> | DevOps 工程师 | 
| 创建执行计划。 | 要创建执行计划并可视化 Terraform 将对您的基础设施所做的更改，请运行以下命令：<pre>terraform plan</pre> | DevOps 工程师 | 
| 部署更改。 | 要按照代码中所述对基础设施实施更改，请运行以下命令：<pre>terraform apply</pre> | DevOps 工程师 | 
| 验证部署。 | 验证 Terraform 在您的基础设施中创建或修改的组件。<br />要测试设置，请在 VPC 中或连接到 VPC 中配置计算资源（例如，Amazon EC2 实例或 AWS Lambda 函数）。 | DevOps 工程师，应用程序开发人员 | 

### 删除资源
<a name="remove-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 清理。 | 完成测试后，运行以下命令来销毁 Terraform 在您的基础设施中部署的资源：<pre>terraform destroy</pre> | DevOps 工程师 | 

## 相关资源
<a name="build-aws-landing-zone-that-includes-mongodb-atlas-resources"></a>

**发现与评测**
+ [设置着陆区的管理提示](https://docs.aws.amazon.com/controltower/latest/userguide/tips-for-admin-setup.html)（AWS Control Tower 文档）
+ [对 landing zone 配置的期望](https://docs.aws.amazon.com/controltower/latest/userguide/getting-started-configure.html)（AWS Control Tower 文档）
+ landin@@ [g zone 更新最佳实践](https://docs.aws.amazon.com/controltower/latest/userguide/lz-update-best-practices.html)（AWS Control Tower 文档）

**设置 MongoDB 地图集和环境 AWS **
+ [获取 MongoDB Atlas](https://aws.amazon.com/marketplace/pp/prodview-pp445qepfdy34)（AWS Marketplace）
+ [内存](https://docs.atlas.mongodb.com/sizing-tier-selection/#memory)（MongoDB Atlas 文档）
+ [使用 Atlas 示例数据集的大小调整示例](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#example--the-service-sample-data-sets)（MongoDB Atlas 文档）
+ [移动应用程序的大小调整示例](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#example--mobile-app)（MongoDB Atlas 文档）
+ [网络流量](https://docs.atlas.mongodb.com/sizing-tier-selection/#network-traffic)（MongoDB Atlas 文档）
+ [集群自动扩缩](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#cluster-auto-scaling)（MongoDB Atlas 文档）
+ [Atlas 大小调整模板](https://www.mongodb.com/docs/atlas/sizing-tier-selection/)（MongoDB Atlas 文档）
+ [设置网络对等连接](https://docs.atlas.mongodb.com/security-vpc-peering/)（MongoDB Atlas 文档）
+ [Atlas 中的私有端点](https://docs.atlas.mongodb.com/security-private-endpoint/)（MongoDB Atlas 文档）
+ [客户端字段级加密](https://docs.mongodb.com/manual/core/security-client-side-encryption)（MongoDB 数据库文档）
+ [自动加密](https://docs.mongodb.com/manual/core/security-automatic-client-side-encryption)（MongoDB 数据库文档）
+ [选择集群层](https://www.mongodb.com/docs/atlas/manage-clusters/#select-cluster-tier)（MongoDB Atlas 文档）

**部署登录区**
+ [AWS上的 Terraform](https://docs.aws.amazon.com/whitepapers/latest/cicd_for_5g_networks_on_aws/terraform.html)（* AWS上的 5G 网络的 CI/CD* 白皮书）
+ [带有 Terraform 的 MongoDB Atlas](https://www.mongodb.com/developer/products/atlas/mongodb-atlas-with-terraform/)（MongoDB 文档）