learning new stack

tujuannya aku pengen bisa ngirim log ke scalyr

source code ada di bitbucket, deployed staging dan production di EB, dengan platform docker. katanya bisa pakai .ebextensions buat customize deployment EB

Hal baru pertama: .ebextensions

bentuknya seperti yaml file, setelah dibaca sepintas, cukup straight forward, di sebuah hidden folder (karena mulai dengan character .) kita bisa naro beberapa .config file. setiap file dinamai dengan pola 01-jenis-config,02-jenis-config-lain, etc. sepertinya supaya dieksekusi berurutan.

di contekan, cukup butuh install scalyr agent , pasang confignya, kemudian restart. simple 🙂 yup seperti service2 lain, scalyr menggunakan agent. Tapi jadi muncul pertanyaan, kenapa ga pakai model applicationnya yang proactively ngirim ya? lewat fluentd mungkin?

anyway kembali ke EB dan .ebextensions. Karena ada staging dan production, maka aku mulai dari stagingnya. awalnya sih tergoda buat langsung apply ke production, tapi untungnya ga jadi. kalo ga bisa gawat.

keliatan cukup simple, buat folder .ebextensions (pakai s) lalu copy paste dari project lain what could go wrong right? hehe

eh tapi gimana cara deploy nya? yang sudah pernah kupelajari waktu bikin vehicle simulation (link post here), pake manual upload dockerawsjson file. nah kalo ini gimana? masak iya upload file manual.

ternyata sudah pake bitbucket pipeline. jadi di pipeline, kita bisa pasang pipe untuk push docker image ke ecs, lalu upload application version dan deploy version tersebut ke EB. keren banget ya.

Pipeline

di pipeline, kita specify, saat ada push ke branch mana, lakukan apa, di repo yang sekarang

  1. scan code pake sonarcube
  2. build docker image
  3. push ke ecs (ini dan step 2 ada pipe nya)
  4. create application bundle zip
  5. use zip in the deploy eb pipe

Pertanyaan berikutnya, folder .ebextensionsnya di tambahkan di dockerfile atau di mana?

Pertanyaan lagi: ada variable seperti aws key dan secret, itu di input dimana?

ternyata bitbucket punya variable di tiap repo, dan tiap deployment, link nya ada di …/setting . untuk bisa buka ini, butuh akses xxx.

nah variable nya ada project > repo > deployment semakin kecil itu yang dipakai.

Pertanyaan lagi: aws credsnya disitu punya siapa? > pakai deployment creds

ok jadi kita bikin PR , dan merge ke branch develop. lalu otomatis jalan ya pipeline nya? dan iya. ternyata sesimple itu. buildnya jalan. dan that’s it! all done. haha i wish!

issue: wrong s3 bucket name. check if it’s the right bucket name (it exists and accessible by the IAM used in the build), otherwise, step 5 doesn’t work

deploy berhasil, tapi gimana cara tahu nya .ebextensionnya sudah applied?

Ternyata platform docker sedikit berbeda, soalnya di dokumentasinya ga ada informasi tentang ini. contohnya, kalo platform java, bisa pasang nginx di folder .ebextensions terus otomatis kepasang jadi nginx config.

jadi belajar kalo di eb itu bisa ssh ke instancenya. ini juga ada 3 caranya. saat di staging, paling gampang pakai session manager, kalo ga bisa pakai proxy.

duh aku lupa kenapa, tapi setelah di utak atik. aku end up dengan staging EB statenya invalid. dan ga bisa diapa2kan. ah kalo ga salah, karena berasumsi scalyr agentnya sudah terinstall , aku pasang env var aja. tapi ga nyampe ke sana, kemudian , karena frustasi, mulai lah dengan restart instance, rebuild environment, dll.

karena, instance nya sudah ga bisa dipakai, aku decide bikin baru. staging-2. somehow gagal juga, apa karena docker versionnya ya? di eb ada 2 macem platform docker. apa karena di production pake versi yang agak lebih lama ya? apa ada bug di versi itu ya. apa aku perlu baca changelog antar version itu ya?

oh iya, buat bikin new environment, butuh permission lebih juga. jadi pastikan punya itu ya. kalo ga bakal dapet error lagi dari EB saat environment creation.

environment staging-2 end up in invalid state as well. err…. oke, berarti bikin environment staging-3. tapi coba pelan2. bikin EB platform docker, terus tambahin folder .ebextensions, oh biar lebih simple, pake public 2048 image deh.

