2017-08-15 80 views
0

我创建一个Windows 2012 AMI和使用如下所示的CloudFormation模板创建的AMI实例。Cloudformation - 困惑与4之间CFN辅助脚本..this的互动是我做的,它的工作原理

在这种JSON脚本我想打电话给PowerShell脚本禁用服务(简单的)。 EC2 Windows 2012实例已创建。在我开始使用AMI之前,我确信EC2Config服务正在运行。它现在有效。以下是可以正常工作的代码。但问题是,我不清楚cfn-hup,cfn-signal和cfn-init之间的相互作用。老实说,我读了所有4个帮手脚本。但我并没有围绕这些帮手脚本包裹我的大脑。

是否存在有关这4个辅助脚本如何一起工作的任何博客或文档?

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Resources": { 
    "MyInstance": { 
     "Type": "AWS::EC2::Instance", 
     "Metadata" : { 
     "AWS::CloudFormation::Init" : { 
    "config" : { 
     "files" : { 
     "c:\\cfn\\cfn-hup.conf" : { 
      "content" : { "Fn::Join" : ["", [ 
      "[main]\n", 
      "stack=", { "Ref" : "AWS::StackId" }, "\n", 
      "region=", { "Ref" : "AWS::Region" }, "\n" 
      ]]} 
     }, 
     "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf" : { 
      "content": { "Fn::Join" : ["", [ 
      "[cfn-auto-reloader-hook]\n", 
      "triggers=post.update\n", 
     "path=Resources.MyInstance.Metadata.AWS::CloudFormation::Init\n", 
      "action=cfn-init.exe -v -s ", { "Ref" : "AWS::StackId" }, 
              " -r MyInstance", 
              " --region ", { "Ref" : "AWS::Region" }, "\n" 
      ]]} 
     }, 
     "c:\\scripts\\test.ps1" : { 
      "content": { "Fn::Join" : ["", [ 
      "Write-Host Hello World!\n" 
      ]]} 
     } 
     }, 
     "commands" : { 
     "1-run-script" : { 
      "command" : { "Fn::Join" : [ "", [ 
      "Powershell.exe Set-ExecutionPolicy Unrestricted -force;Unblock-File C:\\PowershellScripts\\WindowsServiceManager.ps1;. C:\\PowershellScripts\\WindowsServiceManager.ps1;SetWindowsServiceStartupType Dnscache Manual;StopWindowsService Dnscache" 
      ]]}} 
      }, 
     "services": { 
      "windows": { 
       "cfn-hup": { 
        "enabled": "true", 
        "ensureRunning": "true", 
        "files": ["c:\\cfn\\cfn-hup.conf", "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf"] 
        } 
      } 
     } 
    }         
    } 
    }, 
"Properties": { 
    "DisableApiTermination": "FALSE", 
    "ImageId": "ami-3723c04f", 
    "InstanceType": "t2.micro", 
    "KeyName": "EC2Instances", 
    "Monitoring": "false", 
    "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ 
    "<script>\n", 
    "cfn-init.exe -v -s ", { "Ref" : "AWS::StackName" }, 
    " -r MyInstance", 
    " --region ", { "Ref" : "AWS::Region" }, "\n", 

    "cfn-signal.exe -e 0 ", { "Fn::Base64" : { "Ref" : "WindowsServerWaitHandle" }}, "\n", 

    "</script>\n" 
    ]]}} 

} 
    }, 
    "WindowsServerWaitHandle": { 
     "Type": "AWS::CloudFormation::WaitConditionHandle" 
    }, 
    "WindowsServerWaitCondition": { 
    "Type": "AWS::CloudFormation::WaitCondition", 
    "DependsOn": "MyInstance", 
    "Properties": { 
     "Handle": { "Ref": "WindowsServerWaitHandle" }, 
     "Timeout": "1800" 
    } 
    }   
} 
} 
+0

找到一份像样的解释一下:https://aws.amazon.com/blogs/devops/best-practices-for-deploying-applications-on-aws-cloudformation-stacks/ – Jason

回答

0

找到一份像样的解释在这里:如何AWS :: CloudFormation ::初始化工作

https://aws.amazon.com/blogs/devops/best-practices-for-deploying-applications-on-aws-cloudformation-stacks/

顺序:

  1. 您使用AWS :: CloudFormation指定应用程序配置::您的CloudFormation模板中的EC2实例的Init部分。
  2. 您使用该模板启动CloudFormation堆栈创建。
  3. AWS CloudFormation服务开始创建堆栈,其中包括EC2实例。
  4. EC2实例启动并运行后,会在实例上执行CloudFormation帮助器脚本cfn-init,以根据您的AWS :: CloudFormation :: Init模板规范配置实例。*
  5. 另一个CloudFormation助手脚本cfn-signal在该实例上执行,以让远程AWS CloudFormation服务知道配置的结果(成功/失败)。*您可以选择让CloudFormation服务在标记EC2实例状态和堆栈时暂缓状态“CREATE_COMPLETE”直到CloudFormation服务听到实例的成功信号。使用CreationPolicy在模板中指定停止期。

*您可以下载适用于Linux和Windows的CloudFormation助手脚本。这些预先安装在亚马逊提供的Linux和Windows AMI上。您需要指定命令来触发EC2用户数据脚本中的cfn-init和cfn-signal。一旦实例启动并运行,大多数Linux发行版和Windows将自动执行EC2用户数据脚本。

一旦你的应用程序堆栈启动并运行,有机会,你会更新应用程序,应用到操作系统的补丁,或者在协议栈的生命周期进行一些其他的配置更新。您只需更新模板中的AWS :: CloudFormation :: Init部分(例如,指定应用程序包的较新版本),然后调用UpdateStack。当你这样做时,CloudFormation根据更新的模板更新实例元数据。然后,在实例上运行的cfn-hup守护程序会检测更新的元数据,并重新运行cfn-init以根据更新的配置更新实例。 cfn-hup是Linux和Windows上可用的CloudFormation助手脚本之一。