
Building a CI/CD Pipeline with GitHub and AWS Services
Lab Introduction
- AWS experience: Intermediate
- Time to complete: 45 minutes
- AWS Region: US East (N. Virginia) us-east-1
- Services used: Elastic Beanstalk, CodeBuild, Code Pipeline
What is AWS CodePipeline
- AWS CodePipeline is a fully managed continuous integration and continuous delivery (CI/CD) service provided by Amazon Web Services (AWS).
- 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
- 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.
- 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ó.
- CodePipeline supports multiple source code repositories, bao gồm: Amazon S3, CodeCommit, và Git-based repositories như GitHub, Gitlab hay Bitbucket.
- 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ọ.
- CodePipeline cho phép phê manual approvals, cho phép các stakeholders review và approve những thay đổi trước khi deployment.
- 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

Bài lab này sẽ build kiến trúc CI/CD pipeline sử dụng GitHub để lưu trữ source code, AWS CodePipeline để tự động hóa quá trình CI/CD. Mỗi khi developer push code lên GitHub, pipeline sẽ được trigger và thực hiện các step sau: lấy source code mới nhất từ GitHub, build code với AWS CodeBuild, deploy lên môi trường staging trên Elastic Beanstalk, sau đó sẽ yêu cầu manual approval trước khi deploy lên môi trường Production.
Task Details
- Set Up Git Repo
- Create Elastic Beanstalk Application to Deploy
- Create CodeBuild Project
- Create Code Pipeline
- Create new pipeline
- Configure Source Stage
- Configure Build Stage
- Configure Deploy to staging Stage
- Test pipeline execution
- 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:
1. Set Up Git Repo
Code sample mình để ở Github, mọi người lấy về rồi đẩy lên Github Repo của các bạn nha.
- Tải Code sample Tại đây
Sau khi đẩy lên Github Repo
- Repository name:
dva-repo-express-js-sample-app
2. Create Elastic Beanstalk Application to Deploy
2.1. Create Service role cho Elastic Beanstalk
Tại Console IAM, thực hiện tạo Role như sau
- Trusted entity type:
AWS service - Use case:
- Service or use case:
Elastic Beanstalk - Use case:
Elastic Beanstalk - Environment
- Service or use case:
- Permissions policies
- AWSElasticBeanstalkEnhancedHealth (AWS managed)
- AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy (AWS managed)
- Role name:
aws-elasticbeanstalk-service-role
2.2. Create Instance Profile (IAM role) cho EC2
Tại Console IAM, thực hiện tạo Role như sau
- Trusted entity type:
AWS service - Use case:
- Service or use case:
Elastic Beanstalk - Use case:
Elastic Beanstalk - Compute
- Service or use case:
- Permissions policies
- AWSElasticBeanstalkWebTier (AWS managed)
- AWSElasticBeanstalkWorkerTier (AWS managed)
- AWSElasticBeanstalkMulticontainerDocker (AWS managed)
- Role name:
aws-elasticbeanstalk-ec2-role
2.3. Create Application
Tại giao diện Elastic Beanstalk, Tại menu Application ->Create application


- Application name:
dva-eb-app-express-js-sample-app - Description:
express js sample app - Tags:
- Key:
Name - Value:
dva-eb-app-express-js-sample-app
- Key:

2.4. Create Staging Environments

Environment details
- Basic details
- Application name:
dva-eb-app-express-js-sample-app - Environment name:
stg-env
- Application name:
- Platform details
- Platform:
Node.js - Platform branch:
Node.js 24 running on 64bit Amazon Linux 2023 - Platform version:
6.11.x(Recommended)(Nên chọn version được Recommended)
- Platform:
- Application code
- Sample app
- Các setting khác để default

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

- Click vào Domain URL để kiểm tra

2.5. Create Production Environments
Để tạo môi trường production, ta chỉ cần Clone môi trường stg vừa tạo
Vào Elastic Beanstalk -> Environments -> chọn Env đã tạo -> Actions -> Clone Environment
Clone environment
- Environment Name:
prod-env - Các setting khác để default

- Clone

- Click vào Domain URL để kiểm tra

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. Create Connection to Source provider
Tại Developer Tools Console -> Settings -> Connections -> Create connection

- Source provider:
GitHub - Connection name:
dva-repo-connection

Connect to GitHub
- App installation :
Install a new app

Select GitHub Account

Confirm access
- Dùng GitHub Mobile hoặc nhập password Github


