A Step by Step Guide to Create a CI/CD Pipeline with AWS Services

A Step by Step Guide to Create a CI/CD Pipeline with AWS Services

avatar

Phong Nguyen

2024.04.11

Trong hướng dẫn này, bạn sẽ tạo một CI/CD Pipeline cho một ứng dụng web đơn giản. Đầu tiên bạn sẽ tìm hiểu cách để sử dụng Codecommit để lưu source code. Sau đó bạn sẽ tìm hiểu cách tạo CICD để tự động hóa quá trình deploy bất cứ khi nào source code được update

Lab Introduction

  • AWS experience: Intermediate
  • Time to complete: 45 minutes
  • AWS Region: US East (N. Virginia) us-east-1
  • Services used: Elastic Beanstalk, CodeCommit CodeBuild, Code Pipeline

What is AWS CodePipeline

  1. AWS CodePipeline is a fully managed continuous integration and continuous delivery (CI/CD) service provided by Amazon Web Services (AWS).
  2. Nó giúp tự động hóa quá trình release software applications cho phép developer cung cấp các bản cập nhật ứng dụng thường xuyên hơn
  3. CodePipeline cho phép bạn model và visualize các giai đoạn khác nhau trong quá trình release bao gồm source code management, building, testing, and deployment.
  4. Nó tích hợp với nhiều dịch vụ và công cụ AWS khác nhau cũng như các dịch vụ của bên thứ ba, cho phép tích hợp liền mạch vào quy trình phát triển hiện có.
  5. CodePipeline supports multiple source code repositories, bao gồm: Amazon S3, CodeCommit, và Git-based repositories như GitHub, Gitlab hay Bitbucket.
  6. Nó cung cấp sự linh hoạt trong việc cấu hình các giai đoạn và hành động tùy chỉnh, cho phép người dùng xác định quy trình công việc và quy tắc tự động hóa của riêng họ.
  7. CodePipeline cho phép phê manual approvals, cho phép các stakeholders review và approve những thay đổi trước khi deployment.
  8. Sơ lược CodePipeline
    • Source: Nơi lưu trữ source code, có thể là Amazon S3 Bucket, CodeCommit repository, or Git-based repositories such as GitHub and Bitbucket.
    • Build: Ở giai đoạn này 1 file buildspec.yml được chuẩn bị để .để thực hiện các công được build và kiểm thử
    • Staging: Tên gọi của testing environment, hay còn được gọi là môi trường pre-production. Tốt hơn hết là chúng ta nên có một môi trường dành riêng cho việc test, và đây cũng là Optional.
    • Manual approval: Đây là một step trong quy trình CICD, cho phép bạn thực hiện review và approval trước khi nhưng thay đôi của ứng dụng được Deploy đến môi trường production
    • Deploy: Đây là phase cuối cùng cho delivery software. Khi sử dụng CodePipeline, application có thể được deploy lên các EC2 Instance bằng cách sử dụng CodeDeploy, Elastic Beanstalk hoặc AWS OpsWorks Stacks.

Architecture Diagram

Task Details

  1. Set Up Git Repo
    • Create codecommit repository
    • Connections to AWS CodeCommit repositories
    • Push express js sample source to CodeCommit
  2. Create Elastic Beanstalk Application to Deploy
  3. Create CodeBuild Project
  4. Create Code Pipeline
    • Create new pipeline
    • Configure Source Stage
    • Configure Build Stage
    • Configure Deploy to staging Stage
    • Test pipeline execution
  5. Finalize Pipeline and test
    • Configure Manual approval stage
    • Configure Deploy to Prod Stage
    • Push new commit to your repo
    • Monitor pipeline and manual approve change

Prerequisites

Before starting this tutorial, you will need:

  • An AWS account
  • Git installed on your computer
  • A text editor: Ex: VS Code

1. Set Up Git Repo

1.1. Create codecommit repository

Tại Console CodeCommit -> Repositories -> Create repository

Repository name: dva-repo-express-js-sample-app

Copy lại SSH URL để lát nữa chúng ta sử dụng để push code lên CodeCommit

