0
votes

I would like to launch a LAMP stack with Autoscaled EC2 instances through CloudFormation template. Whenever I try it, stack is built successfully but when I go onto the website, it gives me a message that app does not support older versions of PHP.

Now, when I searched for this problem online, I found one answer that suggested installing newer versions of httpd and php through yum. I tried that directly on the EC2 linux terminal and it worked, I could now access the website successfully. The thing is, I want these updated versions to be installed directly in the template. For this purpose I replaced this code within AutoScaling::LaunchConfiguration:

       "setup" : {
        "packages" : {
            "yum" : {
              "nfs-utils"       : [],
              "httpd"           : [],
              "php"             : [],
              "mysql"           : []
            }
        },

with:

       "setup" : {
        "packages" : {
            "yum" : {
              "nfs-utils"       : [],
              "httpd24"         : [],
              "php72"           : [],
              "mysql"           : []
            }
        },

This causes the stack to fail to create AutoScalingGroup which has the LaunchConfiguration as param, with an error stating "Received 0 SUCCESS signal". Here's my Properties of LaunchConfiguration:

    "Properties": {
    "AssociatePublicIpAddress" : true,
    "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" },
              { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] },
    "InstanceType"   : { "Ref" : "InstanceType" },
    "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ],
    "KeyName"        : { "Ref" : "KeyName" },
    "IamInstanceProfile" : { "Ref" : "CloudWatchPutMetricsInstanceProfile" },
    "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
            "#!/bin/bash -xe\n",
            "yum update -y aws-cfn-bootstrap\n",

            "/opt/aws/bin/cfn-init -v ",
            "         --stack ", { "Ref" : "AWS::StackName" },
            "         --resource LaunchConfig ",
            "         --configsets app_install ",
            "         --region ", { "Ref" : "AWS::Region" }, "\n",

            "/opt/aws/bin/cfn-signal -e $? ",
            "         --stack ", { "Ref" : "AWS::StackName" },
            "         --resource WebServerGroup ",
            "         --region ", { "Ref" : "AWS::Region" }, "\n"
    ]]}}
  }

Any ideas why it doesn't work? Any suggestions what I can do to actually install newest httpd and php directly through the template? Should I remove packages section and just put script for installing httpd and php directly in the UserData?

1
Login to the instance and view the cloud-init and cfn-init logsjordanm
Can you login to the instance and inspect /var/log/cloud-init-output.log and other similar log files?Marcin

1 Answers

0
votes

I managed to sort it out myself. I used Ubuntu 18.04 AMI instead of Linux as it supports latest versions of PHP and Apache.

Also had to change the "UserData" a bit:

        "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
        "#!/bin/bash -xe\n",
        "apt-get update -y\n",
        "apt-get install -y python-pip\n",
        "mkdir -p /opt/aws/bin\n",
        "python /usr/lib/python2.7/dist-packages/easy_install.py --script-dir /opt/aws/bin https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
        "ln -s /usr/local/lib/python2.7/dist-packages/aws_cfn_bootstrap-1.4-py2.7.egg/init/ubuntu/cfn-hup /etc/init.d/cfn-hup \n",
        "systemctl daemon-reload \n",

        "chmod 700 /etc/init.d/cfn-hup \n",
        "chown root:root /etc/init.d/cfn-hup \n",
        "update-rc.d cfn-hup defaults \n",
        "update-rc.d cfn-hup enable \n",

        "/opt/aws/bin/cfn-init -v ",
        "         --stack ", { "Ref" : "AWS::StackName" },
        "         --resource LaunchConfig ",
        "         --configsets app_install ",
        "         --region ", { "Ref" : "AWS::Region" }, "\n",

        "/opt/aws/bin/cfn-signal -e $? ",
        "         --stack ", { "Ref" : "AWS::StackName" },
        "         --resource WebServerGroup ",
        "         --region ", { "Ref" : "AWS::Region" }, "\n"
    ]]}}

and because Ubuntu uses apt instead of yum, this is how I included packages:

          "setup" : {
        "packages" : {
            "apt" : {
              "nfs-common"    : [],
              "apache2"       : [],
              "php"           : [],
              "php-mysql"     : [],
              "mysql-common"  : []
            }
        },