AWS Connector for GitHub
Repository access : chọn repositoy đã set up ở bước 1. Set Up GitHub Repo rồi Save
- Repository của demo này là:
dva-repo-express-js-sample-app

Connect to GitHub
Sau khi liên kết với GitHub, App installation sẽ tự động gen mã số connection -> chọn connect

Đã tạo connection thành công!!

3.2. Configure the CodeBuild project
Tại CodeBuild Console -> Build projects -> Create project

Project configuration
- Project name:
dva-codebuild-express-js-sample-app - Các setting khác để default
Source
- Source 1 - Primary
- Source provider:
GitHub - Use override credentials for this project only: ✅
- Connection:
dva-repo-connection - Repository:
dva-repo-express-js-sample-app - Các setting khác để default
- Source provider:
- Primary source webhook events
- để default
- Environment
- để default
- Buildspec
- Buildspec:
Use a buildspec file(Vì trong source code của chúng ta đã có file buildspec.yml nên không cần phải ghi rõ tên) - Các setting khác để default
- Buildspec:
- Batch configuration
- để default
- Artifacts
- để default
- Logs
- để default

- Click Create build project
3.3. Test CodeBuild project
- Click Start build

- Quá trình build thành công và chúng ta có thể xem log cụ thể

4. Create Code Pipeline
Tại Console CodePipeline -> Pipelines -> Create pipeline

Step 1: Choose creation option

Step 2: Choose pipeline settings
- Pipeline name:
dva-codepipeline-express-js-sample-app - Service role:
New service role - Role name: để default hoặc đặt lại tùy ý

Step 3: Add source stage
- Source
- Source provider:
GitHub (via GitHub App) - Connection:
dva-repo-connection - Repository name: Chọn Repository name ( demo này là
dva-repo-express-js-sample-app) - Branch name: Chọn branch name ( demo này là
master) - Output artifact format:
CodePipeline default
- Source provider:
- Webhook events
- để default

Step 4: Add build stage
- Build
- Build provider:
AWS CodeBuild - Project name:
dva-codebuild-express-js-sample-app - Các setting khác để default
- Build provider:

Step 5: Add test stage
- Skip test stage
Step 6: Add deploy stage
- Deploy
- Deploy provider:
AWS Elastic Beanstalk - Region:
United States (N. Virginia) - Input artifacts:
BuildArtifact - Application name:
dva-eb-app-express-js-sample-app - Environment name:
stg-env - Các setting khác để default
- Deploy provider:

Step 7: 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ếu bị lỗi do thiếu quyền deploy lên AWS ElasticBeanstalk thì Attach thêm policy AdministratorAccess-AWSElasticBeanstalk vào Service role của Codepipeline AWSCodePipelineServiceRole-us-east-1-dva-codepipeline-xxxxxxxxx

- Sau đó retry lại step deploy

- Đế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
5.1. Configure Manual approval stage
- Ở Console CodePipeline -> dva-codebuild-express-js-sample-app -> chọn Edit

- Add stage bên dưới stage Deploy

- Đặt Stage name:
ReviewvàAdd stage

- Click
Add action group

- Edit action
- Action name:
ManualApproval - Action provider:
Manual approval - Click Done
- Action name:

5.2. Configure Deploy to Prod Stage
- Tiếp tục Add stage bên dưới stage Review

- Stage name:
DeployToProdvàAdd stage

- Click
Add action group

- Edit action
- Action name:
DeployToProd - Action provider:
AWS Elastic Beanstalk - Region:
United States (N. Virginia) - Input artifacts:
BuildArtifact - Application name:
dva-eb-app-express-js-sample-app - Environment name:
prod-env
- Action name:
- Click Done

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


- Codepipeline đã update thành công!!!

5.3. Push new commit to your repo
- Update file
index.html, thay đổi background-color: orange;

- Commit changes

- CodePipeline được trigger và quá trình cicd bắt đầu

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

- Deploy stg hoàn tất và đang dừng ở Review. Access domain môi trường staging để verify

- Chúng ta tiếp tục bước Review
5.4. Monitor pipeline and manual approve change
- Click
ManualApprovalrồi chọnApprovevàsubmmit


- PipeLine tiếp tục triển khai deploy lên môi trường production

- Access domain môi trường prod để verify

Congratulations!Bạn đã hoàn thành việc build CICD pipeline trên AWS.
Clean up
- Delete Elastic Beanstalk application:
dva-eb-app-express-js-sample-app

- 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 Connections:
dva-repo-connection
