Deploy Web Service Dengan Hapi di Atas EC2 Instance Ubuntu

Web server yang telah dibuat tentu ditujukan agar bisa digunakan banyak orang. Nah, proses deployment atau merilis aplikasi ke server perlu dilakukan agar server dapat diakses secara publik. Dalam teknologi terbaru ada 2 cara setidaknya yang dapat membuat server dapat diakses secara publik, pertama on-premise dan kedua on-cloud. Kalau secara on-premise atau tradisional artinya dibuat seperangkat alat yang memungkinkan server dapat diakses oleh publik. Sedangkan secara on-cloud artinya seperangkat alat tersebut dikelola oleh sebuah perusahaan sehingga tinggal menggunakannya saja. Contoh perusahaan on-cloud adalah AWS atau Amazon Web Service yang menyediakan Elastic Compute Cloud atau EC2.

Elastic Compute Cloud atau EC2 itu merupakan semacam virtual computer atau virtual machine yang dapat diatur spesifikasinya melalui sebuah sistem tanpa harus berupaya dengan perangkat keras. Pada kesempatan ini akan dicoba deployment melalui Amazon Web Service, ikuti langkah di bawah:

  1. Buka halaman aws.amazon.com
  2. Klik create an aws account
  3. Ikuti langkah yang diinstruksikan oleh aws
  4. Patikan telah berhasil membuat sebuah akun lalu sign in sesuai email dan password
Akun tersebut bersifat root user yang artinya dapat mengakses seluruh sumber daya yang ada di AWS. Dalam prakteknya root user hanya digunakan sekali, sehingga dibuat IAM (identity and access management) user yang memiliki batasan tertentu dalam mengakses sumber daya yang ada di AWS. Ikuti langkah di bawah untuk membuat IAM user:

  1. Sign in ke root user
  2. Service > All service > lihat kategori Security, Identity, & Compliance
  3. Pilih menu IAM lalu akan diarahkan ke IAM dashboard
  4. Pada menu sebelah kiri pilih menu Users
  5. Klik tombol Add user
  6. Pada halaman Add user gunakan konfigurasi:
    • User name : <isi dengan username yang Anda inginkan>
    • Access type : AWS Management Console access.
    • Console password : Custom password. Kemudian isi password Anda.
    • Require password reset : uncheck. 
  7. Klik tombol Next permission
  8. Pilih Add user to group > create group
  9. Isi group name dengan Developer dan berikan permission untuk AmazonEC2FullAccess (ceklis)
  10. Klik Create Group
  11. Klik Next:Tags
  12. Saat ini belum perlu menambahkan informasi sehingga bisa langsung klik Next: Review
  13. Tinjau ulang, jika sudah sesuai klik Create user
  14. Download .csv untuk mendapatakan kredensial user baru
  15. Buka berkas tersebut dengan notepad
  16. Untuk dapat login ke IAM user, sign out terlebih dahulu dari user root
  17. Kemudian kunjungi alamat yang ada pada file .csv yang telah di download sebelumnya
  18. Lalu sign in sesuai nama dan password dari IAM user
  19. Pembuatan IAM user sudah berhasil!
Setelah akun terbuat maka sekarang adalah membuat dan menjalankan EC2, ikuti langkah di bawah:
  1. Sign in ke IAM user yang telah dibuat sebelumnya
  2. Pada kolom pencarian ketik EC2 dan tunggu hingga muncul menu EC2
  3. Pada halaman EC2 klik tombol Launch instance > Launch instance
  4. Isikan formulir dengan data di bawah:
    • Name and tags: Web Server
    • Application and OS Images: Ubuntu Server (LTS terbaru) Free tier eligible
    • Instance type: t2.micro (Free tier eligible)
    • Key pair :
      • Create new pair key
      • Key pair name: notes-api-webserver
      • Create key pair
      • Pastikan file notes-api-webserver.pem terunduh
      • Simpan file di dalam folder proyek notes-app-back-end
    • Network setting
      • Klik edit
      • Security group name: app-server-sg
      • Description: Allow custom TCP port 5000
      • Klik Add security group rule (security group rule 2)
        • Type: Custom TCP
        • Port range: 5000
        • Source type: Anywhere
        • Description: Application Port
    • Klik Launch instance
  5. Klik tombol View instances, dan instance berhasil dibuat!
