Amazon web services 对多个实例重用AWS::CloudFormation::Init(和userdata?)

Amazon web services 对多个实例重用AWS::CloudFormation::Init(和userdata?),amazon-web-services,amazon-ec2,amazon-cloudformation,Amazon Web Services,Amazon Ec2,Amazon Cloudformation,是否可以将来自AWS::CloudFormation::Init(和/或userdata)的相同引导配置重新用于模板中的多个EC2::Instance 我需要设置3个文件的内容,然后运行3个命令来引导所有服务器,但是Metadata块大约有30行长(并且可能会增长)。 每个服务器实例都有一组不同的标记,有些标记比其他标记多 理想情况下,我认为您应该能够将AWS::CloudFormation::Init声明为一个资源,并从多个EC2::Instance引用它,但我认为这是不可能的 作为一名新手,

是否可以将来自
AWS::CloudFormation::Init
(和/或
userdata
)的相同引导配置重新用于模板中的多个
EC2::Instance

我需要设置3个文件的内容,然后运行3个命令来引导所有服务器,但是
Metadata
块大约有30行长(并且可能会增长)。 每个服务器实例都有一组不同的标记,有些标记比其他标记多

理想情况下,我认为您应该能够将
AWS::CloudFormation::Init
声明为一个资源,并从多个
EC2::Instance
引用它,但我认为这是不可能的

作为一名新手,我最初认为
AWS::CloudFormation::CustomResource
可能是合适的,但我不这么认为

我目前正在考虑使用
AWS::CloudFormation::Stack
导入共享实例模板,但我需要以某种方式将堆栈模板中每个资源的
标记
参数传递到实例模板中。问题是-如果这是最好的方法,我应该在当前有
的3个位置输入什么

(奖金积分-
userdata
与此
init
块之间有什么区别?)

stack.template instance.template 是否可以从中重用相同的引导配置 AWS::CloudFormation::Init(和/或用户数据)用于多个 EC2::模板中的实例

不,这不可能在单个模板中使用AWS::EC2::Instance资源。但是,有一种资源类型,但目前该资源仅适用于自动缩放组。理想情况下,AWS将提供类似的资源类型,可以应用于多个AWS::EC2::实例资源。尽管如此,还是有很多问题

下面是一个简单的示例,它允许您在单个模板中使用单个启动配置和多个自动缩放组资源来完成此操作。自动缩放通常配置有多个实例,但我使用MinSize和MaxSize为1来镜像您使用AWS::EC2::instance资源类型进行的配置。即使我们将单个实例与自动伸缩组一起使用,我们仍然可以通过单个实例的弹性获得自动伸缩的好处。如果实例变得不健康,自动缩放将自动替换实例

