前面豆子学习了在AWS Cloudformation的基本操作。现在来学习进阶一些的东西。我们可以通过模板创建对应的资源,那么问题来了,这些资源创建的顺序如何保证;在EC2里面,如果我们需要额外的安装软件,配置软件,这又如何实现?当然,我们可以通过cloud init和 AMI的user data进行设置,但是在cloudformation的模板文件里面,我们同样可以进行配置。一般说来,对于不同Resource之间的优先顺序,我们是通过depends on和 waitcondition来进行配置;对于EC2和Auto Scaling内部软件的安装和配置,我们则是通过Helper Scripts 和 Creation Policy来进行配置。

下面先看看helper script。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.html

Helper script 简单的说,就是一些预配置好的Python脚本,可以在template里面直接调用。 他们有4个脚本。

cfn-init: 获取我们在metadata里面配置的信息,安装包,创建文件,启动服务
cfn-signal: 当 cfn-init的资源或者程序准备就绪的时候,发送信号给creationpolicy 或者 waitcondition,
cfn-get-metadata: 获取我们的metadata等信息
cfn-hup: 一个守护进程,时时刻刻查看metadata里面的变更

他的工作流程可以如图所示

AWS Cloudformation - Helper Scripts

这样说还是比较迷糊,下面直接通过一个例子来说明

模板文件可以从这里下载,他会创建一个LAMP的EC2实例。LAMP的安装和配置都是在Template里面定义好的

https://raw.githubusercontent.com/natonic/CloudFormation-Deep-Dive/master/6-5%20Helper%20Scripts/LampStack.json

创建一个新的stack

AWS Cloudformation - Helper Scripts

输入相关信息
AWS Cloudformation - Helper Scripts

注意查看events,他明确地收到一个成功信号之后,才完成EC2的创建
AWS Cloudformation - Helper Scripts

输出结果

AWS Cloudformation - Helper Scripts

打开测试网站看看

AWS Cloudformation - Helper Scripts

下面具体的分析一下配置文件。

所有的配置都是在Resources 里面的WebServerInstance 里面进行的。

AWS Cloudformation - Helper Scripts

然后在Properties的Userdata部分,我们执行了三个操作,首先是yum update更新一下bootstrap(也就是我们的helper script),然后执行了一个cfn-init 脚本,这个脚本读取了对我们在metedata里面定义的操作 InstallAndRun;最后通过cfn-signal 发送执行结果给waitcondition或者 creationpolicy。$?在shell里面代表了上一个命令的返回值,成功为真,失败为假。

AWS Cloudformation - Helper Scripts

这个是我们的metadata的定义,如果点开 install和configure,里面都是各种包的安装和数据库的配置。AWS 的metadata专门提供了一个键值给help script使用

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-init.html

AWS Cloudformation - Helper Scripts

Install里面我们分成了3块, package , files 和 service

package 顾名思义就是安装对应的yum 包
AWS Cloudformation - Helper Scripts

files 则是生成一些文件,这个例子里面我们创建了一个index.php,用于生成测试网页

AWS Cloudformation - Helper Scripts

一个mysql 的脚本,用来创建数据库

AWS Cloudformation - Helper Scripts

以及cfn-hup的配置文件

AWS Cloudformation - Helper Scripts

service里面则是启动对应的服务

AWS Cloudformation - Helper Scripts

Configure部分则是执行了mysql的两条语句

AWS Cloudformation - Helper Scripts

Resource的最后他还有一个creationpolicy,他可以接收cfn-singal 命令发送来的信号,还可以指定多少个成功的signal才算通过。默认情况下收到一个就算pass。如果我们创建了Auto Scaling Group,指定了最小数目的实例,我们可以设置对应数目的signal(成功创建了XX个实例才算ASG成功)
这里我们使用的默认值,5分钟内收到一个cfn-signal发送的成功信号就算这个resource成功创建

AWS Cloudformation - Helper Scripts

CreationPolicy的相关链接
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html