Di bagian network setting dilakukan pengaturan SSH pada security group, ini dilakukan untuk memungkinkan operasi EC2 secara remote. Selain itu web server dapat diakses secara publik dengan membuka TCP port 5000 dan source-nya anywhere. Nah, sekarang akan dicoba untuk mengoperasikan EC2 instance melalui SSH, ikuti langkah di bawah:
  1. Buka halaman EC2
  2. Pilih instance yang baru dibuat
  3. Klik tombol connect
  4. Pilih tab SSH client
  5. Salin perintah yang ada di example dan paste di cmd/powershell/terminal (arahkan ke folder tempat file .pem)
  6. Jika folder masih berada di disk non system (C:\) maka pindahkan ke disk system (C:\)
  7. Jika terjadi error lakukan syntax di bawah:
    • $path = ".\notes-api-webserver.pem"
    • icacls.exe $path /reset
    • icacls.exe $path /GRANT:R "$($env:USERNAME):(R)"
    • icacls.exe $path /inheritance:r
  8. Jika mengalami kendala menggunakan powershell maka bisa digunakan PuTTY, langkahnya:
    • Download PuTTY di https://www.chiark.greenend.org.uk/~sgtatham/putty/
    • Install PuTTY tersebut
    • Buka PuTTYgen dengan konfigurasi:
      • Type of key to generate: RSA
    • Klik tombol Load, jadikan all files dan pilih file .pem yang sebelumnya di download
    • Lalu Save private key, letakkan di folder yang sama dengan file .pem
    • Buka PuTTY, gunakan konfigurasi:
      • Host name (or IP Address) : Private IPv4 addresses atau Public IPv4 DNS pada instace yang dituju
      • Port : 22 (pastikan pada security group di bagian inbound rules sudah dibuat port range 22 dan type SSH)
      • Connection type : SSH
      • Lalu di kolom Category > Connection > Auth > browse file .ppk yang tadi di save dengan PuTTYgen
      • Kembali ke Category > Session > Save session supaya mudah digunakan kembali
    • Klik tombol open
    • Pada login as isi root, tunggu sejenak
    • Sekarang ke halaman EC2 > Instances (yang akan di SSH) > Connect > tab SSH Client
    • Lalu copy text pada bagian example
    • Pada folder projek klik kanan Git Bash Here, paste text pada bagian example
    • SSH berjalan (untuk keluar bisa menggunakan perintah exit)!

Sekarang akan coba dilakukan penggunaaan teknologi git dan github. Git merupakan sebuah sistem yang membantu developer dalam melakukan versioning atau source code management terhadap aplikasi yang dikembangkan, sedangkan github merupakan salah satu vendor yang bergerak di bidang source code hosting menggunakan teknologi git. Ikuti langkah di bawah:

  1. Download git sesuai sistem operasi yang digunakan
  2. Install git yang telah di download, ikuti instruksinya
  3. Pada halaman Choosing the default editor used by Git pilih: Use Visual Studio Code as Git's default editor (untuk yang menggunakan text editor VS Code) > teruskan hingga tombol Install
  4. Buka powerShell atau cmd lalu cek apakah git sudah tersedia dengan syntax git --version
  5. Tetapkan email di git dengan syntax:
    • git config --global user.name "Your Name"
    • git config --global user.email "you@example.com" 
  6. Git siap digunakan!
Sekarang akan digunakan git untuk projek yang telah dibuat sebelumnya, ikuti langkah di bawah:
  1. Buka text editor dan arahkan ke folder projek
  2. Untuk menginisialisasi folder projek ke git gunakan syntax git init
  3. Sekarang teknologi git sudah memantau projek tersebut!
  4. Ada beberapa file yang tidak boleh diakses secara umum, oleh karena itu perlu dilakukan konfigurasi melalui .gitignore:
    • Buat file .gitignore di dalam projek dan isi dengan kode:
      • node_modules
      • notes-api-webserver.pem 
  5. Masukan semua berkas ke stash kecuali yang telah dikonfigurasi di .gitignore dengan syntax git add .
  6. Jika hendak menyimpan perubahan yang sudah dilakukan maka gunakan syntax git commit -m "initial commit"
  7. Local repository sudah berhasil dibuat dan siap di-upload ke github!
