---
# System prepended metadata

title: Project of AWS automation

---

# Project of AWS automation
[youbute](https://www.youtube.com/watch?v=7L3vJlwOTnk)
[github](https://github.com/Alexeanred/aws-automation-CI-CD)
## Infrastructure
![](https://hackmd.io/_uploads/Syb5hCaM6.png)

## CodeBuild push image to ECR
![](https://hackmd.io/_uploads/SkALb90fp.png)

* Ý tưởng: commit code lên github => codebuild lấy code từ github về build và push image lên ecr
### Vô thôi
#### B1: Tạo 1 repos demo trên ecr
![](https://hackmd.io/_uploads/SkepOKRMT.png)
#### B2: Viết file buildspec.yml
```yaml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Connecting to Amazon ECR...
      - aws --version
      # - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
      - aws ecr get-login-password --region us-east-2 | docker login
        --username AWS --password-stdin
        223320623045.dkr.ecr.us-east-2.amazonaws.com
      - REPOSITORY_URI=223320623045.dkr.ecr.us-east-2.amazonaws.com/demo
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=build-$(echo $CODEBUILD_BUILD_ID | awk -F":" '{print $2}')
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      - printf '[{"name":"simple-app","imageUri":"%s"}]'
        $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
      - cat imagedefinitions.json
artifacts:
  files: imagedefinitions.json
```
* Các nội dung:
    * pre_build: Check version aws + login, connect to ecr and the repos
    * build: build the images and tag it name with repos
    * post_build: push the image to ecr
#### B3: setup codebuild
* Chọn prj name
![](https://hackmd.io/_uploads/Hy_YoY0za.png)
* Chọn source là github
![](https://hackmd.io/_uploads/SyrM2FAGp.png)
* Chọn webhook github để trigger mỗi khi push lên
![](https://hackmd.io/_uploads/B1jwnFAGT.png)
* Chọn environment nơi codebuild chạy
![](https://hackmd.io/_uploads/rkA6yq0zT.png)
* Tạo 1 log để quản lý bằng cloudwatch 
![](https://hackmd.io/_uploads/H1mZe9CGp.png)

#### B4: sửa IAMrole của service role
![](https://hackmd.io/_uploads/BkWy-q0MT.png)
* Thêm quyền full access với ECR để push to ECR
#### B5: start build và nó sẽ chạy dc
* Note: Lưu ý sự khác nhau giữa architecture linux của amd64 và arm64. Có thể xảy ra lỗi: "The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested". Nếu window thì bỏ --platform ở FROM và docker build.
* Có thể xem log để debug lỗi

## Tạo ALB và TG
### TG
* Tạo TG để cho các container dc tạo từ services của ecs cluster vào
#### B1: Chọn loại IP 
![](https://hackmd.io/_uploads/BJ2BL3AGa.png)
#### B2: Chọn tg name và sửa thành port 8080 (port giống của container, port của app để user truy cập là 80)
![](https://hackmd.io/_uploads/ryjALnRGp.png)
* Chọn default VPC
* Có thể sửa healthcheck phù hợp với nhu cầu
#### B3: Next và tạo 1 tg trắng

### ALB
#### Cấu hình network
![](https://hackmd.io/_uploads/r1XtYhRMa.png)
* Tạo 2 subnets để tăng tính high avaibility
![](https://hackmd.io/_uploads/Byt-cn0MT.png)
* Chọn sg allow inbound traffic => mở port 80 cho all source
![](https://hackmd.io/_uploads/r1T053CGa.png)
#### Listeners + routing
![](https://hackmd.io/_uploads/HyBQs3Afp.png)
* ALB này listen ở port 80 và routing to tg
#### Create lb
## ECS
### Create Cluster
#### Chọn infrastructure để các container run on, Fargate giúp ta ko phải manually setup EC2 instance.
![](https://hackmd.io/_uploads/SJG8nnAfa.png)
### Create Task definitions
#### Chọn family name và infrastructure
![](https://hackmd.io/_uploads/rJlT03Rfp.png)
#### Chọn OS, CPU, Memory, Task role của 1 task
![](https://hackmd.io/_uploads/HyAIJ60zT.png)
* Note: Nếu chọn Linux/X86_64 thì có thể bị lỗi lúc build thành container trong ecs => Chọn ARM64
* Có thể add nhiều containers trong 1 task
#### Container
![](https://hackmd.io/_uploads/SkEi-TAzT.png)
* Tạo 1 container tên simple-app với image lấy từ ecr
* Port container là 8080
* Note: tên của container phải match với trong buildspec.yml
![](https://hackmd.io/_uploads/Sy4Re6CfT.png)

![](https://hackmd.io/_uploads/SysMfaCfa.png)
* Note: CPU phải <= CPU của task, container chỉ có soft limit (GH dưới) là 128 mb và ko có hard limit.
#### Chọn Create task

### Create Service
![](https://hackmd.io/_uploads/Sy_UUp0MT.png)
* Tạo 1 service trong cluster, launch type là fargate
![](https://hackmd.io/_uploads/Sk5DUp0z6.png)
* Chọn type là service, task definition có family và lấy revision mới nhất cho service đó
![](https://hackmd.io/_uploads/SkxYUpRMa.png)
* Chọn replica có 2 tasks để sinh ra 2 containers khi service dc khởi tạo
![](https://hackmd.io/_uploads/BJxgwa0zT.png)
* Chọn new sg và chỉ allow traffic từ sg của ALB vào port 8080 của container để healthcheck
![](https://hackmd.io/_uploads/SJDbDpAfa.png)
* Chọn lb, existing lb
![](https://hackmd.io/_uploads/SJwmv6CfT.png)
* Chọn container define từ task definitions, chọn tg 
#### Chọn Create Service
* Khi chạy xong, nó sẽ ra ntn
![](https://hackmd.io/_uploads/rkKpt4ymp.png)
* Truy cập thông qua dns của alb
#### Khi ta update code và CI với codebuild thì code sẽ ko tự động update ở ecs và có thể thấy qua dns của alb
![](https://hackmd.io/_uploads/S1Jyj4JXT.png)
**=> Muốn update thì phải stop 2 tasks đang chạy và nó sẽ tự động chạy 2 tasks mới với container build từ image mới. Có thể xem những diễn biến ở tg và xem thay đổi ở alb dns**


## Codepipeline
### Setup Codepipeline
#### Source stage
![](https://hackmd.io/_uploads/H1Smn4yX6.png)
* Chọn name và service role
![](https://hackmd.io/_uploads/BJWDnV1Q6.png)
![](https://hackmd.io/_uploads/B1m9nNk7T.png)
* Chọn source nơi ta lấy code về, connect to github,...
* Tìm hiểu các source khác như CodeCommit,...
![](https://hackmd.io/_uploads/rkDzTEyQ6.png)
![](https://hackmd.io/_uploads/SJRQpEyX6.png)
* Connect to github và install new app, chọn all reops
![](https://hackmd.io/_uploads/HyGCTVymT.png)
* Chọn repos name, branch name nơi chứa source.
#### Build stage
![](https://hackmd.io/_uploads/SyEeRVkXp.png)
![](https://hackmd.io/_uploads/BJwNA4kQa.png)
#### Deploy stage
![](https://hackmd.io/_uploads/r1ovCEJQp.png)
![](https://hackmd.io/_uploads/S18cAE1mp.png)
![](https://hackmd.io/_uploads/SJG304kmT.png)
* Note: Có thể pipeline chưa có permissions để truy cập vào ecr và ecs.
![](https://hackmd.io/_uploads/r1gXJHkma.png)
* Đây là trạng thái khi các stage thành công
![](https://hackmd.io/_uploads/BJUOkByQp.png)
* Có thể thay đổi phần cứng của các stage để thời gian chạy nhanh hơn như codebuild thì tăng ram,cpu để build nhanh hơn 

