How to deploy simple bakery shop website using with AWS CodePipeline?

Zin Lin HtetZin Lin Htet
7 min read

ကျွန်တော် ဒီနေ့ Sharing လုပ်ပေးချင်တဲ့ အကြောင်းအရာကတော့ AWS ရဲ့ CodePipeline ကို အသုံးပြု ပီး ရိုးရိုးရှင်းရှင်း Bakery shop website တစ်ခု ကို ဘယ်လို တည်ဆောက်သွားမလဲ ဆိုတာ ပဲဖြစ် ပါတယ်။

Lab Components ဒီ Lab လေးမှာ ဘယ် services တွေကို အသုံးပြု သွားမလဲဆိုတာ ကိုတစ်ချက် ကြည့်ရအောင်ပါ။ AWS ရဲ့ CodeCommit, CodeBuild, CodeDeploy, CodePipeline, Elastic Container Registry, Amazon Elastic Container Service တွေကို အဓိကထားပီး သုံးထားပါတယ်။

Lab Aiming Lab လေးရဲ့ ရည်ရွယ်ချက်က Real world မှာ DevOps တစ်ယောက်အနေနဲ့ AWS ရဲ့ services တွေကို အသုံးချပီး business တစ်ခုရဲ့ လိုအပ်ချက်တွေကို ဘယ်လိုမြန်မြန် ဆန်ဆန် နဲ့ deliver လုပ်ပေးလဲဆိုတာကို သိစေချင်တဲ့ အတွက် ဒီ lab လေးကို sharing လုပ်ပေးဖြစ်တာပါ။ ဒီနေရာမှာ စကားတစ်ခု ကြိုခံချင်တာ က ကျွန်တော် လေ့လာထားတာ နဲ့ လုပ်ဖူးခဲ့ လုပ်နေဆဲ ဖြစ်တဲ့ အရာတွေကို အခြေခံပီး knowledge sharing လုပ်ပေးဖြစ်တာပါ၊ တစ်နေရာရာမှာ လိုအပ်ချက်မျိုး မှားတာမျိုး တွေ့ရင် အားမနာတမ်း ဝေဖန် အကြုံ ပြု ဖို့ တောင်းဆိုပါတယ်။ ကဲ Lab ဘက်ကို ပြန်ဆက်ကျရအောင်ပါ။

AWS CodeCommit ပထမ ဆုံး အနေနဲ့ ကျွန်တော် တို့ ရဲ့ Local machine ထဲမှာ develop လုပ်ထားတဲ့ code တွေကို store လုပ်ဖို့ အတွက် AWS ရဲ့ version control system တစ်ခုဖြစ်တဲ့ CodeCommit ကို အသုံးပြုသွားပါမယ်။ CodeCommit ကို အသုံးပြုမယ် ဆိုရင် ကို့ရဲ့ IAM account မှာ CodeCommit access ရှိနေမှရပါမယ်။ အဲ့တာ ဆိုရင် အရင်ဆုံး ကျွန်တော် တို့ သုံးမဲ့ account မှာ CodeCommit access ရအောင်လုပ်ရပါမယ်။ နောက်တစ်ချက်က ကျွန်တော်တို့ local machine ထဲက code တွေကို CodeCommit ပေါ် ကို လှမ်းပီး တင်တဲ့ အခါ authentication လုပ်ဖို့ user name, password လိုပါတယ်။ အဲ့မှာ ထည့် ရတဲ့ username, password ကို အသုံး ပြုမဲ့ IAM account မှာသွားပီး create ရပါမယ်။

IAM ရဲ့ သက်ဆိုင်ရာ ‌user account ထိသွားပါ၊ အဲ့နေရာမှာ Security credentials ဆိုတဲ့ setting အောက်မှာ HTTPS Git Credentials for AWS CodeCommit နေရာမှာ ဘာမှမရှိတာ ကို တွေ့ရပါမယ်။ Generate credentials ဆိုတာကို နှိပ်ပီး credential တစ်ခုရအောင်လုပ်ပါ။

ကဲအဲ့တာ ဆိုရင် ကျွန်တော်တို့ CodeCommit သုံးဖို့အတွက် လိုအပ်တဲ့ credential တစ်ခုဖန်တီး ပီးပါပီ။

Code push to AWS CodeCommit

ကဲ့အဲ့တာဆိုရင် ကျွန်တော်တို့ CodeCommit မှာ Code store ‌ဖို့ အတွက် repo တစ်ခုဆောက်ရအောင်ပါ။ Create repository ကိုနှိပ်ပါ။

