Hi gengz, kali ini kita akan belajar bareng, gimana sih caranya nge buat CI CD di AWS, yuk cekidot
Yuk kita akses dulu Codecommit kita di AWS, lalu buat repo baru



Nah kita sudah copy commandnya ya, yuk kita berger ke terminal

git clone https://git-codecommit.ap-southeast-1.amazonaws.com/v1/repos/awscicd
cd awscicd
git remote -v
Kita sudah melakukan clone dan sudah masuk di directory repo kita, yuk buat simple web service dulu, disini saya akan pakai golang ya gengz

package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func main() {
// Echo instance
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Route => handler
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!\n")
})
// Start server
e.Logger.Fatal(e.Start(":1323"))
}
Kita test dulu yuk menjalankannya

Yup ada error, kita belum init go nya dan get librarynya, yuk kita lakukan dulu

go mod init awscicd
go mod tidy
Yuk kita coba jalankan dulu


go run main.go
curl localhost:1323
Server sudah jalan dan kita juga sudah bisa melakukan akses, yuk dockerize dulu aplikasinya

# Step 1, membuat binary file
FROM golang:alpine AS builder
RUN apk update && apk add --no-cache git
WORKDIR $GOPATH/src/mypackage/myapp/
# Tambahan ENV penting, karena bila tidak ditambahkan, binary tidak jalan pada saat running di scratch
ENV CGO_ENABLED=0
COPY . .
# Melakukan instalasi terhadap library yang kita gunakan
RUN go get -d -v
RUN go build -o /go/bin/main
# Step 2, meletakkan binary file diatas scratch
FROM scratch
COPY --from=builder /go/bin/main /go/bin/main
ENTRYPOINT ["/go/bin/main"]
Saat ini kita sudah memiliki simple web service, sebelum kita eksekusi ke AWS, baiknya kita coba dilocal dulu yuk



docker build -t golang_web_service .
docker run -p 1323:1323 golang_web_service
curl localhost:1323
Selanjutnya kita akan mempersiapkan dulu service di ECR (Elastic Container Registry), yuk cekidot




Mantap, kita sudah punya Container Registry baru, perlu diingat, nanti URI nya kita akan copy ya gengz, sekarang kita persiapkan dulu ECS(Elastic Container Service) kita



Yang harus diperhatikan saat melakukan konfigurasi ECS adalah container name, ini akan dipakai untuk buildspec.yml. Selanjutnya adalah image, image kita bisa dapatkan di ECR kita ya gengz. Lalu port mappings, kebetulan simple golang web service yang kita buat menggunakan port 1323, sehingga kita harus melakukan konfigurasi agar bisa diakses kedepannya via public, silahkan click update





Mangstap, saat ini kita sedang membuat ECS cluster kita, ini akan menunggu, sambil nunggu yuk kita ngopi sama lanjut ke next stepnya yaitu membuat buildspec.yml. File yaml tersebut sebenernya sama denga gitlab-ci.yml klo temen temen sempet pake gitlab ya, segala sesuatu terkait build, ada di file tersebut, yuk kita buat dulu. Contekannya ada di link dibawah ini
https://docs.aws.amazon.com/codepipeline/latest/userguide/ecs-cd-pipeline.html

Ada beberapa hal yang harus kita rubah disini ya, yuk kita rubah dulu
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 568437762324.dkr.ecr.ap-southeast-1.amazonaws.com
- REPOSITORY_URI=568437762324.dkr.ecr.ap-southeast-1.amazonaws.com/awscicd
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
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":"awscicd","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
files: imagedefinitions.json
Hal yang kita rubah adalah pertama dibagian phases->pre_build->command, bisa dilihat disana ada 568437762324.dkr.ecr.ap-southeast-1.amazonaws.com url tersebut akan digunakan untuk codebuild melakukan login ke arah Container Registry kita (ECR).
Kedua di section yang sama, di bagian REPOSITORY_URI, 568437762324.dkr.ecr.ap-southeast-1.amazonaws.com/awscicd, mirip dengan yang diatas, tetapi bila kita perhatikan ada “awscicd” di urlnya ya, pada dasarnya ini adalah url dari repo kita di Container Registry.
Selanjutnya adalah bagian post_build->command bisa kita perhatikan ada baris berikut printf ‘[{“name”:”awscicd”,”imageUri”:”%s”}]’ $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json. Disini kita akan membuat image definitions yang nanti akan dipakai oleh Codepipeline kita pada saat proses Deployment (menggunakan codedeploy). “awscicd” adalah nama container yang kita buat di ECS kita, sedangkan imageUri adalah alamat dari containertersebut (akan merefer variable REPOSITORY_URI)
Saat ini seharusnya dari sisi git sudah siap ya, kita coba push dulu aja

git add .
git commit -m "repo for learning aws cicd"
git push origin master
Saat kita refresh codecommit kita, bisa kita lihat dibawah, code kita sudah ada ya

Mari kita konfigurasi dulu Codebuildnya ya gengz, seperti dibawah ini






Mohon diperhatikan, bagian diatas dichecklist ya gengz, agar kita bisa melakukan perintah Docker di dalam Codebuild kita



Kita telah sukses membuat buildnya ya, nah sekarang lanjut ke Codepipeline yuk








Wah ad error, kenapa ya, yuk kita check detailnya

Mari kita lihat di Codebuild dulu yuk



Kita bisa lihat di baris 28 ya, bahwa role kita tidak authorized untuk melakukan GetAuthorizationToken, yuk kita benerin dulu ke IAM




Mantap, kita sudah attach policy terhadap role, mari kita coba ulang kembali

Bisa kita lihat dibawah, build kita sukses ya

Alhamdulillah, Deploy kita juga sukses, bisa dilihat dibawah ini

Nah, kita coba akses dari luar yuk, berikut caranya



Copy paste link diatas ke browser lalu tambahkan port 1323

Mantap, sudah bisa diakses yak, yuk kita coba rubah codenya lalu push ke remote repository

package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func main() {
// Echo instance
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Route => handler
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Belajar AWS CI CD\n")
})
// Start server
e.Logger.Fatal(e.Start(":1323"))
}

git add .
git commit -m "update hello world to Belajar AWS CI CD"
git push origin master
Bisa kita lihat dibawah ini, saat kita selesai melakukan push ke repo, pipeline secara otomatis akan dijalankan

Bisa kita lihat bahwa pipeline sudah berhasil

Yuk kita coba refresh browser, apakah sudah terganti atau belum

Selamat ya, CI CD sudah berjalan sampai di Continuous Deployment, dan update sudah berhasil.
Nah selanjutnya kita housekeeping ya, Karena pada saat melakukan kegiatan diatas, pada dasarnya kita akan create service service baru, supaya nggak kena charge, dan rapih, kita bisa hapus semuanya satu persatu. Mari kita mulai dari ECS dulu ya


Selanjutnya kita akan hapus ECR, yuk seperti langkah dibawah


Selanjutnya kita akan ke s3, untuk delete object yang telah kita buat







Selanjutnya kita akan ke IAM untuk delete role dan policy, seperti berikut ini



Policies telah kita delete, jangan lupa delete 3 yang tadi ya supaya bersih, kita lanjut ke roles seperti dibawah ini


Mantap, sudah bersih semua ya, jadi kalau mau diulang lagi bisa dari 0, heheheheh.
Kira kira begitu aja guys, belajar bareng kali ini, semoga bermanfaat ya
Tinggalkan Balasan