1.2. Connections to AWS CodeCommit repositories

Tham khảo Setup steps for SSH connections to AWS CodeCommit repositories on Windows

Step 1: Initial configuration for CodeCommit

Bỏ qua bước này nếu IAM user của bạn đã có quyền Administrator

Step 2: Install Git

https://git-scm.com/downloads

Step 3: Set up the public and private keys for Git and CodeCommit

Open git bash tại thư mục C:\Users\{UserName}\.ssh để thực hiện command: ssh-keygen

Sau khi thực hiện xong sẽ có 1 cặp public and private keys được tạo trong thư mục .ssh/

  • codecommit_rsa
  • codecommit_rsa.pub

Vào Console IAM, chọn Users -> chọn IAM user của bạn.

Tại tab Security credentials -> Kéo xuống SSH public keys for AWS CodeCommit -> Click Upload SSH public key

Mở file codecommit_rsa.pub và copy nội dung vào

Copy giá trị SSH Key ID.

Cũng trong thư mục .ssh/ tạo file có tên config với nội dung sau: (Nếu như file config đã tồn tại thì add thêm vào). Nhớ thay đổi giá trị cho {SSH Key ID} đã copy phía trên

Host git-codecommit.*.amazonaws.com
  User {SSH Key ID}
  IdentityFile ~/.ssh/codecommit_rsa

Test Connecttion, kết quả trả về successfully là OK

ssh git-codecommit.us-east-1.amazonaws.com

1.3. Push express js sample source to CodeCommit

Code sample mình để ở Github, để nhanh chóng lấy về và đẩy lên CodeCommit mình thực hiện như sau

  • Create CodeCommit repo: Đã thực hiện rồi, Copy lại giá trị SSH URL ở bước 1.1 nhé.

  • Clone project

    git clone https://github.com/cloudmentor-pro/elastic-beanstalk-express-js-sample-app.git
    
    cd elastic-beanstalk-express-js-sample-app/
    
  • Push project to CodeCommit: git push {SSH URL} --all

    git push ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/dva-repo-express-js-sample-app --all
    
  • Kiểm tra code được được push lên chưa

Sau khi đã push code lên CodeCommit rồi thì

  • có thể xóa Folder: elastic-beanstalk-express-js-sample-app
  • Thực hiện Clone source từ CodeCommit cho bài thực hành lần này

git clone ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/dva-repo-express-js-sample-app

2. Create Elastic Beanstalk Application to Deploy

2.1.  Create Instance Profile (IAM role) cho EC2

Trước khi bắt đầu với Elastic Beanstalk, chúng ta cần tạo Instance Profile cho EC2

Tại Console IAM, thực hiện tạo Role như sau

  • Use caseEC2
  • Permissions policies
    • AWSElasticBeanstalkWebTier
    • AWSElasticBeanstalkWorkerTier
    • AWSElasticBeanstalkMulticontainerDocker
  • Role nameDVAElasticBeanstalkEc2Role

2.2. Create Application

Tại Console của Elastic Beanstalk -> Application -> Create Application

  • Application name: dva-eb-app-express-js-sample-app
  • Description: express js sample app

2.3. Create Staging Environments

Step 1: Configure Environment

  • Environment tier
    • Web server environment
  • Environment information:
    • Environment name: dva-eb-env-express-js-sample-app-stg
  • Platform
    • Platform type: Managed platform
    • Platform: NodeJS
    • Platform branch: Nodejs.20 running on 64bit Amazon Linux 2023
    • Platform version: 6.1.x (Recommended)
  • Application code
    • Sample application
  • Presets
    • Single instance (free tier eligiblle)

  • Next

Step 2: Configure service access

  • Service access
    • Service role: Chọn Use an existing service role và check xem có giá trị aws-elasticbeanstalk-service-role trong Pulldown không (Nếu bạn đã từng thực hành với Elastic BeanStalk thì khả năng role aws-elasticbeanstalk-service-role đã được tạo rồi). Nếu có thì chọn, nếu chưa tồn tại chọn Create and use new service role
    • EC2 instance profile: DVAElasticBeanstalkEc2Role (Đã tạo ở bước 2.1)
    • Skip to review

