Creating Custom AMI using EC2 Image Builder

Search for a command to run...

No comments yet. Be the first to comment.
ဒီ post လေးထဲမှာတော့ Regional NAT Gateway နဲ့ Zonal NAT Gateway ကွာခြားချက်တွေကို နှိုင်းယှဉ်ပြသွားမှာဘဲ ဖြစ်ပါတယ်။ ပထဆုံးအနေနဲ့ NAT Gateway ဆိုတာ ဘာလဲ ဘာအတွက် လိုအပ်တာလဲဆိုတာကို အရင်ပြောပြပေးပါမယ်။ P

High Level ရေးထားတာပါ ဒါပေမဲ့ လွယ်ပါတယ် ကိုယ့်မှာ AWS Infra တွေရှိတယ်ဆို တွေ့သမျှ metric တွေကို alarms တွေလုပ်ပြီး notification ယူမနေဘဲ တကယ် effective ဖြစ်တဲ့ metric တွေကိုမှ CloudWatch ရဲ့ alarm feature တွေနဲ့ ပေါင်းပြီး ပို့စေချင်ပါတယ်။ ဥပမာ prod...

ကိုယ့်ရဲ့ data center (on-prem) network နဲ့ AWS ချိတ်ဆက်ဖို့ လိုလာပြီဆိုရင် ဘယ်လို ချိတ်ဆက်ကြမလဲ? အပိုင်း (၂) မှာ တော့ Direct connect အကြောင်းကို ဆွေးနွေး သွားမှာ ဖြစ်ပါတယ်။ အပိုင်း (၁) Site-to-site VPN အကြောင်းကို လေ့လာချင်ရင်တော့ အောက်ပါ link မှာ ...

ကိုယ့်ရဲ့ data center (on-prem) network နဲ့ AWS ချိတ်ဆက်ဖို့ လိုလာပြီဆိုရင် ချိတ်ဆက်နိုင်တဲ့ နည်း (၂) နည်း ရှိပါတယ်။ 1. Site-to-Site VPN (Virtual Private Network) 2. Direct connect Site-to-Site VPN - On-prem network နဲ့ AWS resources တွေ ချိတ်ဆက်တဲ့...

လွန်ခဲ့တဲ့အပတ်က ရုံးက Designer တွေနဲ့ တော်ကီပွားရင်း Accessibility နဲ့ပတ်သတ်တာတွေ သူတို့ကို ရှင်းပြဖြစ်တယ်။ ကိုယ်တိုင်ကလည်း အရင်ကတည်းက ဒီ topic ကိုစိတ်ဝင်စားလို့ လေ့လာနေတာဆိုတော့ အခွင့်အရေးရရင် ရသလို sharing လုပ်ဖြစ်တယ်။ အဓိကက Accessibility နဲ့ပတ်သတ်...

EC2 AMI တစ်ခုကို manual ပြုလုပ်တဲ့အခါမှာ Creating, Custimizing, testing and Deploying အစရှိတဲ့ အဆင့်ဆင့်ကို ကျော်ဖြတ်ရပါတယ်။ ဒီလိုအဆင့်ဆင့် ပြုလုပ်ထားပြီးသား image တစ်ခုကို တစ်ခုခု update လုပ်စရာရှိတိုင်းမှာ ဒီအဆင့်တွေကို အကုန် ပြန်လုပ်ဖို့ အချိန်တွေ အများကြီးပေးရပါတယ်။ ဒီလို လုပ်ပြီးသားအလုပ်တွေကို အကြိမ်အကြိမ်ပြန်လုပ်ရတဲ့ ဒုက္ခတွေ ကင်းဝေးချင်ရင်တော့ EC2 Image Builder ကို အသုံးပြုလို့ရပါတယ်။