di point ini aku udah nemu SO yang bilang kalo bundle EB bisa dalam bentuk zip file. jadi aku tambahin custom nginx.conf ke folder itu. deploy. terus cek via ssh yang pakai session manager. it’s great tool! tapi kok malah dapet 502.

hoo ternyata di dockerawsjson port mapping yang ku pakai bukan 80 padahal 2048 itu expose nya port 80 (link to dockerfile). nginx proxy itu kan cukup jelas ya mestinya. jadi kalau eb docker tuh nanti akan ada proxy forward ke http://docker , terus docker itu di define di tambah nginx config yang sepertinya di generate sama EB script berdasarkan dockerawsjson file. bentuknya gini: server docker { docker ip: 8080 }, habis baca file ini, jadi sadar kalo dockerawsjson yang barusan ku upload itu bekas dipake buat image lain yang pakenya port 8080. TODO: ganti ke port 80 biar standard kalo mau.

oke, setelah di ganti port nya, deploy, jadi bener. tadi itu dapetnya 502 artinya nginx proxy nya bermasalah.

sambil stress main 2048 dulu. keren ya ini game, simple tapi seru.

ok site nya berhasil di deploy, tapi nginx conf nya kok ga ke ganti oleh file yang kita upload di folder .ebextensions? setelah dipikir2 emang iya ya, kalo ada folder nginx jadi otomatis dipakai buat override. kembali ke dokumentasi. adanya mereka merefer ke .config file yang bisa generate file dan execute commands.

coba cari blog yang pake .ebextensions paling simple. terus ketemu ini yang ngeganti timeout nginx. jadi idenya bukan me replace file nginx yang default, tapi jalanin script buat otak atik itu file. di case dia ga modify sih, tapi nambah config file di follder lain yang di include nginx.

deploy, failed. oh ow ,, jangan sampai invlaid state lagi. kayaknya cukup innocents padahal, simple banget. kenapa ga bisa sih?? udah mulai stress nih..

ambil nafas, terus coba google lagi, setelah di baca bener2 ternyata blog ini ada beberapa typo juga. coba cari blog lain yang masih recent. eh ternyata ga nemu. tapi malah nemu repo contoh dari aws sendiri . pilih yang kecil biar paham maksudnya dan mudah di konfirmasi, soalnya ada yang pendek2 tpi ga begitu faham maksudnya, kayak nambah integrasi ke service2 aws yang lain misal.

ketemu satu repo yang bisa install nodejs. kupikir validasinya pake ssh , terus setelah sukses deploy, berarti harus ada node -version di ssh. jadi dicoba dan hasil nya …. berhasil .. fiuh…

oke jadi pelan2 mulai di compare sama file yang ngeganti nginx , karena both penasaran dan emang bakal perlu modify nginx. ternyata yang beda adalah tanda “” yang kalo di copy paste dari medium jadi character beda “”. duh jadi spent berapa lama gara2 ini, dan lucunya ternyata ada di komentar blog itu , kalo perlu hati2 waktu copy paste. si orang nya juga ga di edit sih blog nya.

ok jadi replace semua “” pake “” yang basic. deploy, dan berhasil. habis itu dapet update ternyata nginx di custom itu supaya match sama parser di scalyr, padahal pattern yang sekarang udah oke. pelajaran berikutnya. always understand why we need to do what we need to do!

oke berarti ga perlu dong modify nginx. iya ga perlu. kita bisa fokus ke install scalyr agent sekarang. oke dipasang. bisa nih… dari ssh sudah bisa akses cli scalyr agent.

config filenya si scalyr agent , butuh api key. ternyata di template yang di folder .ebextensions dia merefer ke env var. maksudnya ini variable bitbucket atau EB ya. ah biar lah , tunggu dulu, kita hardcode lewat ssh, biar bisa konfirmasi nyambung ke dashboard account scalyr. eh ternyata bener. oke berikutnya coba pasang di env var EB. update environment, eh kok ga ngaruh ya. coba deploy. ternyata bisa. jadi update env var ga ng-execute scripts ebextensions. pelajaran baru!

entah kenapa sejak ganti ke staging-3, deployment yang di bitbucket selalu gagal. errornya application version is not found. jadi workaroundnya pakai manual download zip dari s3, terus upload dan bikin version sendiri. yang aneh, untuk application name itu, ada di eb, eh ternyata aku salah kasih application name . jadi di eb tuh ada environment, ada application. dan ada version. kita bisa deploy versi sebuah application ke suatu environment.

setelah ini selesai. tada.. all good.

Leave a Comment

Your email address will not be published. Required fields are marked *