Full CI/CD on AWS With Terraform via ECR ECS and Jenkins

Bismillah, mau berbagi lagi.. :). Biasanyah... walaupun ga semua, yang udah2 kita kalo mau membuat CI/CD itu terpencar2 dan manual, misal jenkins di EC2, docker images di Docker Hub, service instance di EC2 lagi bolak2 ajah, bukannya ga bagus tapi rada riweh maintainnya sama efisiensinya. Nah kali ini mau sharing hal tersebut bisa di buat dalam satu console yaitu AWS, terutama di ECR (Amazon EC2 Container Registry) ame ECS (Amazon EC2 Container Service). App yang akan kita buat contoh deploy NodeJS yach.

Berikut ane jelasin stepnyah:

1. Penjelasan masing2 services
2. Run terraform untuk setup seluruh aws services
3. Setup dan buat 2 jobs di jenkins
4. Demo run build job dan deploy job








1. Sebelom kita mulai ane jelasin dulu dikit ya apa yang akan di lakukan dari masing2 services.

  • Terraform adalah sebuah infratructure as code software, aseli..! seneng enak banget pake inih barang. Ga usah ngelakuin klakklik lagi di AWS console, tinggal coding jadi. Support banyak provider cloud pula. ane lagi tunggu dia support kubernetes, kumplit dah kalo sampe di support. Nah fungsi si terraform ini nanti membuat image
  • ECR gampangnya adalah sebuah repository images buat si docker, dari proses pull, push manage images semua disana, kita ga perlu repot maintain service registrynya (yg kek dulu ane lakuin #eh), semisal HW issue, security dll. Terus pake permission dari IAM, jadi base on users instance bisa akses si ECR inih.
  • ECS sebenernya adalah isinya EC2 nya AWS, cuman ngak sesimple itu dengan ECS ini kita sebenernya dibuatin cluster. Memudahkan kita dalam memanage containter, launch start stop container. Terus kalo bikin soal resource needs, isolation policies, and availability requirements bisa kita mainkan, seru dah.
  • Jenkins udah sama2 tau dah..hahaaa..
2. Tahap ini kita clone git dari repo ane, terus di dalem situ udah kumplit, ada keyfile dummynya juga buat login ke EC2nya, silahkan diganti. Setelah itu kita running terraform, untuk membuat jenkins instance, configure iam, ecr, ecs, security group, create volume, s3 bucket untuk terraform state.

➜  ~ git clone https://github.com/unixhat/terraform-jenkins-ecr-ecs.git
Cloning into 'terraform-jenkins-ecr-ecs'...
remote: Counting objects: 32, done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 32 (delta 3), reused 32 (delta 3), pack-reused 0
Unpacking objects: 100% (32/32), done.
➜  ~ cd terraform-jenkins-ecr-ecs
➜  terraform-jenkins-ecr-ecs git:(master) git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

Setelah ini running terraformnya didalam folder, yang dilakukan adalah:
1. membuat VPC
2. setup IGW
3. Route table
4. membuat folder di s3 untuk terraform state
5. menambahkan key untuk ssh (sudah ada dummy key di git ane)
6. setup IAM, untuk policy n role ECS, ECR, Consul (service discovery)
7. membuat volume untuk partisi khusus si jenkins
8. setup ECR, repository docker dl
9. setup ECS, bikin cluster dl
10. bikin ELB
11. bikin instance jenkins + attach volume
12. setup security group nyah
13. Outputkan url ELB, Jenkins IP dan Docker Repository

Jalankan dengan perintah:

➜  terraform-jenkins-ecr-ecs git:(master) terrform plan # Untuk melihat apa saja yg akan dilakukan
➜  terraform-jenkins-ecr-ecs git:(master) terraform apply # Untuk melakukan perubahannya

berikut hasilnya:













3. Setup dan buat 2 jobs di Jenkins.

a. Sebelum itu kita login ke dalam instance jenkins yg udah terbentuk oleh terraform, untuk unlock jenkins di /var/lib/jenkins/secrets/initialAdminPassword:





jenkins@ip-10-0-1-231:~$ df -h | grep jenkins
/dev/mapper/data-volume1   20G  211M   19G   2% /var/lib/jenkins

b. Setup dan install plugin standardnya bang






3. Setelah ini kita buat 2 freestyle job project:

1. Job "mynodejs-build-docker" fungsinya untuk membuat image nodejs dari source code kita dan push ke repository di ECR.















docker build --tag 729393702601.dkr.ecr.eu-west-1.amazonaws.com/myapp:${GIT_COMMIT} .
#eval "$(aws ecr get-login --region eu-west-1)"
docker push 729393702601.dkr.ecr.eu-west-1.amazonaws.com/myapp:${GIT_COMMIT}


















2. Job "mynodejs-deploy-docker" yang buat nge-deploy ke dalam ECS bang menggunakan terraform.

#scripts/configure-remote-state.sh
touch mykey #biar ga error aja
touch mykey.pub #biar ga error aja
terraform apply -target aws_ecs_service.myapp-service -var MYAPP_SERVICE_ENABLE="1" -var MYAPP_VERSION=${MYAPP_VERSION}
















4. Demo run build job dan deploy job

Jalanin job build nanti jika sukses akan ketrigger job deploy.





Ayo kita akses Load Balancing:



Nah alhamdulillah muncul =D..
Kesimpulannya kita ga perlu cape2 lagi semua udah di automet, dari proses pembuatan infrastruktur sampai manage image, dari build sampe deploy.. sedapp... tapi lebih disini yg kurang adalah jenkins, sebenernya bisa dibikinin automatenya juga pake job-DSL tapi ane lagi males =D bukan buat prod jadi biar cepet ajah.. hahaa..