EC2 Image Builder ရဲ့ image pipeline ထဲမှာ ဒီအဆင့်တွေအကုန်ပါဝင်ပြီးတော့ တစ်ကြိမ် တည်ဆောက်ထားလိုက်တာနဲ့ အကြိမ်ကြိမ်ပြန်အသုံးပြုလို့ရနိုင်ပါတယ်။ ကုန်ကျစရိတ်အနေနဲ့လည်း သူ့အတွက်သီးသန့်ပေးစရာမလိုပါဘူး၊ pipeline run တဲ့အချိန်မှာ အသုံးပြုသွားတဲ့ resource တွေအတွက် ကုန်ကျစရိတ်နဲ့ image တွေသိမ်းတဲ့အတွက် ကုန်ကျစရိတ်လောက်ပဲပေးရတာဖြစ်ပါတယ်။ automation နဲ့ လိုအပ်တဲ့ stage တွေကို run သွားတာက manual လုပ်တာထက် ပိုမြန်တာကြောင့် manual create လုပ်တာထက်တောင် ကုန်ကျစားရိတ် သက်သာနိုင်ပါသေးတယ်။
ကျွန်တော်တို့ EC2 Image Builder စမ်းကြည့်ဖို့အတွက် Larvel application တစ်ခု deploy ဖို့ လိုအပ်တဲ့ package တွေ ပါဝင်ပြီးသား ubuntu image တစ်ခုလောက် စမ်းပြီးလုပ်ကြည့်ကြရအောင်။
အရင်ဆုံး Image Builder အတွက် လိုအပ်တဲ့ permission တွေ ပါဝင်တဲ့ IAM Role တစ်ခု create လုပ်ဖို့လိုပါတယ်။ Role Name ကို EC2ImageBuilderRole လို့ပေးပြီး သူ့ထဲမှာ လိုအပ်တဲ့ Permission တွေဖြစ်တဲ့ AmazonS3ReadOnlyAccess, AmazonSSMManagedInstanceCore, EC2InstanceProfileForImageBuilder တို့ကို attach တွဲပေးလိုက်ပါ။

Permission တွေ တွဲထားပေးပြီးသား EC2ImageBuilderRole ကို ပြန်ဖွင့်ကြည့်မယ်ဆိုရင် ဒီအောက်ကပုံထဲကလိုလေး မြင်ရပါမယ်။

ပြီးရင်တော့ Image Builder Pipeline ထဲမှာ အသုံးပြုဖို့ SNS Topic တစ်ခု create လုပ်ပြီး ကျွန်တော့ရဲ့အီးမေးနဲ့ subscribe လုပ်ထားလိုက်ပါတယ်။