Repo တစ်ခုဆောက်ပီးပီ ဆိုရင် ကျွန်တော် တို့ repo ကို clone ပါမယ် ။ ဒီမှာတော့ Clone HTTPS နဲ့ clone လိုက်ပါမယ်။

ဒီနေရာမှာ GIT အကြောင်း အတန်အသင့်သိထားတဲ့ လူဆိုရင် အခက်အခဲမရှိပါဘူး။ မသိသေးတဲ့ သူတွေ အတွက် အနည်းကျဉ်း ရှင်းပြပါမယ်။ အရင်ဆုံး clone မလုပ်ခင် မှာ ကို့ ရဲ့ code ကို CodeCommit ပေါ် push ဖို့ အတွက် ကျွန်တော် တို့ ဒီ အတိုင်း push လိုက်လို့ မရပါဘူး အရင်ဆုံး local machine ထဲက code တွေသိမ်းထားတဲ့ folder ထဲအရင်သွားရပါမယ်၊ ပီးရင် git initialize လုပ်ပေးရပါမယ်။ git initialize လုပ်ပီးတာနဲ့ Clone လာတဲ့ repo path ကို git remote add command နဲ့ add ပေးရပါမယ်။ ဘာလို့လဲဆိုရင် ကျွန်တော်တို့က AWS CodeCommit ပေါ် မှာ ဆောက်ပီးသားဖြစ်တဲ့ remote repo ထဲကို local machine ထဲက code ‌တွေကို သွားပီး store ထားမှာဖြစ်တဲ့ အတွက် ကြောင့်ပါ။ ရိုက်သွားတဲ့ Command ကို ရှင်းနေအောင် ရေးပေးထားပါတယ်။

git init --initial-branch=prod

git remote add origin { copy of your repo url }

git add .

git commit -m { comment }

git push -u origin prod

အောက်ဆုံးက git push command ရိုက်ပီးတာနဲ့ ‌authenticate လုပ်မှာဖြစ်တဲ့ အတွက် ခုနက ကြို ‌create လုပ်ထားတဲ့ git credentials က username နဲ့ password ကို ရိုက်ပေးရပါမယ်။

User name နဲ့ password မှန်တယ်ဆိုရင် CodeCommit မှာဆောက်ခဲ့တဲ့ Repo ထဲဝင်ကြည့်ရင် ကျွန်တော် တို့ local machine ထဲက code တွေရောက်နေတာ ကို တွေ့ရပါမယ်။

Create Elastic Container Registry

ကျွန်တော် တို့ code repo ထဲကို code တွေရောက်လာပီဆိုတော့ CodeBuild ကြည့်ရအောင်ပါ။ မ build ခင်မှာ ကျွန်တော်တို့ အရင်ဆုံး ECR တစ်လုံး ဆောက်ရအောင်ပါ။ ဘာလို့လဲဆိုရင် ကျွန်တော် တို့ရဲ့ code ကို deploy လုပ်တဲ့အခါမှာ ECS ‌ပေါ် မှာ လုပ်မှာဖြစ်ပါတယ်။ ဆိုလိုတာက container အနေနဲ့ ကျွန်တော် တို့ website လေးကို run မှာပါ။ ဆိုတော့ container run မယ်ဆိုရင် docker image လိုလာပါပီ၊ အဲ့လို လိုတဲ့ နေရာမှာ docker image လေးဖြစ်အောင် Dockerfile ‌ဆောက်ပီး လုပ်ထားပါတယ်၊ ရလာတဲ့ docker image ကို store ဖို့ အတွက် ဆိုရင် Docker Hub မှာသွားပီး store လို့ရပါတယ်။ ဒါပေမဲ့ ဒီ lab မှာ AWS ရဲ့ ECR ကိုပဲ သုံးပီး docker image ကို store ထားပါတယ်။ အဲ့တာဆိုရင် ECR ကို private repo တစ်ခုအနေနဲ့ ဆောက်လိုက်ပါမယ်။

CodeCommit to CodeBuild Stage

ECR တစ်ခုဆောက်ပီးပီဆိုရင်ကျွန်‌တော် တို့ CodeBuild ကြည့်ရအောင်ပါ။

Source နေရာမှာ CodeBuild တဲ့အချိန်မှာ ဘယ် provider ကနေ code ကို ယူပီး build မှာလဲဆိုတာ ကို ရွေးပေးရပါတယ်။ အဲ့နေရာမှာ Bit Bucket ကနေ ကော Git Hub, Git Lab ကနေပါ ယူလို့ ရပါတယ်ဒါပေမဲ့ ဒီ lab မှာ code repo ကို CodeCommit မှာလုပ်ထားတာဖြစ်တဲ့ အတွက် CodeCommit ကိုရွေးရပါမယ်။

