Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ubuntu: Could not enable service cfn-hup

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"
     ]]}}
    }
  }
like image 544
MuntingInsekto Avatar asked Sep 29 '16 01:09

MuntingInsekto


2 Answers

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"
     ]]}}
    }
  }
like image 104
MuntingInsekto Avatar answered Sep 28 '22 03:09

MuntingInsekto


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
like image 43
Marcin Avatar answered Sep 28 '22 01:09

Marcin