亚马逊AWS官方博客

使用 Former2 解决跨账户/区域 Amazon VPC 资源迁移

Amazon VPC 是一个让客户能够在自己定义的逻辑隔离的虚拟网络中启动 AWS 资源的服务。作为 AWS 的基础服务之一, Amazon VPC 是部署大多数 AWS 服务(例如 Amazon EC2,Amazon RDS 等)最重要的前提条件。常用的 Amazon VPC 资源包括 Subnet,Route Table,Internet Gateway,NAT Gateway 等。

在一些情况下,比如容灾,公司之间收购等,客户需要将在 AWS 的资源从一个账户/区域复制到另一个账户/区域。为了减少对其他服务的影响,在进行 Amazon VPC 资源复制的时候,客户通常希望保留原有的配置(例如子网的规划,路由规则等)。如果客户当初搭建 Amazon VPC 的时候没有使用类似 AWS CloudFormation 的工具,那么在复制的时候只能参考现有的 Amazon VPC 资源在新的账号/区域手动创建新的 Amazon VPC 资源。如果现有的 Amazon VPC 设计复杂,涉及到几十个子网和路由,手动创建资源不但费时费力,还容易出现错误,给接下来的上层业务搬迁带来不必要的挑战。

Former2 是一款免费的工具,可以通过扫描 AWS 账户资源自动生成相对应的 IaaS 模版,比如 AWS CloudFormation 和 Terraform。使用生成的模版,客户可以在新的账号/区域自动部署 Amazon VPC 资源并保留原有的配置。

本文将演示如何使用 Former2 对以下常用 Amazon VPC 资源进行跨区域的复制:

  • Amazon VPC
  • Subnet
  • Route Table
  • Routes
  • Internet Gateway
  • NAT Gateway

1. 先决条件

  • 安装浏览器插件

选择您常用的浏览器,安装 Former2 的浏览器插件。目前只支持 Firefox,Google Chrome 和 Microsoft Edge 这三种浏览器。

  • 准备扫描用户凭据

Former2 需要使用 AWS IAM 用户的 Access Key ID 和 Secret Access Key 来获取权限对源账户里现有的资源进行扫描。为了安全起见,建议在原账号下创建一个新的 AWS IAM 用户,赋予 ReadOnlyAccess 权限,扫描后可删除该用户。

  • 虽然工具提供可视化操作,但是使用者必须熟悉 CloudFormation 或者 Terraform,才能对错误进行诊断和修改。

2. 配置用户凭据

登录 former2.com 网站,在左边的菜单栏里选择 Setup->Credentials,然后将上文中新创建的原账号下的用户 Access Key ID/Secret Access Key 填入,并在右上角选择要扫描的区域。

如果客户出于安全考虑,无法将 Access Key ID 和 Secret Access Key 上传到 former2 的网站,可以考虑在本地自建 former2。源代码地址为 https://github.com/iann0036/former2

3. 扫描规则

配置完扫描所用的用户凭据,点击左边菜单栏里的 Settings 进行扫描规则的配置。Default Output 可以选择输出的模版类型,例如 AWS CloudFormation 和 Terraform。建议开启 Skip Irrelevant Resources 忽略不必要资源,并关闭 Enable Related Resources。如果有使用默认的 Amazon VPC 资源,还需要开启 include Default Resources。

4. 扫描 Amazon VPC 资源

配置完扫描规则后,点击左边的菜单栏里的 Networking & Content Delivery,选择 VPC,点击右上角的 Scan Account 开始扫描。

5. 选择需要复制的资源

  • 扫描完成后,在被发现的 Amazon VPC 资源里选中需要复制的 VPC,并点击 Add Selected。

  • 添加后可以看到左上方的 Generate 旁边多了一个数字,这个数字代表被选中资源的数量。

  • 按照上面的方式添加其他 Amazon VPC 资源。注意只添加在上一步所选 Amazon VPC 的相应资源,添加非所选 Amazon VPC 的资源会产生无效的关连资源,导致创建失败。
  • 请勿添加 VPC CIDR Blocks,SubnetIPv6 CIDR Blocks 等含有 IPv6 地址的资源,因为此类资源在创建时会因为造成 IP 地址冲突而失败。
  • 建议只添加图中被圈起来的资源,被绿色圈起来的资源可以直接添加,被黄色圈起来的资源需要在添加时或者添加后进行细微的调整。其他资源(例如 VPC Peering,Transit Gateway)更加适合手动迁移。

  • 在选择 Elastic IPs 时请注意,只勾选有 AllocationID 的项,忽略没有 AllocationID 的项。

  • 在选择 Routes 的时候, 注意不要勾选含有未迁移资源的路由规则,例如涉及到 Transit Gateway,VPN Gateway, VPC Peering 的路由。

6. 生成 CloudFormation 模版

资源添加完毕后,点击左上方的 Generate 生成 CloudFormation 的模版。


检查生成的 CloudFormation 模版里面的以下资源:

  • EC2Subnet:检查所有 EC2Subnet 资源是否含有 IPv6 地址段,并删除相应的 IPv6 配置。

7. 使用 CloudFormation 在目标账号/区域创建 Amazon VPC 资源

  • 将 Former2 生成 CloudFormation下载到本地,默认文件名为 yaml。


  • 在目标账号/区域使用 AWS CloudFormation 服务和上面的 yaml 文件创建新的 Amazon VPC 资源。

  • 通过 AWS CloudFormation Events 查看资源创建的状态。

8. 常见错误诊断

在使用 Former2 生成 CloudFormation 模版的过程中通常不会遇到错误,绝大多数的报错都会出现在使用 AWS CloudFormation 服务和 Former2 生成的模版在目标账号/区域创建资源的时候。通常都是因为 Former2 生成模版所引用的资源在不存在或者无效。

  • 在第 5 步,选择需要复制的资源的时候,勾选了非所选 VPC 的资源(例如:在 Subnet Route Table Association 里面选择了其他 VPC 的路由关联)。
  • 在第 5 步中添加的资源引用了外网 IP(例如 VPN Gateway 等等)。
  • 在第 5 步中添加的资源与未添加的资源有关联(例如 VPC Peering 或者 Transit Gateway 的路由)。
  • 忘记在第 6 步中对 EC2Subnet 的资源进行修改。

请仔细查看 AWS CloudFormation 的事件信息,定位第一个创建失败的资源,并在 Former2 生成的模版中对该资源的定义进行修改或者删除。

9. 工具的局限性

  • 误添加资源后,只能在 CloudFormation 模版里面进行删除。或者移除所有资源,重新添加。

本篇作者

谭继聪

亚马逊云科技解决方案架构师,负责基于 AWS 云计算方案架构的咨询和设计,并专注于数据库和数据分析技术方向。

曾鑫

AWS 解决方案架构师,负责基于 AWS 云平台的解决方案咨询和设计,对 AWS 安全产品的使用与整合有多年实践经验。