အဲ့နေရာမှာ Role တစ်ခု အသစ်ဆောက်သွားပါလိမ့်မယ်။ အဲ့ role ကလည်း အရေးကြီးပါတယ်၊ ဘာလို့လဲဆိုရင် အဲ့ role က CodeBuild တဲ့ အချိန်မှာ သုံးရတာမလို့ပါ။ အဲ့ role မှာ ကျွန်တော် တို့ permission တစ်ခု ထပ်တိုးဖို့ လိုပါလိမ့်မယ်။ ဘာလို့လဲဆိုရင် ကျွန်တော် တို့ CodeBuild တဲ့ stage မှာ docker image တစ်ခု ထွက်လာပါလိမ့်မယ်၊ ထွက်လာတဲ့ docker image ကို ECR ကို လှမ်းပီးပို့ဖို လိုပါတယ်။ ဒါပေမဲ့ အခု role မှာ CodeBuild ကနေ ECR ကို image လှမ်း push လို့ရတဲ့ permission မပါလာပါဘူး အဲ့တာကြောင့် ထည့်ပေးရပါမယ်။ IAM setting ထဲသွားပီး ‌add permissions နဲ့ လုပ်ပေးရပါမယ်။

Privileged မှာ enable လုပ်ပေးမှရပါမယ်။ အကယ်လို့ မလုပ်ခဲ့ရင် ကျွန်တော် တို့ CodeBuild process fail ပါလိမ့်မယ်။ ဘာလို့လဲဆိုရင် ကျွန်တော်တို့ က Code ကို ဒီ အတိုင်း deploy မှာမဟုတ်ပဲ container တစ်လုံး အနေနဲ့ run ချင်တာဖြစ်တဲ့ အတွက် docker image ဖြစ်အောင် အရင်ပြောင်းရမှာပါ။ အဲ့လို ဖြစ်အောင် ဒီ build တဲ့ stage မှာ docker image ဖြစ်အောင် လုပ်ပေးရပါတယ်။ အဲ့လို docker image ဖြစ်အောင် build job ကို run မဲ့ Operating System မှာ docker service ရှိနေမှ ရပါမယ်။ မရှိနေရင် docker image တစ်ခုဖြစ်အောင် build နိုင်မှာ မဟုတ်ပါဘူး။ အခု လောက်ဆို ဘာကြောင့် Enable လုပ်ရလဲဆိုတာ သဘော ပေါက်ပီ ထင်ပါတယ်။ သူက default အနေနဲ့ ဆိုရင် မ on ထားလို့ပါ။

buildspec file ကို သေချာညွှန်းပေးရပါမယ်။ အရမ်း ကိုအရေးကြီးပါတယ် ဘာလို့ဆို အဲ့ file ထဲမှာ CodeBuild တဲ့ အချိန်မှာ ဘာပီးရင် ဘာလုပ်ရမယ် ဆိုတာကို instruction ပေးထားတာဖြစ်တဲ့ အတွက် step by step သေချာ ရေးထားရပါမယ်။

ပီးရင် Create build project ဆိုတာကို နှိပ်လိုက် တာနဲ့ Build stage တစ်ခု ဖန်တီးပီးသားဖြစ်သွားပါလိမ့်မယ်။

CodeBuild to CodePipeline Stage

ကျွန်တော် တို့ CodeBuild ပီးသွားပီဆိုတာ နဲ့ CodePipeline တစ်ခုလောက် ဖောက်ကြည့်ရအောင်ပါ။

ဒီနေရာမှာ ကျွန်တော်က Pipeline type မှာ V1 ကိုပဲ‌ ရွေးထားပါတယ်။

Deploy stage ကို ခဏ skip လိုက်ပါမယ်။ ဘာလို့ လဲဆိုရင် ကျွန်တော် တို့ မှာ deploy လုပ်မဲ့ Infra မရှိ သေးလို့ပါ ။ ဆိုလိုချင်တာက CodeBuild ပီးသွားတဲ့ အခါ CodeDeploy stage ကလာရမှာပါ ဒါပေမဲ့ ကျွန်တော်က deploy လုပ်မဲ့ Infra ဖြစ်တဲ့ Elastic Container Service ကို မလုပ်ရသေးပါဘူး အဲ့တာကြောင့် ECS Infra တစ်ခုဆောက်ပီးမှ CodeDeploy stage ကို ပြန်လာထည့်လိုက်ပါမယ်။ အဲ့တာ ဆိုရင် အခုဆောက်တဲ့ CodePipeline မှာ CodeCommit နဲ့ CodeBuild stage က ကောင်းကောင်း အလုပ် လုပ်မလုပ် စမ်းကြည့်ကျရအောင်ပါ။