Step 6: Review

  • Click Submit

Elastic Beanstalk is launching your environment. Bạn cần đợi trong vài phút

Sau khi quá trình tạo môi trường hoàn tất, Click vào domain để verify

2.4. Create Production Environments

Để tạo môi trường production, ta chỉ cần Clone môi trường đã tạo

  • New environment
    • Environment name: dva-eb-env-express-js-sample-app-prod

  • Clone

Bạn cũng có thể đợi vài phút để môi trường production chạy xong hoặc trong lúc đợi chúng ta sẽ đi làm các bước tiếp theo

3. Create CodeBuild Project

3.1. Configure the CodeBuild project

Tại CodeBuild Console -> Build projects -> Create project

  • Project name: dva-codebuild-express-js-sample-app
  • Source 1 - Primary
    • Source provider: AWS CodeCommit
    • Repository: dva-repo-express-js-sample-app
    • Reference type: Brancch
    • Branch: main
  • Buildspec
    • Use a buildspec file

Vì trong source code của chúng ta đã có file tên buildspec.yml nên không cần phải ghi rõ tên

  • Create build project

3.2. Test CodeBuild project

Click Start build

Quá trình build hoàn tất thành công và chúng ta có thể xem log cụ thể nhưng gì được chạy (Nội dung trong file buildspec.yml)

4. Create Code Pipeline

Tại Console CodePipeline -> Pipelines -> Create pipeline

Step 1: Choose pipeline settings

  • Pipeline name: dva-codepipeline-express-js-sample-app
  • Service role: New service role

Step 2: Add source stage

Step 3: Add build stage

Step 4: Add deploy stage

Step 5: Review

  • Create pipeline

Test pipeline execution

Sau khi create pipeline thì quá trình Build và Deploy bắt đầu chạy trong pipeline

Đến khi pipeline thành công, Mở Elastic Beanstalk và access domain môi trường staging

Kết quả là application của chúng ta đã được Deploy lên môi trường staging

5. Finalize Pipeline and test

Giả định chúng ta test application ở môi trường dev, nếu không có vấn đề gì thì sẽ deploy lên production, tuy nhiên trước khi deploy phải cần người Approve

5.1. Configure Manual approval stage

Ở Console CodePipeline -> chọn Edit

Add thêm 1 Stage bên dưới cùng của Pipeline

  • Đặt Stage name: Review và add

Click Add action group

  • Action name: ManualApproval
  • Action provider: Manual approval

5.2. Configure Deploy to Pro Stage

Tiếp tục add thêm 1 stage vào dưới cùng

  • Stage name: DeployToProd

Add action group

  • Action name: DeployToProd

Sau khi add hoàn tất chúng ta tiến hành Save

5.3. Push new commit to your repo

Update file index.html, thay đổi background-color: blueviolet;

Push source code to CodeCommit

git add .\index.html
git commit -m "change background-color"
git push origin main

CodePipeline đã được trigger và đang quá trình thực thi.

Chúng ta sẽ đợi vài phút cho đến quá trình deploy lên staging hoàn tất

Khi deploy hoàn tất và đang dừng ở Review. Access domain môi trường staging để kiểm tra

Mọi thứ có vẻ OK, chúng ta tiếp tục bước review

5.4. Monitor pipeline and manual approve change

PipeLine tiếp tục hoạt động deploy lên môi trường production

Access domain môi trường prod

Congratulations! Bạn đã hoàn thành việc xây dựng CICD pipeline trên AWS.

Clean up resources

  • Delete Elastic Beanstalk application

  • Delete pipeline from CodePipeline: dva-codepipeline-express-js-sample-app

  • Delete pipeline resource from S3 Bucket: codepipeline-us-east-1***

    • Empty bucket
    • Delete bucket
  • Delete build project in CodeBuild: dva-codebuild-express-js-sample-app
  • Delete codcommit repo: dva-repo-express-js-sample-app