Create CodeDeploy

Create CodeDeploy

·

5 min read

  • AWS CodeDeploy is a fully managed deployment service that automates software deployments to a variety of compute services such as Amazon EC2, AWS Fargate, AWS Lambda, and your on-premises servers.

  • AWS CodeDeploy makes it easier for you to rapidly release new features, helps you avoid downtime during application deployment, and handles the complexity of updating your applications.

  • You can use AWS CodeDeploy to automate software deployments, eliminating the need for error-prone manual operations. The service scales to match your deployment needs.

Alt Text

###1. Install codedeploy-agent on EC2 target machine

sudo yum update sudo yum install ruby cd /home/ec2-user aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/i.. . chmod +x ./install sudo ./install auto

systemctl status codedeploy-agent.service ● codedeploy-agent.service - AWS CodeDeploy Host Agent Loaded: loaded (/usr/lib/systemd/system/codedeploy-agent.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2020-10-30 02:27:22 UTC; 1 months 25 days ago Main PID: 4788 (ruby) Tasks: 6 Memory: 92.6M CGroup: /system.slice/codedeploy-agent.service ├─4788 codedeploy-agent: master 4788 └─4794 codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of master 4788


###**2. Create S3 bucket to store application package (.zip) which contains deployment scripts and `appspec.yml` for codedeploy service consumes**
- [appspec.yml](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html) example
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/mhxjxu7vi2zszw6tcusa.png)

version: 0.0 os: linux files:

  • source: / destination: /var/www/html/WordPress hooks: BeforeInstall:
    • location: scripts/install_dependencies.sh timeout: 300 runas: root AfterInstall:
    • location: scripts/change_permissions.sh timeout: 300 runas: root ApplicationStart:
    • location: scripts/start_server.sh
    • location: scripts/create_test_db.sh timeout: 300 runas: root ApplicationStop:
    • location: scripts/stop_server.sh timeout: 300 runas: root ```

###3. Create Lambda function which listen to S3 event of the above bucket and then create deployment Alt Text

  • AWS Chalice app.py

  • LambdaCodeDeployServiceRole.json

    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "logs:*"
              ],
              "Resource": "arn:aws:logs:*:*:*"
          },
          {
              "Effect": "Allow",
              "Action": [
                  "s3:GetObject"
              ],
              "Resource": [
                  "arn:aws:s3:::codedeploy/*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": "codedeploy:GetDeploymentConfig",
              "Resource": [
                  "arn:aws:codedeploy:ap-northeast-2:111111111111:deploymentconfig:*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": "codedeploy:RegisterApplicationRevision",
              "Resource": [
                  "arn:aws:codedeploy:ap-northeast-2:111111111111:application:*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": "codedeploy:GetApplicationRevision",
              "Resource": [
                  "arn:aws:codedeploy:ap-northeast-2:111111111111:application:*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": "codedeploy:CreateDeployment",
              "Resource": [
                  "arn:aws:codedeploy:ap-northeast-2:111111111111:deploymentgroup:*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": "codedeploy:GetDeployment",
              "Resource": [
                  "arn:aws:codedeploy:ap-northeast-2:111111111111:deploymentgroup:*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": "codedeploy:GetDeploymentInstance",
              "Resource": [
                  "arn:aws:codedeploy:ap-northeast-2:111111111111:deploymentgroup:*"
              ]
          }
      ]
    }
    

###4. Create codedeployment application and Deployment groups to consume app package create.sh

# Create application
aws deploy create-application --application-name myapp --compute-platform Server --region ap-northeast-2

# Create group deployment
aws deploy create-deployment-group --application-name myapp --deployment-group-name mygroup --ec2-tag-filters Key=Name,Value=dev,Type=KEY_AND_VALUE --service-role-arn arn:aws:iam::111111111111:role/CodeDeployServiceRole --deployment-style deploymentType=IN_PLACE,deploymentOption=WITHOUT_TRAFFIC_CONTROL --region ap-northeast-2

###5. Push package to S3 bucket in order to trigger deploy

  • Note: Custom object metadata should be prefixed with x-amz-meta-. For example, x-amz-meta-application-name or x-amz-meta-deploymentgroup-name. Amazon S3 uses this prefix to distinguish the user metadata from other headers.
zip -r demo.zip appspec.yml scripts/
aws s3 cp demo.zip s3://codedeploy/demo.zip --metadata x-amz-meta-application-name=myapp,
x-amz-meta-deploymentgroup-name=mygroup
  • Result
    root@dev:/opt/codedeploy-agent/deployment-root/159045b5-e08b-4594-80af-e34ff25ba82f# cat d-PGZ2ZUOX1/logs/scripts.log 
    2020-02-27 07:55:47 LifecycleEvent - ApplicationStop
    2020-02-27 07:55:47 Script - scripts/stop_server.sh
    2020-02-27 07:55:47 [stdout]Thu Feb 27 07:55:47 UTC 2020: stop server
    2020-02-27 07:55:49 LifecycleEvent - BeforeInstall
    2020-02-27 07:55:49 Script - scripts/install_dependencies.sh
    2020-02-27 07:55:49 [stdout]Thu Feb 27 07:55:49 UTC 2020: install dependency
    2020-02-27 07:55:51 LifecycleEvent - AfterInstall
    2020-02-27 07:55:51 Script - scripts/change_permissions.sh
    2020-02-27 07:55:51 [stdout]Thu Feb 27 07:55:51 UTC 2020: change_permissions
    2020-02-27 07:55:52 LifecycleEvent - ApplicationStart
    2020-02-27 07:55:52 Script - scripts/start_server.sh
    2020-02-27 07:55:52 [stdout]Thu Feb 27 07:55:52 UTC 2020: start server
    2020-02-27 07:55:52 Script - scripts/create_test_db.sh
    2020-02-27 07:55:52 [stdout]Thu Feb 27 07:55:52 UTC 2020: create test db