CodePipeline ‌ဖောက်လိုက်ပီ ဆိုတာနဲ့ Pipeline ကစပီး run ပါပီ။ အရင်ဆုံး CodeCommit ကစပီး အလုပ်လုပ်ပါပီ။ CodeCommit မှာ error ရှင်းတယ်ဆိုရင် pipeline ရဲ့ second stage ဖြစ်တဲ့ build stage ကိုသွားပီးအလုပ်လုပ်မှာ ဖြစ်ပါတယ်။

အခုဆိုရင် CodeCommit ကော CodeBuild stage တွေ အဆင်ပြေပြေ နဲ့ run သွားတာ ကိုမြင်ရမှာပါ။

Configure Elastic Container Service

ကျွန်တော် တို့ Code ကို deploy လုပ်ပီးသုံးမဲ့ Infra တစ်ခုဆောက်ရပါမယ်။ ကျွန်တော်တို့ က container အနေနဲ့ website ကို run ချင်တာ ဖြစ်တဲ့ အတွက် ECS ကို သုံးထားပါတယ်။ ECS ကို ရိုးရိုး EC2 ပေါ် မှာ မဟုတ်ပဲ AWS Fargate (serverless) ပေါ်မှာ လုပ်ပြထားပါတယ်။

အရင်ဆုံး Cluster တစ်ခုဆောက်ရပါမယ်။

Cluster ဆောက်ပီးပီဆိုရင်တော့ ကျွန်တော်တို့ task definition လုပ်ပေးရပါမယ်။ Launch type မှာ AWS Fargte ကိုရွေးပါ။

Task size မှာ CPU, Memory sizing တွေသတ်မှတ်ပေးရပါမယ်။

image uri မှာ ECR မှာ CodeBuild ပီးတဲ့ အချိန် ထွက်လာတဲ့ docker image ကိုယူသုံး ရပါမယ်။ ကျွန်တော်ရဲ့ container port က 3000 နဲ့ run နေတာပါ။

Command မှာ node,app.js ထည့်ပေးရပါမယ်။ ဘာလို့လဲဆိုရင် ကျွန်တော်တို့ website က node.js ကို သုံးပီး ရေးထားတာမလို့ container တစ်လုံးအနေနဲ့ စ run ပီးဆိုတာနဲ့ သိနေအောင် ထည့်‌ပေးရပါတယ်။ Working directory ကတော့ Dockerfile ထဲမှာ သတ်မှတ်ထားသလို /home/app path ကိုထည့်ပေးရပါမယ်။

ကျွန်တော်တို့ လိုအပ်တဲ့ Task definitation file ကို လုပ်ပီးသွားပါပီ။

Service တစ်ခု ဆောက်ပေးရပါမယ်

Container 2 လုံးနဲ့ run စေချင်လို့ Desired tasks မှာ 2 ထားခဲ့ပါတယ်။

VPC ‌ရွေးပေးရပါမယ်။ ဒီ lab မှာ ကျွန်တော် VPC အသစ်တစ်ခု ဆောက်ပီး public subnet တွေနဲ့ စမ်းပြထားပါတယ်။ Security Group ကိုလည်း ကြိုဆောက်ပီးသား ကိုသုံးလိုက်ပါတယ်။ Public IP ကိုလည်း On ထားပီးသုံးပါမယ်။

ဒီမှာ ရေးထားတဲ့ Rule က port number 3000 နဲ့ လှမ်း Access လုပ်တဲ့ အချိန်မှာ Application Load Balancer ရဲ့ security group ကလွဲပီး ကျန်တာ access လုပ်ခွင့်မရှိဘူးဆိုတာ မျိုးရေးထားတာပါ။

Application Load Balancer ကိုလည်းသုံးပါမယ်။ ALB ရဲ့ Security group ပါ။

Auto Scaling ကိုလည်းသုံးပြထားပါတယ်။ အကယ်လို့ ကျွန်‌တော် တို့ website မှာ load အရမ်းတက်လာလို့ container တွေထပ်လိုလာခဲ့ရင် ‌auto ဖြစ်နေအောင် ASG ကို အသုံးပြုထားပါတယ်။

