我已经将cfn-hup用于各种项目,并遵循AWS documentation进行cfn-hup。如该页面上所述,列出了以下触发器类型:
后添加
更新后
后删除
我用这些取得了巨大的成功。最近,出于学习目的,我正在审查Elastic Beanstalk CloudFormation模板。 Elastic Beanstalk使用CloudFormation来供应和引导资源。他们使用cfn-hup,但是在他们的配置文件中有一个奇怪的触发器类型:
"\/etc\/cfn\/hooks.d\/aws-eb-command-handler.conf":{
"content":{
"Fn::Join":[
"",
[
"[aws-eb-command-handler]",
"\n",
"triggers=on.command",
"\n",
"path=ElasticBeanstalkCommand-",
"AWSEBAutoScalingGroup",
"\n",
"action=commandWrapper.py",
"\n"
]
]
}
},
如您所见,它们具有“ on.command”触发器类型。也许我是盲人,但是我找不到任何地方的记录。这是仅允许使用Elastic Beanstalk的某些特殊内部触发器类型吗?还是这只是另一个未记录的功能,如果是的话,它有什么作用?
最佳答案
这种钩子类型确实是文档不足的一种。
on.command是CloudFormation将cfn-hup命令绑定到SQS队列的方法。
要使用它,请在主要部分中配置SQS队列:
[main]
sqs_url=https://sqs.eu-west-1.amazonaws.com/XXXXXXXX/cfn-hook-trigger
然后,在发送到该队列的消息后,您的命令将在实例上执行。消息格式如下:
{
"InvocationId": "unique",
"DispatcherId": "some value, participating in message and leader elections",
"Expiration": "1433617216000", //timestamp
"CommandName": "cfn-auto-reloader-hook", //or any other hook name
"ResultQueue": "https://eu-west-1.queue.amazonaws.com/...", // mandatory if hook.send_result was
initialized
"Data": null, //will populate ENV[CMD_DATA] env var; optional
"EventHandle": null //will populate ENV[EVENT_HANDLE] env var; optional
}
如果为选定的钩子指定了send_result = True,则使用指定的ResultQueue转储执行结果。消息格式如下:
{
"DispatcherId" : "copied from the inbound message",
"InvocationId" : "copied from the inbound message",
"CommandName" : "copied from the inbound message",
"Status" : "FAILURE" | "SUCCESS",
"ListenerId" : "FQDN or AWS instance id if applicable",
"Data": "STDOUT", // data > 1Kb is treated as FAILURE
"Message": "STDERR, if $? != 0" //or first 100 bytes of STDOUT if it was > 1Kb
}
截至2015年6月,此处的信息来自python sources。
尚未经过实际测试。
而且,AWS可能已经改变了行为,因为甚至没有记录。