{
“AWSTemplateFormatVersion”:“2010-09-09”,
“资源”:{
“启动配置”:{
“类型”:“AWS::AutoScaling::LaunchConfiguration”,
“财产”:{
“InstanceType”:{“Ref”:“InstanceType”},
“ImageId”:“ami-84a333be”,
“KeyName”:{“Ref”:“KeyName”},
“SecurityGroupId”:[{“Ref”:“SecurityGroupId”}],
“UserData”:{“Fn::Base64”:{“Fn::Join”:[“”[
“#!/bin/bash-v\n”,
“#运行cfn init\n”,
“/opt/aws/bin/cfn init-v”,
“-stack”,{“Ref”:“AWS::StackName”},
“-资源启动配置”,
--region“,{”Ref:“AWS::region”},“\n”,
“#信号成功\n”,
“/opt/aws/bin/cfn信号-e$?”,{“Ref”:“WaitConditionHandle”},“\n”
]]}}
},
“元数据”:{
“AWS::CloudFormation::Init”:{
“配置”:{
“文件”:{
“/etc/apt/apt.conf.d/99auth”:{
“内容”:“APT::Get::AllowUnauthenticated yes;”
},
“/etc/apt/sources.list.d/my repo.list”:{
“内容”:“debhttp://my-repo/repo apt/”
}
},
“命令”:{
“01 apt获取更新”:{
“命令”:“apt获取更新”
},
“02 apt get install puppet”:{
“命令”:“apt get install puppet my puppet config”
},
“03适用”:{
“命令”:“应用木偶”
}
}
}
}
}
},   
“ASG1”:{
“类型”:“AWS::AutoScaling::AutoScalingGroup”,
“财产”:{
“可用性区域”:[{“Ref”:“AZ”}],
“VPCZoneIdentifier”:[{“Ref”:“SubnetId”}],
“LaunchConfigurationName”:{“Ref”:“LaunchConfig”},
“最大尺寸”:“1”,
“MinSize”:“1”,
“标签”:[
{“Key”:“Name”,“Value”:“Server1”,“PropagateAtLaunch”:“true”},
{“Key”:“Version”,“Value”:“1.0”,“PropagateAtLaunch”:“true”}
]
}
},
“ASG2”:{
“类型”:“AWS::AutoScaling::AutoScalingGroup”,
“财产”:{
“可用性区域”:[{“Ref”:“AZ”}],
“VPCZoneIdentifier”:[{“Ref”:“SubnetId”}],
“LaunchConfigurationName”:{“Ref”:“LaunchConfig”},
“最大尺寸”:“1”,
“MinSize”:“1”,
“标签”:[
{“Key”:“Name”,“Value”:“Server2”,“PropagateAtLaunch”:“true”},
{“Key”:“Version”,“Value”:“1.0”,“PropagateAtLaunch”:“true”}
]
}
},
“WaitConditionHandle”:{
“类型”:“AWS::CloudFormation::WaitConditionHandle”
},
“等待条件”:{
“类型”:“AWS::CloudFormation::WaitCondition”,
“财产”:{
“句柄”:{“Ref”:“WaitConditionHandle”},
“超时”:“300”
}
}
}
}
这是一个不完整的示例,您可以通过自动缩放做更多的事情,但我只想给您一个简单的示例,与多个实例共享启动配置。每个自动缩放组都定义自己的标记集


我目前正在考虑使用AWS::CloudFormation::Stack进行导入 共享实例模板,但我需要以某种方式传递标记 将堆栈模板中的每个资源的参数放入实例中 模板。问题是-如果这是最好的方法,那么
...
"Resources" : {
  "Server1" : {
    "Type": "AWS::CloudFormation::Stack",
    "Properties": {
      "Parameters": {
        "InstanceType": "m1.medium",
        ...
        "Tags": { ???? }
      },
      "TemplateURL": "https://s3.amazonaws.com/mybucket/instance.template"
    }
...
"Parameters" : {
   "InstanceType" : {...}
   "KeyName": {...}
   ...
   "Tags": {
       ????
   }
},

"Resources" : {
    "Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Metadata" : {
        "AWS::CloudFormation::Init" : {
          "config" : {
            "files" : {
              "/etc/apt/apt.conf.d/99auth" : {
                "content" : "APT::Get::AllowUnauthenticated yes;"
              },
              "/etc/apt/sources.list.d/my-repo.list" : {
                "content" : "deb  http://my-repo/repo apt/"
              },
          },
            "commands" : {
              "01-apt-get update" : {
                "command" : "apt-get update"
              },
              "02-apt-get install puppet" : {
                "command" : "apt-get install puppet my-puppet-config"
              },
              "03-puppet apply" : {
                "command" : "puppet apply"
              }
            }
          }
        }
      },
      "Properties" : {
        "InstanceType" : {"Ref" : "InstanceType"},
        "ImageId" : "ami-84a333be",
        "KeyName" : {"Ref" : "KeyName"},
        "SubnetId" : {"Ref" : "SubnetId"},
        "SecurityGroupIds" : [ { "Ref" : "SecurityGroupId"] } ],
        "Tags" : [
          ????
        ]
      }
    }
}
"UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", [
  "#!/bin/bash\n"
  "yum update -y", "\n"
]]}}