<mohammadrony>

EC2 and CodePipeline to Deploy Node and MySQL app

Create public EC2 instance and copy db.sql instance

scp -i <ssh-pem-file> <db-sql-file> ec2-user@<ec2-public-ip>:~/
ssh -i <ssh-pem-file> ec2-user@<ec2-public-ip>

Create RDS MySQL instance in private subnet in same VPC

Install MySQL in Amazon Linux 2023

wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf install mysql80-community-release-el9-1.noarch.rpm
sudo dnf install mysql-community-server

Connect to RDS instance and Load db.sql script

mysql -h <db-host> -P 3306 -u <db-user|admin> -p < db.sql

Create private EC2 launch template with user data

#!/bin/bash
yum -y update
yum -y install ruby wget
BUCKET="aws-codedeploy-ap-southeast-1"
REGION="ap-southeast-1"
wget https://${BUCKET}.s3.${REGIOIN}.amazonaws.com/latest/install
chmod +x ./install
./install auto

service codedeploy-agent status

Configure Auto Scaling Group with ALB and Target group

  • Configure auto scaling group in private subnet.
  • Configure application load balancer in public subnet.
  • Configure target group with instance launch template.
  • Configure CPU tracking policy while creating scaling group.

Configure appspec.yml file in root directory of the repository

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/
permissions:
  - object: /home/ec2-user
    owner: ec2-user
    group: ec2-user
    type:
      - directory
      - file
hooks:
  BeforeInstall:
    - location: deploy_scripts/install.sh
      timeout: 300
      runas: root
  ValidateService:
    - location: deploy_scripts/validate.sh
      timeout: 60
      runas: ec2-user

deploy_scripts/install.sh file

# Install LAMP in Amazon Linux 2023
# dnf install -y httpd wget php-fpm php-mysqli php-json php php-devel

Install Apache in Amazon Linux 2

yum install -y httpd httpd-tools mod_ssl 

Install PHP

yum install -y amazon-linux-extras
amazon-linux-extras enable php7.4 
yum clean metadata 
yum -y install php php-common php-pear 
yum -y install php-{cgi,curl,mbstring,gd,mysqlnd,gettext,json,xml,fpm,intl,zip}

Install validator package

yum -y install nc

Start HTTPD service

systemctl start httpd
systemctl enable httpd

deploy_scripts/validate.sh

#!/usr/bin/env bash
sleep 10
nc -zv 127.0.0.1 80

Configure role for CodeDeploy in Blue/Green deployment

Add AWSCodeDeployRole and an extra policy for B/G deployment

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "ec2:CreateTags",
                "ec2:RunInstances"
            ],
            "Resource": "*"
        }
    ]
}

in CodeDeployRole.