I am using a custom Ubuntu AMI on CloudFormation template and I am getting an error which says CREATE_FAILED AWS::AutoScaling::AutoScalingGroup WebServerGroup Received 0 SUCCESS signal(s) out of 1. Unable to satisfy 100% MinSuccessfulInstancesPercent requirement
. I check the log files on created EC2 instance on /var/log/cfn-init.log
and I saw Could not enable service cfn-hup
on the log file. Below is the part of my template :
"WebServerGroup": {
"Type": "AWS::AutoScaling::AutoScalingGroup",
"Properties": {
"AvailabilityZones": {
"Ref": "AZs"
},
"VPCZoneIdentifier": {
"Ref": "Subnets"
},
"LaunchConfigurationName": {
"Ref": "LaunchConfig"
},
"MinSize": "1",
"MaxSize": "10",
"DesiredCapacity": {
"Ref": "InstanceCount"
},
"TargetGroupARNs" : [{"Ref": "TargetGroup"}],
"Tags": [{
"Key": "opsworks_stack_id",
"Value": {
"Ref": "OpsWorksStackId"
},
"PropagateAtLaunch": "true"
}]
},
"CreationPolicy": {
"ResourceSignal": {
"Timeout": "PT15M"
}
},
"UpdatePolicy": {
"AutoScalingRollingUpdate": {
"MinInstancesInService": "1",
"MaxBatchSize": "1",
"WaitOnResourceSignals": "true",
"PauseTime": "PT15M"
}
}
},
"LaunchConfig" : {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Metadata" : {
"Comment" : "Install a simple application",
"AWS::CloudFormation::Init" : {
"config" : {
"files" : {
"/etc/cfn/cfn-hup.conf" : {
"content" : { "Fn::Join" : ["", [
"[main]\n",
"stack=", { "Ref" : "AWS::StackId" }, "\n",
"region=", { "Ref" : "AWS::Region" }, "\n"
]]},
"mode" : "000400",
"owner" : "root",
"group" : "root"
},
"/etc/cfn/hooks.d/cfn-auto-reloader.conf" : {
"content": { "Fn::Join" : ["", [
"[cfn-auto-reloader-hook]\n",
"triggers=post.update\n",
"path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init\n",
"action=/usr/local/bin/cfn-init -v ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource LaunchConfig ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"runas=root\n"
]]}
}
},
"services" : {
"sysvinit" : {
"cfn-hup" : { "enabled" : "true", "ensureRunning" : "true",
"files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]}
}
}
}
}
},
"Properties" : {
"AssociatePublicIpAddress" : "true",
"ImageId" : { "Ref" : "AmiId" },
"SecurityGroups" : [ { "Ref" : "LoadBalancerSecurityGroup" } ],
"KeyName" : { "Ref" : "KeyName" },
"InstanceType" : { "Ref" : "InstanceType" },
"IamInstanceProfile": {"Ref" :"RoleName"},
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -xe\n",
"easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
"/usr/local/bin/cfn-init -v ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource LaunchConfig ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"/usr/local/bin/cfn-signal -e $? ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource WebServerGroup ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"sed -i'' -e 's/.*requiretty.*//' /etc/sudoers", "\n",
"pip install --upgrade awscli", "\n",
"INSTANCE_ID=$(aws opsworks register ",
" --use-instance-profile ",
" --infrastructure-class ec2 ",
" --region ", { "Ref" : "AWS::Region" },
" --stack-id ", { "Ref" : "OpsWorksStackId" },
" --override-hostname $(tr -cd 'a-z' < /dev/urandom |head -c8) --local 2>&1 |grep -o 'Instance ID: .*' |cut -d' ' -f3)", "\n",
"aws opsworks wait instance-registered ",
" --region ", { "Ref" : "AWS::Region" },
" --instance-id $INSTANCE_ID", "\n",
"aws opsworks assign-instance ",
" --region ", { "Ref" : "AWS::Region" },
" --instance-id $INSTANCE_ID ",
" --layer-ids ", { "Ref": "OpsWorksLayerId" }, "\n"
]]}}
}
}
I figure it out what's wrong with my code. Its the cfn-hup
service. It don't start after the installation. See the changes on user's data. Below is the updated code.
"LaunchConfig" : {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Metadata" : {
"Comment" : "Install a simple application",
"AWS::CloudFormation::Init" : {
"config" : {
"files" : {
"/etc/cfn/cfn-hup.conf" : {
"content" : { "Fn::Join" : ["", [
"[main]\n",
"stack=", { "Ref" : "AWS::StackId" }, "\n",
"region=", { "Ref" : "AWS::Region" }, "\n"
]]},
"mode" : "000400",
"owner" : "root",
"group" : "root"
},
"/etc/cfn/hooks.d/cfn-auto-reloader.conf" : {
"content": { "Fn::Join" : ["", [
"[cfn-auto-reloader-hook]\n",
"triggers=post.update\n",
"path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init\n",
"action=/usr/local/bin/cfn-init -v ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource LaunchConfig ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"runas=root\n"
]]}
}
},
"services" : {
"sysvinit" : {
"cfn-hup" : { "enabled" : "true", "ensureRunning" : "true",
"files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]}
}
}
}
}
},
"Properties" : {
"AssociatePublicIpAddress" : "true",
"ImageId" : { "Ref" : "AmiId" },
"SecurityGroups" : [ { "Ref" : "LoadBalancerSecurityGroup" } ],
"KeyName" : { "Ref" : "KeyName" },
"InstanceType" : { "Ref" : "InstanceType" },
"IamInstanceProfile": {"Ref" :"RoleName"},
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash \n",
"easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
"sudo ln /usr/local/bin/cfn-hup /etc/init.d/ \n",
"sudo initctl reload-configuration \n",
"sudo chmod 700 /etc/init.d/cfn-hup \n",
"sudo chown root:root /etc/init.d/cfn-hup \n",
"sudo update-rc.d cfn-hup defaults \n",
"sudo update-rc.d cfn-hup enable \n",
"/usr/local/bin/cfn-init -v ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource LaunchConfig ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"/usr/local/bin/cfn-signal -e $? ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource WebServerGroup ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"sed -i'' -e 's/.*requiretty.*//' /etc/sudoers", "\n",
"pip install --upgrade awscli", "\n",
"INSTANCE_ID=$(aws opsworks register ",
" --use-instance-profile ",
" --infrastructure-class ec2 ",
" --region ", { "Ref" : "AWS::Region" },
" --stack-id ", { "Ref" : "OpsWorksStackId" },
" --override-hostname $(tr -cd 'a-z' < /dev/urandom |head -c8) --local 2>&1 |grep -o 'Instance ID: .*' |cut -d' ' -f3)", "\n",
"aws opsworks wait instance-registered ",
" --region ", { "Ref" : "AWS::Region" },
" --instance-id $INSTANCE_ID", "\n",
"aws opsworks assign-instance ",
" --region ", { "Ref" : "AWS::Region" },
" --instance-id $INSTANCE_ID ",
" --layer-ids ", { "Ref": "OpsWorksLayerId" }, "\n"
]]}}
}
}
New example for Ubuntu 18.04 and in YAML. It just install apache2 on Ubuntu instance and setups cfn-hup
on it. This way you can modify the content of the sample index.html
in your cfn template and update it. cfn-hup
should detect the change (1 min interval) and update the index.html
.
To run it, don't forget update UBUNTUAMI
with your region. Also need to set SecurityGroupId
to allow ssh and www at port 80
---
Parameters:
InstanceProfile:
Type: String
Default: ''
SecurityGroupId:
Type: String
KeyPairName:
Type: String
Default: ''
Description: A key pair for an instance for ssh
Mappings:
UBUNTUAMI:
us-east-1:
HVM64: ami-07ebfd5b3428b6f4d
ap-southeast-2:
HVM64: ami-02a599eb01e3b3c5b
Conditions:
HaveInstanceProfile:
!Not [!Equals [!Ref InstanceProfile, '']]
HaveKeyPair:
!Not [!Equals [!Ref KeyPairName, '']]
Resources:
MyInstance1:
Type: AWS::EC2::Instance
CreationPolicy:
ResourceSignal:
Timeout: PT10M
Metadata:
AWS::CloudFormation::Init:
configSets:
default_install: ["apache2", "cfn-hup"]
update_apache: ["apache2"]
apache2:
packages:
apt:
apache2: []
tmux: []
mc: []
files:
/var/www/html/index.html:
content: |
Hello World 1 from HOST_NAME
commands:
02_add_hostname:
command: sed -i s/HOST_NAME/$(hostname -f)/g /var/www/html/index.html
03_start_and_enable_apache2:
command: "systemctl start apache2 && systemctl enable apache2"
cfn-hup:
files:
/etc/cfn/cfn-hup.conf:
content: !Sub |
[main]
stack=${AWS::StackId}
region=${AWS::Region}
interval=1
verbose=true
mode: '000400'
owner: root
group: root
/etc/cfn/hooks.d/cfn-auto-reloader.conf:
content: !Sub |
[cfn-auto-reloader-hook]
triggers=post.update
path=Resources.MyInstance1.Metadata.AWS::CloudFormation::Init.apache2
action=/usr/local/bin/cfn-init -v --stack ${AWS::StackId} --resource MyInstance1 --region ${AWS::Region} --configsets update_apache
runas=root
mode: '000400'
owner: root
group: root
/lib/systemd/system/cfn-hup.service:
content: |
[Unit]
Description=cfn-hup daemon
[Service]
Type=simple
ExecStart=/usr/local/bin/cfn-hup
Restart=always
[Install]
WantedBy=multi-user.target
commands:
05_start_enable_cfn-hup:
command: "systemctl start cfn-hup && systemctl enable cfn-hup"
Properties:
IamInstanceProfile: !If [HaveInstanceProfile, !Ref InstanceProfile, !Ref "AWS::NoValue"]
ImageId: !FindInMap [UBUNTUAMI, !Ref "AWS::Region", HVM64]
InstanceType: t2.micro
KeyName: !If [HaveKeyPair, !Ref KeyPairName, !Ref "AWS::NoValue"]
Monitoring: false
SecurityGroupIds: [!Ref SecurityGroupId]
#SourceDestCheck: Boolean
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
apt update -y
apt install -y python-pip
pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz
/usr/local/bin/cfn-init -v \
--configsets default_install \
--stack ${AWS::StackName} \
--resource MyInstance1 \
--region ${AWS::Region}
is_hup_active=$(systemctl is-active cfn-hup)
[[ ${!is_hup_active} == "active" ]]
/usr/local/bin/cfn-signal -e $? \
--stack ${AWS::StackName} \
--resource MyInstance1 \
--region ${AWS::Region}
Tags:
- Key: Owner
Value: ExampleUser
Outputs:
PublicIp:
Value: !GetAtt MyInstance1.PublicIp
InstanceId:
Value: !Ref MyInstance1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With