MY FIRST EXPERIENCE WITH AWS EC2
Md Sinikdhoআজকে আমি AWS-এর EC2-তে আমার জীবনের প্রথম Experience কেমন ছিল, সেটা বিস্তারিত বলবো।

প্রথমে আমি Ubuntu Operating System-এর একটি EC2 (Elastic Compute Cloud) Instance তৈরি করি। এরপর SSH দিয়ে নিজের Computer-এর Terminal থেকে সেই Server-এ Login করি।
সত্যি বলতে, প্রথমবার নিজের Computer থেকে একটা Remote Server-এ Login করার সেই Feeling-টা অন্যরকম ছিল। এটা আসলে বোঝানোর মতো না! 🤯😁
এরপর প্রথম কাজ হিসেবে Server-এর Package List Update করে নিলাম।
Command 01 — Package Update
sudo apt update
sudo apt upgrade -y
এই Command দুটো দিয়ে Server-এর Package এবং Softwareগুলো Update করে নিলাম।
এরপর আমার JavaScript Application Run করার জন্য Node.js Runtime Install করার পালা।
Command 02 — Node.js Install
এখানে Node.js Install করার জন্য আমি NodeSource-এর মাধ্যমে Node.js Setup করে নিয়েছিলাম।
এরপর Node.js ঠিকভাবে Install হয়েছে কিনা Check করে নিলাম:
node -v
npm -v
Node.js Install হয়ে গেল। এবার আমার Project Clone করে Build করার পালা। 🥲
প্রথমে Server-এ Git আছে কিনা Check করে নিলাম।
Command 03 — Git Check
git --version
দেখলাম Git আগে থেকেই Install করা আছে। যাইহোক, অনেক ভালো! 😁
এবার আসল সমস্যা।
আমার Project GitHub-এ আছে, তাও আবার Private Repository। এখন এটা Server-এ Clone করবো কীভাবে? 🙂
Private Repository Clone করার জন্য GitHub থেকে Authentication সেটআপ করতে হবে। আমি Personal Access Token (PAT) তৈরি করে নিলাম।
GitHub Account → Settings → Developer settings → Personal access tokens → Tokens (classic)
Token তৈরি করার পর Repository Clone করলাম।
Command 04 — Repository Clone
git clone https://github.com/USERNAME/REPOSITORY.git
Clone হয়ে গেলে Project Directory-তে ঢুকে গেলাম।
cd PROJECT_NAME
এরপর আমার .env File তৈরি করার পালা।
Command 05 — Environment File
nano .env
Terminal-এর মধ্যেই একটা Editor Open হলো। সেখানে আমার Project-এর প্রয়োজনীয় Environment Variablesগুলো Paste করলাম।
Save করার জন্য:
Ctrl + O → Enter
এরপর বের হওয়ার জন্য:
Ctrl + X
সবকিছু ঠিকঠাক। এবার Dependency Install করে Project Build করার পালা।
Command 06 — Dependency Install
npm install
এরপর:
Command 07 — Production Build
npm run build
কিন্তু এখানেই পেলাম প্রথম বড় Error! 😭
Build হতে হতে কিছুক্ষণ পর দেখি Process Killed হয়ে গেছে।
এর কারণ খুঁজতে গিয়ে বুঝলাম, ছোট EC2 Instance-এ RAM খুবই সীমিত থাকে। আর Next.js Project যখন Production Build তৈরি করে, তখন Build Process-এর সময় বেশ ভালো পরিমাণ Memory প্রয়োজন হতে পারে।
RAM শেষ হয়ে গেলে Linux Server কোনো Process Kill করে দিতে পারে।
এখন উপায় কী?
উপায় হচ্ছে Swap Memory তৈরি করা।
মানে RAM-এর পাশাপাশি Disk-এর কিছু জায়গাকে Virtual Memory হিসেবে ব্যবহার করবো।
Command 08 — Swap Memory তৈরি
প্রথমে 2GB-এর একটি Swap File তৈরি করলাম:
sudo fallocate -l 2G /swapfile
এরপর File-এর Permission ঠিক করলাম:
sudo chmod 600 /swapfile
তারপর Swap তৈরি করলাম:
sudo mkswap /swapfile
এবার Swap Enable করলাম:
sudo swapon /swapfile
সব ঠিকভাবে কাজ করছে কিনা Check করলাম:
free -h
Swap দেখা যাচ্ছে। এবার আবার Build দিলাম:
npm run build
এবার আলহামদুলিল্লাহ, Build Successfully Complete হলো! 😁
কিন্তু একটা সমস্যা এখনো আছে।
আমরা যদি Terminal বন্ধ করে দিই বা Server Restart হয়, তাহলে Application-টা কীভাবে সবসময় চালু থাকবে?
এজন্য ব্যবহার করলাম PM2।
Command 09 — PM2 Install
sudo npm install -g pm2
PM2 Install হয়ে গেলে আমার Next.js Application Start করলাম:
Command 10 — Application Start
pm2 start npm --name "sellinfinity" -- start
তারপর Process Save করে দিলাম:
pm2 save
Server Restart হলেও যাতে PM2 Automatically Start হয়, এজন্য:
pm2 startup
PM2 যে Command দেখাবে, সেটা Copy করে Run করে দিলাম।
বাহ! এটাও Done। 😁
কিন্তু এখনো একটা সমস্যা।
আমার Website Server-এর localhost-এ চলছে। অর্থাৎ বাইরে থেকে কেউ সরাসরি Website-এ Visit করতে পারছে না।
এখন এটাকে Public করার পালা।
এজন্য ব্যবহার করলাম Nginx।
Nginx আমাদের Server-এর Incoming Request গ্রহণ করে সেই Request-কে Application-এর Port 3000-এর দিকে Proxy করবে।
প্রথমে Nginx Install করলাম।
Command 11 — Nginx Install
sudo apt install nginx -y
এরপর Nginx-এর Default Configuration File Open করলাম:
Command 12 — Nginx Configuration
sudo nano /etc/nginx/sites-available/default
server {
listen 80;
server_name 51.21.135.253;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}এখানে আমার প্রয়োজনীয় Reverse Proxy Configuration বসিয়ে দিলাম।
তারপর Configuration ঠিক আছে কিনা Test করলাম:
Command 13 — Nginx Configuration Test
sudo nginx -t
সব ঠিক থাকলে Nginx Restart করলাম:
Command 14 — Nginx Restart
sudo systemctl restart nginx
এরপর Browser থেকে Server-এর Public IP Address-এ Visit করলাম।
আলহামদুলিল্লাহ! 😁
Server IP দিয়ে Visit করতেই আমার Website চলে আসলো।
সত্যি বলতে, এই মুহূর্তটাও অনেক ভালো লাগার ছিল। নিজের হাতে একটা EC2 Server Setup করে সেখানে নিজের Project Deploy করেছি!
কিন্তু এবার নতুন একটা প্রশ্ন।
আমি যদি Website-এ কোনো Update করি, তাহলে কি প্রতিবার Server-এ গিয়ে আবার git pull, npm install, npm run build, pm2 restart করতে হবে? 🙂
অবশ্যই না।
এবার আসলো GitHub Actions-এর পালা।
আমি চাই, GitHub Repository-এর main Branch-এ Code Push করার সাথে সাথে Server Automatically Update এবং Redeploy হয়ে যাক।
এর জন্য প্রথমে GitHub Repository-এর:
Settings → Secrets and variables → Actions
এ গিয়ে প্রয়োজনীয় Repository Secrets Add করলাম।
যেমন:
HOST
USERNAME
SSH_PRIVATE_KEY
এরপর Project-এর ভিতরে GitHub Actions-এর জন্য Workflow File তৈরি করলাম।
Command 15 — Workflow Folder
mkdir -p .github/workflows
এরপর deploy.yml নামে File তৈরি করলাম:
nano .github/workflows/deploy.yml
এখানে আমার Deployment Workflow লিখলাম:
name: Deploy to EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd ~/Myproject
git pull origin main
npm install
npm run build
pm2 restart Myproject
এখন থেকে আমি যখন main Branch-এ নতুন Code Push করবো, GitHub Actions Automatically আমার EC2 Server-এ SSH করবে।
তারপর Repository থেকে Latest Code Pull করবে, Dependency Install করবে, নতুন করে Build করবে এবং সবশেষে PM2 Restart করবে।
এরপর আমার Domain-টাও Cloudflare-এর মাধ্যমে EC2 Server-এর সাথে Connect করে নিলাম।
এই ছিল AWS EC2 নিয়ে আমার জীবনের প্রথম Experience।
শুরুতে শুধু একটা Server Create করা দিয়ে শুরু করেছিলাম।
এরপর SSH, Linux Command, Git, Private Repository, .env, Node.js, Swap Memory, PM2, Nginx এবং GitHub Actions—একটার পর একটা বিষয় হাতে-কলমে শেখা হয়ে গেল।
নিজের একটা Real Project Deploy করতে গিয়ে একটার পর একটা Problem সামনে এসেছে, আর সেই Problem Solve করতে গিয়েই বিষয়গুলো ভালোভাবে বুঝতে পেরেছি।
এটাই ছিল আমার AWS EC2-তে প্রথম Experience। ❤️
মন্তব্যসমূহ (0)
মন্তব্য করতে লগইন করুন
Login to Comment