Target tracking scaling ကိုအသုံးပြုထားပါတယ်။ CPU Utilization 60 % အထိ ထိုးတက်လာရင် scale out လုပ်ပါဆိုပီး လုပ်ထားပါတယ်။ ပီးရင် Create လုပ်လိုက်ပါ။

စပီး တော့ ECR ကနေ image လှမ်းယူပီး Container 2 လုံးစဆောက်နေပါပီ။ ခဏ စောင့်ရပါတယ်။

ကျွန်တော်တို့ ECS ဘက်က အလုပ်လုပ်ပီဆိုရင် Application Load Balancer က DNS name ကိုယူပီး Website တကယ် တက်လာ မလာဆိုတာကိုစစ်ကြည့်ပါ။ စစ်လိုက်ရင် ကျွန်တော်တို့ site တက်နေပါပီ။

အဲ့တာဆိုရင် ကျွန်တော်တို့ CodeDeploy stage ကို CodePipeline မှာသွားထည့်လို့ရပါပီ။

Pipeline မှာသွားပီး Edit ပါမယ်။

အဲ့မှာ Image definitions file ကို သေချာထည့်ရေးပေးရပါမယ်။ မဟုတ်ရင် CodeBuild ပီးထွက်လာတဲ့ ဟာကို ဘယ်မှာသွားပီး Deploy ရမလဲမသိဖြစ်နေပါမယ်။ပ

ပီးသွားရင် save ရပါမယ်။ CodePipeline မှာအခုဆိုရင် CodeCommit, CodeBuild ကော CodeDeploy တဲ့ အဆင့်သုံးခု လုံးပါလာပါပီ။ အဲ့တာဆို ကျွန်တော် တို့ရဲ့ CodePipeline က တကယ်အလုပ် လုပ်မလုပ်သိရအောင်စမ်းလို့ရပါတယ်။ Local machine မှာ တချို့ code လေးကို ပြင်ပီး AWS CodeCommit ဆီကို လှမ်း push ကြည့်ပါ။ အဲ့အခါကျ ရင် Pipeline က အောက်က အတိုင်းဖြစ်နေပါမယ်။ ဘာလို့ဆို CodeCommit ထဲကို code အသစ်ရောက်လာတဲ့အတွက် ပြန်ပီး အစကနေ ပြန်ပီး လုပ်ပေးနေပါပီ။ အဲ့တာဆို အကြမ်းဖျဥ်း အားဖြစ် CodePipeline က အလုပ်လုပ်သွားပါပီ။

ECS မှာလည်း နောက်ထပ် Contatiners အသစ် 2 လုံးဆောက်သွားတာ ကို တွေ့ရပါမယ်။

နောက်ဆုံး ပြန်စစ်ကြည့်တဲ့ အခါ CodePipeline တစ်ခုလုံးချောချောမွေ့မွေ့ run သွားတာ ကိုတွေ့ ရပါတယ်။ တကယ်ကော ပြောင်းမပြောင်း ကို ALB ရဲ့ DNS ကို ‌ခေါ် ကြည့်ပါ။

အစ က Welcome to Our Bakery Shop နေရာမှာ Welcome to DevOps Bakery Shop ဆိုပီး ပြေင်းသွားတာ ကို တွေ့ရပါမယ်။

ကဲ ဒီလောက်ဆိုရင် Real World မှာ DevOps တစ်ယောက်အနေနဲ့ AWS CodePipeline ကို အသုံးပြုပီး ဘယ်လိုတွေ Business ကို delivery လုပ်လဲဆိုတာ မြင်ပီလို့ ယုံကြည် ပါတယ်။ Lab စမ်းရင်း အဆင်မပြေတဲ့ နေရာမျိုးရှိရင် လာရောက်မေးမြန်းနိုင်ပါတယ်။ ကျွန်တော့ ဘက်က အမှားမျိုး ၊ လိုအပ်ချက် နေရာမျိုး တွေ ရှိရင်လည်း ဝေဖန် ထောက်ပြပေးကျပါအုံး။ အခု Lab လေးကနေ တစ်ခုခု ရသွားမယ်လို့ မျှော်လင့် ပါတယ်ခင်ဗျာ။

1
Subscribe to my newsletter

Read articles from Zin Lin Htet directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Zin Lin Htet
Zin Lin Htet

I'm Zin Lin Htet. Who love to learn and share about Linux, Cloud, Docker and K8s. Currently working as a DevOps Engineer at one of the famous Fintech Company in Myanmar.