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