

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

# 在不同的 AWS 账户中 VPCs 使用一致的可用区
<a name="use-consistent-availability-zones-in-vpcs-across-different-aws-accounts"></a>

*Adam Spicer，Amazon Web Services*

## Summary
<a name="use-consistent-availability-zones-in-vpcs-across-different-aws-accounts-summary"></a>

在 Amazon Web Services（AWS）云上，可用区的名称可能因您的 AWS 账户和标识其位置的[可用区 ID（AZ ID）](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html)而异。如果您使用 AWS CloudFormation 创建虚拟私有云 (VPCs)，则在创建子网时必须指定可用区的名称或 ID。如果您 VPCs 在多个账户中创建，则可用区名称是随机分配的，这意味着子网在每个账户中使用不同的可用区。 

要在您的账户中使用相同的可用区，您必须将每个账户中的可用区名称映射至相同的可用区 ID。例如，下图表明，`use1-az6` 可用区 ID 在 AWS 账户 A 中名为 `us-east-1a`，在 AWS 账户 Z 中名为 `us-east-1c`。

![use1-az6 可用区 ID 在 AWS 账户 A 中名为 us-east-1a，在 AWS 账户 Z 中名为 us-east-1c。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/9954e7f9-d6ce-44bd-af99-0c6bb7cd3cb0/images/23c8a37b-2408-4534-a1e0-bccfa4d7fbe3.png)


 

此模式提供了一个跨账户、可扩展的解决方案，用于在子网中使用同一个可用区，从而帮助确保区域一致性。区域一致性可确保您的跨账户网络流量避免跨可用区网络路径，这有助于降低数据传输成本并降低工作负载之间的网络延迟。

这种模式是 AWS CloudFormation [AvailabilityZoneId 属](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-availabilityzoneid)性的另一种方法。

## 先决条件和限制
<a name="use-consistent-availability-zones-in-vpcs-across-different-aws-accounts-prereqs"></a>

