Home Guide ลองใช้ Amazon Lightsail

ลองใช้ Amazon Lightsail

by khomkrit

ระหว่างหา server สักที่เอาไว้ใช้ deploy Node service และรองรับ https เบาๆ แบบที่เราแทบไม่ต้องลงไม้ลงมือทำอะไรมาก ก็ไปเจอ Amazon Lightsail หลังจากเข้าไปลองเล่นดูสักพักก็พบว่ามันน่าตื่นตาตื่นใจ เพราะเราแทบไม่ต้องออกแรงอะไรมากก็ใช้ได้เลยทันที!

สร้าง Instance

หลังจากเรา login เข้าไปแล้วกด Create Instance เลือก Linux/Unix, Node.js และเลือกตั้งค่าอื่นๆ ตามใจชอบไปเรื่อยๆ จนจบ เราก็จะได้ Instance ที่พร้อมใช้งานแล้ว

กดเลือก instance ที่พึ่งสร้างเสร็จเข้าไป แล้วกดปุ่ม Connect Using SSH เราก็จะได้หน้า Terminal ที่ login เสร็จพร้อมใช้ผ่านเว็บได้เลย โดยเราจะ login มาใน user ชื่อ bitnami

ลองรัน node service

ติดตั้งอาวุธกันก่อน

sudo npm -g install express
sudo npm -g install express-generator

ลองสร้างโปรเจ็คง่ายๆ

express sample-api --view-ejs
cd sample-api
npm install

ถ้าเรารันโปรเจ็คมันจะไปรันที่ port :3000

Bitnami ได้เตรียม Virtual Host ไว้ให้เราแล้ว ให้เราเข้าไป Enable ก่อนโดยการเอา .disabled ออกไปแบบเซฟๆ ด้วยการ duplicate มันเป็นไฟล์ใหม่ที่ไม่มี .disabled ต่อท้าย และ restart Apache หนึ่งครั้ง ดังนี้

sudo cp /opt/bitnami/apache/conf/vhosts/sample-http-vhost.conf.disabled /opt/bitnami/apache/conf/vhosts/sample-http-vhost.conf

sudo cp /opt/bitnami/apache/conf/vhosts/sample-https-vhost.conf.disabled /opt/bitnami/apache/conf/vhosts/sample-https-vhost.conf

sudo /opt/bitnami/ctlscript.sh restart apache

จากนั้นเข้าไปแก้ไฟล์ /opt/bitnami/apache/conf/vhosts/myapp-http-vhost.conf ดังนี้

<VirtualHost _default_:80>
  ServerAlias *
  DocumentRoot "/opt/bitnami/projects/myapp/public"
  <Directory "/opt/bitnami/projects/myapp/public">
    Require all granted
  </Directory>
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
</VirtualHost>

และแก้ไฟล์ /opt/bitnami/apache/conf/vhosts/sample-https-vhost.conf ดังนี้

<VirtualHost 127.0.0.1:443 _default_:443>
  ServerAlias *
  SSLEngine on
  SSLCertificateFile "/opt/bitnami/apache/conf/api.khomkrit.com.crt"
  SSLCertificateKeyFile "/opt/bitnami/apache/conf/api.khomkrit.com.key"
  DocumentRoot /opt/bitnami/projects/sample
  # BEGIN: Configuration for letsencrypt
  Include "/opt/bitnami/apps/letsencrypt/conf/httpd-prefix.conf"
  # END: Configuration for letsencrypt
  # BEGIN: Support domain renewal when using mod_proxy without Location
  <IfModule mod_proxy.c>
    ProxyPass /.well-known !
  </IfModule>
  # END: Support domain renewal when using mod_proxy without Location
  <Directory "/opt/bitnami/projects/sample">
    Options -Indexes +FollowSymLinks -MultiViews
    AllowOverride All
    Require all granted
  </Directory>
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
  # BEGIN: Support domain renewal when using mod_proxy within Location
  <Location /.well-known>
    <IfModule mod_proxy.c>
ProxyPass !
    </IfModule>
  </Location>
  # END: Support domain renewal when using mod_proxy within Location
</VirtualHost>

ต่อด้วย restart Apache

sudo /opt/bitnami/ctlscript.sh restart apache

รันโปรเจ็ค

DEBUG=sample-api:* npm start

