将基础设施从一个区域克隆到另一个区域:AWS CloudFormation

Cloning infrastructure from one region to another: AWS CloudFormation

我在 us-east-1 区域有现有的基础设施,需要将其准确地克隆到 us-east-2 区域。使用 AWS CloudFormer 从现有的 us-east-1 区域生成 JSON 模板,将所有 us-east-1 替换为 us-east-2 并开始创建堆栈但收到错误提示 "Resource creation cancelled",专门针对所有 EC2 实例

模板快照(仅限EC2实例):

"instancei071dd59b": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "DisableApiTermination": "false",
        "InstanceInitiatedShutdownBehavior": "stop",
        "ImageId": "ami-1a41b377",
        "InstanceType": "t2.medium",
        "KeyName": "MyServer",
        "Monitoring": "false",
        "Tags": [
          {
            "Key": "MyServer OS",
            "Value": "Windows Server"
          },
          {
            "Key": "Name",
            "Value": "MyServer_WEB_TEST_2"
          }
        ],
        "Volumes": [
          {
            "Device": "xvdb",
            "VolumeId": {
              "Ref": "volumevol9124b841"
            }
          }
        ],
        "NetworkInterfaces": [
          {
            "DeleteOnTermination": "true",
            "DeviceIndex": 0,
            "SubnetId": {
              "Ref": "subnet24031c0f"
            },
            "PrivateIpAddresses": [
              {
                "PrivateIpAddress": "172.31.53.184",
                "Primary": "true"
              }
            ],
            "GroupSet": [
              {
                "Ref": "sgMyServerWEB"
              }
            ],
            "AssociatePublicIpAddress": "true"
          }
        ]
      }
    },
"volumevol9124b841": {
      "Type": "AWS::EC2::Volume",
      "Properties": {
        "AvailabilityZone": "us-east-2b",
        "Size": "30",
        "SnapshotId": "snap-95288b92",
        "VolumeType": "gp2"
      }
    }

在使用 cloudformation 模板之前,您需要确保准备好以下内容:

  1. 将您的实例 AMI 移动到 us-east-2 区域,然后替换模板中的 快照 IDA​​MI id
  2. 创建安全组替换模板中的安全组 ID
  3. 将 CF 模板中的 subnet ID 替换为 us-east-2 region

你必须这样做的原因是 AWS 上的每个资源都有无法复制的唯一 ID,如果你想复制相同的资源,你将需要不同的 ID,因为你需要创建单独的资源并在你的模板。

如果您只对单个实例执行此操作,那么您可以通过将 AMI 导出到 us-east-2 区域来手动执行此操作。

为了收集不同地区的AMI ID,我建议使用镜像名称而不是AMI ID作为key。

要构建资源放置在不同的区域,使用CloudFormation肯定更好。在这种情况下,您可以使用 lambda cli2cloudformation (https://github.com/lucioveloso/cli2cloudformation).

使用它,您可以获得所有区域的 AMI ID 以及您可以使用 CLI 获得的任何其他信息。

要收集 AMI ID,请使用 cli2cloudformation 创建一个 lambda,并在您的模板中创建一个自定义资源,如下所示:

"imageIdNameBased": {
    "Type": "Custom::cli2cfnLambda",
    "Properties": {
      "ServiceToken": "arn:aws:lambda:eu-west-1:123456789012:function:cli2cfnLambda",
      "CliCommandCreate": "ec2 describe-images --filters 'Name=name,Values=amzn-ami-hvm-2017.03.0.20170417-x86_64-gp2' --query 'Images[0]'"
    }
}

在这种情况下,我正在获取名为 'amzn-ami-hvm-2017.03.0.20170417-x86_64-gp2' 的映像的 AMI ID。您可以更改为您的图片名称。

之后,您可以在 CloudFormation 堆栈的任何位置检索它。

"Fn::GetAtt" : ["imageIdNameBased", "ImageId"]