S3 Bucket အသစ်တစ်ခုလုပ်ပြီး ကျွန်တော်တို့ရဲ့ AMI ထဲမှာ လိုအပ်တဲ့ setup တွေ run ဖို့ လိုအပ်တဲ့ script ကို အဲ့ဒီ Bucket ထဲတင်ပေးထားလိုက်ပါမယ်။
ကျွန်တော်ကတော့ Bucket name ကို kalaung-ami-builder လို့ပေးပြီး Script file name ကို amiBuilderScript.sh လို့ပေးပြီး ဖိုင်ထဲမှာ အောက်က script တွေကို ထည့်ပေးလိုက်ပါတယ်။
# Update the system
sudo apt update -y &&
# Install PHP 8.1
sudo apt install software-properties-common -y &&
sudo add-apt-repository ppa:ondrej/php -y &&
sudo apt update -y &&
sudo apt install php8.1 php8.1-fpm php8.1-mysql php8.1-xml php8.1-mbstring php8.1-gd php8.1-curl php8.1-zip php8.1-imagick php8.1-redis php8.1-bcmath php8.1-exif php8.1-ctype php8.1-fileinfo php8.1-tokenizer php8.1-xml -y &&
sudo systemctl enable --now php8.1-fpm &&
# Install Composer
curl -sS https://getcomposer.org/installer -o composer-setup.php &&
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer &&
rm composer-setup.php &&
# Install Nginx
sudo apt install nginx -y &&
sudo systemctl enable --now nginx &&
# Install Node.js
curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash - &&
sudo apt install -y nodejs &&
sudo apt install -y build-essential &&
sudo npm install -g npm@latest &&
# Add the ubuntu user to the www-data group
sudo usermod -aG www-data ubuntu &&
# Install Supervisor
sudo apt install supervisor -y &&
sudo systemctl enable --now supervisor &&
# Over write the default Nginx Welcome page
sudo rm /var/www/html/*.html &&
echo "<!doctype html><html><body><h1>This Server is running PHP 8.1, Node.js 20.x, Nginx, and Supervisor on Ubuntu 22.04 </h1></body></html>" > index.html &&
sudo mv index.html /var/www/html/index.html
ပြီးရင်တော့ ကျွန်တော်တို့ရဲ့ Script file လေးကို bucket အသစ်လေးထဲ upload တင်ပေးလိုက်ပါမယ်။

လိုအပ်တာတွေပြင်ဆင်ပြီးပြီဆိုတော့ ကျွန်တော်တို့ EC2 Image Builder Console ထဲမှာ တဆင့်ခြင်း Setup လုပ်လို့ပါပြီ။
Image Builder Component ကို crteate လုပ်ဖို့ Crteate component ကိုနိပ်ပြီး အောက်ကအချက်လေးတွေထည့်ပေးလိုက်ပါ။
Component Type: Build နဲ့ Test နှစ်ခုရှိတဲ့အထဲက Build ကို ရွေးပါမယ်
Component Detail :
Image operating system (OS): Linux
Compatible OS Versions: Ubuntu 22.04
Component version: 1.0.0
Component name: Ubuntu2204-laravel10
Definition document : မှာတော့ Define document content ကိုရွေးပြီး Content ထဲမှာ အောက်က YAML script တွေထည့်ပေးလိုက်ပါမယ်။ YAML content ထဲက kalaung-ami-builder ဆိုတဲ့ နေရာမှာတော့ ကိုယ့်ရဲ့ s3 bucket name ကို ထည့်ပေးဖို့လိုပါမယ်။
name: EC2ImageBuilder-laravel10
description: 'This Image Builder component will install PHP 8.1, Node.js 20.x, Nginx, and Supervisor on Ubuntu 22.04'
schemaVersion: 1.0
phases:
- name: build
steps:
- name: DownloadScript
action: S3Download
onFailure: Abort
maxAttempts: 3
inputs:
- source: s3://kalaung-ami-builder/amiBuilderScript.sh
destination: /tmp/amiBuilderScript.sh
- name: RunScript
action: ExecuteBash
onFailure: Abort
maxAttempts: 3
inputs:
commands:
- 'chmod +x {{ build.DownloadScript.inputs[0].destination }}'
- 'bash {{ build.DownloadScript.inputs[0].destination }}'
- name: InstanceCleanUp
action: ExecuteBash
onFailure: Abort
maxAttempts: 3
inputs:
commands:
- 'rm {{ build.DownloadScript.inputs[0].destination }}'
ပြီးရင်တော့ အောက်ဆုံးက Create component ဆိုတာကို နှိပ်ပြီး save လိုက်ပါ။ ကိုယ့်ရဲ့ component ကို ပြန်ဖွင့်ကြည့်ရင် အောက်က ပုံထဲကလို ဖြစ်နေရပါမယ်။

နောက်တဆင့်အနေနဲ့ recipe တစ်ခု create လုပ် ဖို့ Image recipes ထဲသွားပြီး Create new recipe ဆိုတာကို နှိပ်ပါမယ်။
Name: UbuntuLaravelRecipe
Version: 1.0.0
Base image: Select managed images
Image Operating System (OS): Ubuntu
Image origin: Quick start (Amazon-managed)
Image name: Ubuntu Server 22 LTS x86
Auto-versioning options: Use latest available OS version
Working directory: /tmp
Components: ထဲက Build components - Ubuntu မှာတော့ ခုဏက ကျွန်တော်တို့ လုပ်ခဲ့တဲ့ component ပြန်ရွေးပေးပြီး Test components - တော့ မထည့်တော့ပါဘူး။

storage မှာတော့ သူ့ default အတိုင်းပဲ ထားပြီး Save ဖို့အတွက် Create recipe ကိုနှိပ်လိုက်ပါမယ်။

လိုအပ်တဲ့ recipe လည်းရှိပြီဆိုတော့ ကျွန်တော်တို့ ImagePipeline create လုပ်လို့ရပါပြီ။
Image pipelines ထဲကိုသွားပြီး Create image pipeline ကိုနှိပ်ပါမယ်။

Pipeline Name နဲ့ Description ပေးပြီးရင် Build schedule မှာ Manual ကိုရွေးပြီး Next နှိပ်ပါမယ်။

Chose recipe မှာ Use existing recipe ကိုရွေးပြီး ကျွန်တော်တို့ ခုဏက လုပ်ထားတဲ့ recipe ကို ရွေးပြီး Next ထပ်နှိပ်ပါမယ်။

ဒီတဆင့်မှာတော့ Default workflows ကိုပဲ ရွေးပြီး Next ထပ်နှိပ်ပါ။


Define infrastructure configuration မှာ Create a new infrastructure ကိုရွေး ပြီး Name တစ်ခုပေးလိုက်ပါ။ ပြီးရင်တော့ Infra setting ထဲက IMA role နဲ့ SNS Topic ကို ကျွန်တော်တို့ ပထမဆုံးလုပ်ခဲ့တာတွေပြန်ရွေးပေးလိုက်ပြီး Instance Type ကိုတော့ t3.medium လောက် ရွေးပေးလိုက်ပါ။

VPC, subnet and security groups ထဲမှာတော့ Default VPC, subnet နဲ့ Default Security group တွေပဲ ရွေးပေးလိုက်ပါ။
ပြီးရင်တော့ Next ထပ်နှိပ်လိုက်ပါ။

Define distribution settings မှာဘာမှ မပြင်ပဲ Next ပဲ နှိပ်လိုက်ရင် Review state ကိုရောက်သွားပါမယ်။
ကိုယ်လုပ်ခဲ့တဲ့ Pipeline ကိုတစ်ချက် review လုပ်ပြီး အဆင်ပြေရင် Create pipeline ကိုနှိပ်ပြီး Save လိုက်လို့ရပါပြီ။

Pipeline လေး create လုပ်တာ success ဖြစ်သွားပြီဆိုရင်တော့ ကိုယ့်ရဲ့ pipeline အသစ်လေးကို ရွေးပြီး Actions ထဲက Run pipeline ဆိုတာကို နှိပ်လိုက်ပါ။
Pipeline Run ပြီးသွားပြီဆိုရင်တော့ Images ထဲကို သွားကြည့်လိုက်ပါ။


Images ထဲရောက်လို့ ကိုယ့်ရဲ့ image/version ကို နှိပ်လိုက်ရင် Building state မှာရှိနေတဲ့ image ကို အပေါ်ပုံထဲကလို မြင်ရမှာ ဖြစ်ပါတယ်။ ဆယ်မိနစ်လောက် စောင့်ပြီး refresh လုပ်လိုက်ရင် Testing stage ကို ရောက်သွားပါလိမ့်မယ်။

ခဏထပ်စောင့်ပြီး refresh လုပ်ကြည့်လို့ Image status က Available ဖြစ်သွားရင်တော့ ကိုယ့်ရဲ့ image လေးကို ထပ်ဖွင့်ကြည့်ပြီး အသုံးပြုဖို့ ready ဖြစ်နေပါပြီ။

SNS topic subscribe လုပ်ထားတဲ့ ကိုယ့်ရဲ့ email ထဲကိုလည်း အောက်ပါပုံထဲကလိုမျိုး notification လေးရောက်နေပါလိမ့်မယ်။

ကျွန်တော်တို့လုပ်ထားတဲ့ Pipeline ထဲက create လုပ်ပေးလိုက်တဲ့ AMI လေး တစ်ကယ် အလုပ်မလုပ်သိချင်ရင်တော့ EC2 Console ထဲမှာ Instance အသစ်တစ်ခု create လုပ်ကြည့်နိုင်ပါတယ်၊ AMI နေရာမှာတော့ MyAMIs >> Ownd By Me ထဲက ကျွန်တော်တို့ရဲ့ UbuntuLaravel AMI လေးကို ရွေးပြီး Lauch လုပ်ကြည့်လိုက်ပါ။
Instance အသစ်လေး ready ဖြစ်လာပြီဆိုရင်တော့ instance အသစ်ရဲ့ public IP ကို browser ကနေဖွင့်ကြည့်လိုက်ရင် အောက်ပါပုံထဲကလိုမျိုးပေါ်နေပါလိမ့်မယ်။

Instance အသစ်ထဲကို SSH နဲ့ဝင်ပြီး စစ်ကြည့်ရင်လည်း ကျွန်တော်တို့ install ထားတဲ့ software တွေရှိနေမှာဖြစ်ပါတယ်။

လုပ်ခဲ့တာတွေကို ပြန်ပြီး အနှစ်ချုပ်ရရင်တော့
IAM Role: Image Builder pipeline run တဲ့အခါ လိုအပ်တဲ့ permision ပေးဖို့သုံးပါတယ်။
SNS Topic: Image Builder pipeline ရဲ့ notification တွေပို့ဖို့ လိုအပ်ပါတယ်။
S3 Bucket: Component ထဲမှာသုံးမဲ့ script ကို host လုပ်ပေးဖို့ပါ။
Component: ကတော့ Build နဲ့ Test Component ဆိုပြီးနှစ်မျိုးရှိပါတယ်၊ သူက image build/test လုပ်ဖို့ configuration document တစ်ခုပါပဲ။ ကျွန်တော်ကတော့ Docker layer နဲ့ အလုပ်လုပ်ပုံခြင်းတူတယ်လို့ ပြောချင်ပါတယ်။ Component တွေက reusable ဖြစ်ပြီး pipeline တစ်ခုမှာ Component အများကြီးထည့်သုံးလို့ရနိုင်ပါတယ်။
Recipe: ကတော့ image build လုပ်ဖို့ instruction တွေကို စုစည်းပေးတာပါ။ recipe ထဲမှာ component တွေနဲ့ သူတို့ရဲ့ configurations တွေပါဝင်ပြီး။ ဘယ် Component ကို execute လုပ်ပြီးရင် ဘယ် Component ကိုဆက် execute လုပ်မယ်ဆိုတာမျိုး စီမံပေးပါတယ်။ Recipe က version support လုပ်ပြီး အခြား aws account တွေကိုလည်း share သုံးလို့ရပါတယ်။
https://catalog.us-east-1.prod.workshops.aws/workshops/d6c7ecdc-c75f-4ad1-910f-fdd994cc4aed/en-US/100-ec2-ib/120-create-ec2-image-builder-pipeline/121-creating-an-image-pipeline
အချိန်ပေးပြီး ဖတ်ရှုပေးတဲ့အတွက် ကျေးဇူးတင်ပါတယ်။