**先决条件**
+ 位于相同 AWS 区域 中的两个有效 AWS 账户。
+ 评估需要多少个可用区来支持您在该区域中的 VPC 要求。
+ 识别并记录您需要支持的每个可用区的可用区 ID。有关这方面的更多信息，请参阅 [AWS Resource Access Manager 文档中的您的 AWS 资源的可用区 IDs ](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html)。 
+ 以逗号分隔的按顺序排列的可用区列表。 IDs例如，列表中的第一个可用区映射为 `az1`，第二个可用区映射为 `az2`，此映射结构将一直持续到以逗号分隔的列表完全映射为止。可以映射的可用区 IDs 数量没有上限。 
+  GitHub [多账户可用区映射](https://github.com/aws-samples/multi-account-az-mapping/)存储库中的`az-mapping.yaml`文件已复制到您的本地计算机

## 架构
<a name="use-consistent-availability-zones-in-vpcs-across-different-aws-accounts-architecture"></a>

下图显示了在账户中部署和创建 AWS Systems Manager Parameter Store 值的架构。当您在账户中创建 VPC 时，将消耗这些 Parameter Store 值。

![用于为每个可用区 ID 创建 Systems Manager Parameter Store 值并存储可用区名称的工作流。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/9954e7f9-d6ce-44bd-af99-0c6bb7cd3cb0/images/f1168464-55f8-4efc-9b28-6a0cda668b9e.png)


下图显示了如下工作流：

1. 此模式的解决方案部署到需要 VPC 区域一致性的所有账户。 

1. 该解决方案为每个可用区 ID 创建 Parameter Store 值并存储新的可用区名称。 

1. AWS CloudFormation 模板使用存储在每个 Parameter Store 值中的可用区名称，这样可以确保区域一致性。

下图显示了使用此模式的解决方案创建 VPC 的工作流。

 

![工作流提交 CloudFormation 模板以创建具有正确可用区的 VPC IDs。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/9954e7f9-d6ce-44bd-af99-0c6bb7cd3cb0/images/cd859430-ac25-479f-b56a-21da24cddf21.png)


 

下图显示了如下工作流：

1. 向 AWS 提交用于创建 VPC 的模板 CloudFormation。

1. AWS CloudFormation 解析每个可用区的参数存储值，并返回每个可用区 ID 的可用区名称。

1. 使用区域一致性 IDs 所需的正确可用区创建 VPC。

部署此模式的解决方案后，您可创建引用参数存储值的子网。如果您使用 AWS CloudFormation，则可以引用以下 YAML 格式的示例代码中的可用区映射参数值：

```
Resources:
    PrivateSubnet1AZ1: 
        Type: AWS::EC2::Subnet 
        Properties: 
            VpcId: !Ref VPC
            CidrBlock: !Ref PrivateSubnetAZ1CIDR
            AvailabilityZone: 
                !Join 
                    - ''
                    - - '{{resolve:ssm:/az-mapping/az1:1}}'
```

此示例代码包含在 GitHub [多账户可用区映射](https://github.com/aws-samples/multi-account-az-mapping/)存储库`vpc-example.yaml `的文件中。它向您展示如何创建与 Parameter Store 值一致的 VPC 和子网以实现区域一致性。

**技术堆栈**
+ AWS CloudFormation
+ AWS Lambda
+ AWS Systems Manager Parameter Store

**自动化和扩展**

您可以使用 AWS CloudFormation StackSets 或 AWS Control Tower 定制解决方案将此模式部署到您的所有 AWS 账户。有关更多信息，请参阅 [AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html) Cloudformation 文档 CloudFormation StackSets中的 “使用 AWS” 和 AWS 解决方案库中的 [AWS Control Tower 自定义设置](https://aws.amazon.com/solutions/implementations/customizations-for-aws-control-tower/)。 

部署 AWS CloudFormation 模板后，您可以将其更新为使用 Parameter Store 值，并在管道 VPCs 中或根据您的要求进行部署。 

## 工具
<a name="use-consistent-availability-zones-in-vpcs-across-different-aws-accounts-tools"></a>

**AWS 服务**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可帮助您建模和设置 AWS 资源，快速一致地配置这些资源，并在资源的整个生命周期中对其进行管理。您可以使用模板来描述资源及其依赖关系，然后将它们作为堆栈一起启动和配置，而不必单独管理资源。您可以跨多个 AWS 账户和 AWS 区域管理和预调配堆栈。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，支持无需预置或管理服务器即可运行代码。只有在需要时 Lambda 才运行您的代码，并且能自动扩缩，从每天几个请求扩展到每秒数千个请求。您只需为消耗的计算时间付费 - 代码未运行时不产生费用。
+ [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) 是 AWS Systems Manager 的其中一项功能。它可提供安全的分层存储，用于配置数据管理和密钥管理。

**代码**

此模式的代码在 GitHub [多账户可用区映射](https://github.com/aws-samples/multi-account-az-mapping/)存储库中提供。

## 操作说明
<a name="use-consistent-availability-zones-in-vpcs-across-different-aws-accounts-epics"></a>

### 部署 az-mapping.yaml 文件
<a name="deploy-the-az-mapping-yaml-file"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确定该区域所需可用区。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/use-consistent-availability-zones-in-vpcs-across-different-aws-accounts.html) | 云架构师 | 
| 部署 az-mapping.yaml 文件。 | 使用该`az-mapping.yaml`文件在所有必需的 AWS 账户中创建 AWS CloudFormation 堆栈。在 `AZIds` 参数中，使用您之前创建的以逗号分隔的列表。 <br />我们建议您使用 [AWS CloudFormation StackSets 或 AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html) Cont [rol Tower 定制解决方案](https://aws.amazon.com/solutions/implementations/customizations-for-aws-control-tower/)。 | 云架构师 | 

### VPCs 在您的账户中部署
<a name="deploy-the-vpcs-in-your-accounts"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 自定义 AWS CloudFormation 模板。 | 使用 AWS 创建子网时 CloudFormation，请自定义模板以使用您之前创建的参数存储值。<br />有关示例模板，请参阅 GitHub [多账户可用区映射](https://github.com/aws-samples/multi-account-az-mapping/)存储库中的`vpc-example.yaml`文件。 | 云架构师 | 
| 部署 VPCs。 | 将自定义 AWS CloudFormation 模板部署到您的账户。然后，该区域中的每个 VPC 在用于子网可用区中都具有区域一致性 | 云架构师 | 

## 相关资源
<a name="use-consistent-availability-zones-in-vpcs-across-different-aws-accounts-resources"></a>
+ [您 IDs 的 AWS 资源的可用区（AWS R](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html) esource Access Manager 文档）
+ [AWS::EC2::Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html)（AWS CloudFormation 文档）