将基础设施从一个区域克隆到另一个区域: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 模板之前,您需要确保准备好以下内容:
- 将您的实例 AMI 移动到 us-east-2 区域,然后替换模板中的 快照 ID 和 AMI id
- 创建安全组替换模板中的安全组 ID
- 将 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"]
我在 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 模板之前,您需要确保准备好以下内容:
- 将您的实例 AMI 移动到 us-east-2 区域,然后替换模板中的 快照 ID 和 AMI id
- 创建安全组替换模板中的安全组 ID
- 将 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"]