และลอง browse ไปที่ public IP ของ instance เราก็จะเห็นหน้า page ของโปรเจ็คแล้ว และดูที่ console ก็พบว่าทุกอย่างดูเวิร์คดี

> sample-api@0.0.0 start /home/bitnami/sample-api
> node ./bin/www

  sample-api:server Listening on port 3000 +0ms
GET / 200 174.294 ms - 170
GET /stylesheets/style.css 200 3.612 ms - 111
GET /stylesheets/style.css 200 0.549 ms - 111
GET /favicon.ico 404 12.171 ms - 1062

ทำให้รองรับ HTTPS แบบอัตโนมัติ

เราจะใช้ใบรับรองจาก Let’s Encrypt แต่ก่อนอื่น เราต้อง map domain name ให้ชี้มายัง instance ของเราก่อน กรณีนี้ผมใช้ api.khomkrit.com

ให้รันคำสั่งนี้ แล้วทำตามขั้นตอนไปเรื่อยๆ จนจบ

sudo /opt/bitnami/bncert-tool

จบ

จบแล้วครับ เนื้อหาหลังจากนี้ไม่ต้องทำ ผมแค่ต้องการแชร์วิธีการขอใบรับรองโดยใช้ certbot

TIP

เราสามารถรัน service ผ่าน forever ได้ เช่น

forever start bin/www

ทำให้รองรับ HTTPS แบบต้องออกแรงเอง

เหมือนเดิมครับ เราจะใช้ใบรับรองจาก Let’s Encrypt แต่ก่อนอื่น เราต้อง map domain name ให้ชี้มายัง instance ของเราก่อน กรณีนี้ผมใช้ api.khomkrit.com

จากนั้นติดตั้ง certbot และใช้ certbot ขอใบรับรอง ระหว่างนั้นก็ทำตามที่มันถามไปเรื่อยๆ จนมาถึงขึ้นตอนที่ให้เรากรอก domain name ก็ให้กรอกไป กรณีนี้ของผมก็จะเป็น api.khomkrit.com

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
certbot certonly --manual
.
.
.
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel):

จากนั้น certbot จะช่วยสร้างใบรับรองให้เรา รอสักพัก รอสักพักเราจะได้ <รหัสที่เป็นความลับ> และ <ชื่อไฟล์ที่เป็นความลับ> มาดังที่แสดงให้ดูด้านล่าง ถึงตรงนี้ ให้เปิด Terminal ทิ้งไว้แบบนี้ไปก่อน

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

<รหัสที่เป็นความลับ>

And make it available on your web server at this URL:

http://api.khomkrit.com/.well-known/acme-challenge/<ชื่อไฟล์ที่เป็นความลับ>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

เปิด public/ directory ใน node application แล้ววางไฟล์นี้ลงไป public/.well-known/acme-challenge/<ชื่อไฟล์ที่เป็นความลับ> โดยเนื้อหาในไฟล์นั้นก็คือ <รหัสที่เป็นความลับ> ที่เราได้มา

เสร็จแล้วกลับมาที่ Terminal แล้วกด Enter ได้เลย

จากนั้นเข้าไปแก้ไขไฟล์ /opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf ให้อ้างถึง key ที่เราได้จาก Let’s Encrypt

SSLEngine on

ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/

SSLCertificateFile /etc/letsencrypt/live/api.khomkrit.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/api.khomkrit.com/privkey.pem

จากนั้นลองเรียกเว็บของเราด้วย https ก็จะได้แล้ว

ถ้าเราต้องการบังคับให้ forward http request ไป https เสมอก็เข้าไปแก้ไฟล์ /opt/bitnami/apache2/conf/httpd.conf โดยเพิ่ม config นี้ลงไป

<VirtualHost *:80>
   ServerName api.khomkrit.com
   Redirect permanent / https://api.khomkrit.com/
</VirtualHost>

สรุปขั้นตอน

  1. สร้าง instance ใน Lightsail โดยการคลิ๊กแค่ไม่กี่ครั้ง
  2. เอา node project ไปวางไว้ในที่ที่ต้องการ จากนั้นก็รัน
  3. แก้ Proxy ให้ชี้มายัง node service
  4. map domain name ให้ชี้มายัง instance แล้วรัน /opt/bitnami/bncert-tool

Reference

Get Started with Node.js

You may also like