将基础架构从一个区域克隆到另一个区域:AWS CloudFormation

时间:2016-11-10 21:02:58

标签: amazon-web-services amazon-ec2 amazon-cloudformation

我在us-east-1区域有现有基础设施,需要克隆到我们东2区域。使用AWS CloudFormer从现有的us-east-1区域生成JSON模板,用us-east-2替换所有us-east-1并开始创建堆栈,但收到错误,说“资源创建已取消”,特别是对于所有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"
      }
    }

2 个答案:

答案 0 :(得分:1)

在使用cloudformation模板之前,您需要确保遵循以下规则:

  1. 将您的实例AMI移至us-east-2区域,然后替换模板中的快照ID AMI ID
  2. 创建安全组,替换模板中的安全组ID
  3. 将CF模板中的子网ID 替换为 us-east-2区域
  4. 中的

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

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

答案 1 :(得分:1)

为了收集不同地区的AMI ID,我建议使用图片名称代替AMI ID作为密钥。

要构建放置在不同区域的资源,最好使用CloudFormation。在这种情况下,您可以使用lambda cli2cloudformationhttps://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]'"
    }
}

在这种情况下,我将AMI ID输入到名为“amzn-ami-hvm-2017.03.0.20170417-x86_64-gp2'”的图像中。您可以更改为图像名称。

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

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