Setelah git berhasil dibuat maka akan dilakukan upload repository ke github, ikuti langkah di bawah:
  1. Daftar akun ke github dan lakukan sesuai instruksi di github.com
  2. Buat remote repository di github dengan:
    • Klik icon profile > your repositories > New
    • Beri nama notes-app-back-end
    • Biarkan tetap Public
    • Klik tombol Create repository
  3. Remote repository sudah berhasil dibuat dan siap menerima file dari git!
Setelah local repository terbuat di git dan remote repository terbuat di github maka akan dilakukan penghubungan keduanya, ikuti langkah di bawah:
  1. Pada halaman remote repository copy https yang ada
  2. Lalu pada terminal projek gunakan syntax git remote add origin <https-nya>
  3. Sekarang antara git dan github sudah terhubung!
  4. Untuk melakukan upload file ke github gunakan syntax git push origin master 
  5. Kemudian masukkan username github dan password
  6. Jika terjadi error Authentication failed dan ada perintah Please use a personal access token instead maka gunakan personal access token sebagai password caranya:
    • Klik foto profile > Settings > Developer settings > Personal access tokens
    • Klik tombol Generate new token
    • Buat note repository
    • Expiration cukup 7 hari
    • Ceklis scope repo
    • Klik tombol Generate token
    • Tunggu hingga token muncul dan gunakan sebagai password
  7. Periksa repository, seharusnya sudah berhasil di push!
Sesudah SSH pada EC2 berhasil dan juga repository terbuat di github yang berhubungan dengan git maka akan diunduh repository tersebut ke dalam EC2. Ikuti langkahnya:
  1. Jalankan projek dengan SSH, boleh menggunakan klik kanan git bash
  2. Ke halaman remote repository (github) klik tombol Code dan copy HTTPS-nya
  3. Di git bash yang menjalankan SSH gunakan syntax git clone <remote repository URL>
  4. Untuk memastikan proyek tersimpan di EC2 gunakan syntax ls
  5. Masuk ke folder proyek dengan cd <nama folder>
  6. Lalu untuk melihat isi dalam folder proyek tersebut gunakan syntax ls
  7. Folder proyek sudah berhasil ada di EC2 instance!
Sampai di sini sudah berhasil dilakukan SSH, repository (local dan remote), dan menyimpan folder projek di EC2, sekarang akan dilakukan running dari projek tersebut, ikuti langkah di bawah:
  1. Karena proyek yang dibuat berbasiskan node.js maka lingkungan di EC2 juga akan memerlukan node.js, untuk menghindari bug node.js yang di unggah harus sama versinya, untuk mengecek versi node.js saat ini gunakan syntax node -v di cmd
  2. Pasang tools nvm di EC2 melalui SSH dengan syntax curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
  3. Agar tools nvm dapat digunakan keluar terlebih dahulu dari SSH dengan syntax exit dan masuk kembali
  4. Lalu pasang node.js pada EC2 sesuai versi dengan syntax nvm install <versi nodejs>
  5. Pastikan node.js telah terpasang pada EC2 melalui SSH dengan syntax node -v
  6. Lakukan cd ke foler projek melalui SSH
  7. Jika sudah berhasil maka install seluruh package yang dibutuhkan melalui SSH dengan syntax npm install
  8. Lagi-lagi melalui SSH jalankan proyek dengan syntax npm run start
  9. Jika sudah berhasil coba jalankan di browser <Public IP address yang ada di EC2>:5000
  10. EC2 masih belum bisa diakses oleh publik!
Kegagalan EC2 untuk bisa diakses oleh publik karena tidak bisa menggunakan host dengan nilai localhost saat menjalankan hapi server. Penggunaan IP Address baik yang private maupun yang public tidak disarankan karena alamat tersebut akan berubah-ubah. Nah, sebagai solusinya menggunakan IP dengan nomor 0.0.0.0. Cara mengubahnya ikuti langkah di bawah:
  1. Buka file server.js kemudian ubah host menjadi seperti kode di bawah:
    • const server = Hapi.server({
    •   port: 5000,
    •   host: process.env.NODE_ENV !== 'production' ? 'localhost' : '0.0.0.0',
    •   routes: {
    •     cors: {
    •       origin: ['*'],
    •     },
    •   },
    • });
  2. Edit juga file package.json, perhatikan kode di bawah:
    • "scripts": {
    •   "start-prod": "NODE_ENV=production node ./src/server.js",
    •   "start-dev": "nodemon ./src/server.js",
    •   "lint": "eslint ./src"
    • },
  3. Simpan semua perubahan dan update pada local repository dengan syntax:
    • git add .
    • git commit -m "fix bugs host value"
  4. Kemudian push perubahannya ke remote repository dengan syntax:
    • git push origin master
  5. Kembali ke terminal SSH kemudian update proyek (jangan lupa masuk ke dalam folder proyek) dengan syntax:
    • git pull origin master
  6. Jalankan kembali server dengan syntax:
    • npm run start-prod
  7. Akses server melalui browser dengan menggunakan alamat IP publik beserta port 5000
  8. Server berjalan di EC2 instance secara global!
Sekarang server sudah berhasil dibuat dan bisa diakses secara publik. Untuk memastikan server tersebut berhasil maka coba hubungkan dengan web front-end yang telah dibuat sebelumnya. Kemudian coba jalankan aplikasi yang telah dihubungkan dan pastikan semua berjalan dengan normal. Perlu diperhatikan bahwa selama web server atau front-end tersebut digunakan maka proses node pada EC2 harus tetap berjalan. Jika terjadi proses node terhenti maka ada 2 kemungkinan yaitu tidak sengaja terhenti dan session SSH sudah berakhir. Bila web server berhenti maka otomatis aplikasi client atau front-end akan tidak dapat digunakan. Jika skema yang dilakukan demikian maka akan agak repot untuk memelihara web server atau back-end tetap berjalan, oleh sebab itu ada process manager yang akan menjalankan ulang jika terjadi crash hampir tanpa downtime. Untuk melakukannya ikuti langkah di bawah:
  1. Akses kembali EC2 instace melalui SSH dan install pm2 dengan syntax:
    • npm install -g pm2
  2. Cd ke proyek aplikasi melalui SSH dan jalankan process manager dengan syntax:
    • pm2 start npm --name "notes-api" --  run "start-prod" 
  3. Perintah lain yang dapat digunakan untuk keperluan di process manager:
    • Me-restart proses secara manual gunakan syntax:
      • pm2 restart notes-api
    • Menghentikan proses gunakan syntax:
      • pm2 stop notes-api
    • Menjalankan kembali proses gunakan syntax:
      • pm2 start notes-api
  4. Deploy web service berhasil!

Tampilan process manager adalah sebagai berikut:

Sumber: anonim

Sampai di tahap ini sudah berhasil dilakukan repository (local dan remote), SSH, menyimpan proyek di EC2 instance, dan menjalankan proyek di EC2 instace (nodemon dan process manager).

Perlu diketahui bahwa web memungkinkan terkena serangan siber, oleh karena itu perlu dilakukan pengaturan lebih lanjut, seperti memasang NGINX. Ikuti langkah di bawah:

  1. Buka EC2 instance di AWS dan arahkan ke konsol
  2. Install NGINX, gunakan command di bawah:
    • sudo apt update
    • sudo apt-get install nginx -y
  3. Periksa status NGINX di EC2 instance, gunakan command:
    • sudo systemctl status nginx
  4. Pastikan NGINX dalam keadaan active(running)
  5. Mengonfigurasi NGINX sebagai reserve proxy server
    • Perhatikan file default dengan command
      • cat /etc/nginx/sites-available/default
    • Edit file tersebut
      • sudo nano /etc/nginx/sites-available/default
    • Pada blok server location tambahkan kode di bawah:
      • location / {
      •    proxy_pass http://localhost:4000;
      •    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;

      •    # ...
      • }
    • Lalu hapus kode lain yang berada di dalam blok location / seperti di bawah:
      • try_files $uri $uri/ =404;
    • Kemudian simpan file dengan CTRL+X, tekan Y, lalu enter
  6. Jalankan ulang NGINX server menggunakan command:
    • sudo systemctl restart nginx
  7. Jalankan web server yang sebelumnya dibuat dengan node.js di localhost 4000 pada EC2 instance tersebut
Jadi NGINX dapat digunakan sebagai proxy. Langkah sederhananya buat infrastruktur EC2, kemudian letakkan app yang telah dibuat, coba akses melalui <IP address public EC2>:<port yang digunakan>, kemudian instal NGINX dan lakukan konfigurasi, lalu uji kembali app yang telah dibuat melalui <IP address public EC2> tanpa port akan langsung mengarah ke app yang sudah dibuat.

Hal penting lain untuk mendeploy web adalah menerapkan limit access, perhatikan langkah di bawah:

  1. Pastikan NGINX sudah terinstall:
    • nginx -v
  2. Buka berkas konfigurasi NGINX:
    • sudo nano /etc/nginx/sites-available/default
  3. Dibaris awal atau sebelum blok server tulis kode (30 request per menit):
    • limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
  4. Pada blok location / tambahkan kode di bagian bawahnya:
    • location / {
    •    # ...

    •    limit_req zone=one;
    • }
  5. Jangan lupa simpan file CTRL+X, kemudian Y dan enter
  6. Jalankan ulang NGINX server dengan command:
    • sudo systemctl restart nginx
  7. Jangan lupa pastikan app juga sudah berjalan kembali (misalnya untuk node.js: npm run start)

Penggunaan IP address secara langsung selain tidak aman juga sulit untuk diingat oleh client. Nah, pengubahan domain bisa dilakukan melalui layanan berbayar yang tersedia. Namun, subdomain juga bisa dilakukan. Perhatikan langkah dibawah:

  1. Buka terminal atau command prompt
  2. Gunakan command untuk mendapatkan hostname:
    • curl -X POST -H "Content-type: application/json" -d "{ \"ip\": \"<public IP EC2 instance>\" }" "https://sub.dcdg.xyz/dns/records"
  3. Catat 2 hostname yang berhasil didapatkan, misalnya:
    • itchy-dog-15.a276.dcdg.xyz dan www.itchy-dog-15.a276.dcdg.xyz
  4. Buka konfigurasi NGINX dengan command:
    • sudo nano /etc/nginx/sites-available/default
  5. Pada bagian server_name ubah menjadi misalnya:
    • server_name itchy-dog-15.a276.dcdg.xyz www.itchy-dog-15.a276.dcdg.xyz
  6. Simpan file konfigurasi NGINX dan lakukan restart NGINX dengan:
    • sudo systemctl restart nginx
  7. Jangan lupa pastikan app sudah berjalan (misalnya pada node.js: npm run start)
  8. Gunakan hostame yang tadi untuk membuka di browser, misalnya:
    • itchy-dog-15.a276.dcdg.xyz
Request yang dikirimkan client ke sebuah web server dengan protokol HTTP tidak terenkripsi sehingga serangan siber mungkin saja dilakukan dan berarti penyerang tersebut dapat mengetahui request client terhadap server. Saat request berupa data sensitif maka saat itulah data penting diketahui dan dapat dimanfaatkan untuk tindak kejahatan. Sebagai solusi gunakan protokol TLS sehingga HTTP berubah menjadi HTTPS. Dengan TLS data request akan di-encrypt, namun encrypt ini sifatnya in transit. Perhatikan langkah untuk membuat TLS di bawah:
  1. Buka EC2 instance console
  2. Untuk server NGINX gunakan command di bawah:
    • sudo apt-get update
    • sudo apt-get install python3-cerbot-nginx -y
  3. Buat TLS certificate, misalnya:
    • sudo certbot --nginx -d itchy-dog-15.a276.dcdg.xyz -d www.itchy-dog-15.a276.dcdg.xyz
  4. Selama proses pembuatan sertifikat akan ada pertanyaan:
    • Enter email address: isikan dengan alamat email Anda
    • Terms of Service: A (Agree)
    • Would you be willing to share your email address: N (no)
    • Please choose whether or not to redirect HTTP traffic to HTTPS: 2 (redirect)
  5. Tunggu sampai proses pembuatan sertifikat selesai
  6. Pastikan kembali NGINX dan app sudah berjalan
  7. Buka kembali maka HTTP sudah berubah menjadi HTTPS
Sampai disini sudah dideploy web seperti membuat EC2 instance, menempatkan apps di dalam EC2, membuat proxy dengan NGINX, dan menggunakan protokol TLS untuk menghijrahkan HTTP ke HTTPS.




ref:

https://aws.amazon.com/

Komentar