[Update] ทดลองเริ่มต้นใช้งาน Sample Elastic Beanstalk ด้วย PHP

เราสามารถเลือกใช้ Platform ที่เหมาะสมกับงานที่เราจะ Deploy ได้ใน AWS Elastic Beanstalk ในตัวอย่างนี้จะมาแนะนำการใช้งาน Elastic Beanstalk เบื้องต้นแบบง่ายๆ โดยมีคำอธิบายและปฏิบัติจริง

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

AWS Elastic Beanstalk คืออะไร

AWS Elastic Beanstalk เป็นบริการที่ให้เราสามารถดำเนินการและจัดการการโฮสต์แอปพลิเคชันแบบ Scale ได้อย่างง่ายดายบน AWS โดยไม่ต้องกังวลเรื่องการจัดการระบบพื้นฐาน เช่น เซิร์ฟเวอร์, เครือข่าย, หรือฐานข้อมูล เนื่องจาก AWS Elastic Beanstalk จะดูแลส่วนนี้ให้ในอัตราค่าบริการที่คงที่หรือตามการใช้บริการจริงของเรา

เป้าหมาย

ครั้งนี้ผมจะมาทดลองใช้งาน Sample Elastic Beanstalk ด้วย PHP โดยสร้าง Application และ Environment ใน Elastic Beanstalk ตามองค์ประกอบหลักด้านล่างนี้ครับ

องค์ประกอบหลัก

มีสององค์ประกอบใหญ่ๆที่ประกอบเป็น Elastic Beanstalk คือ "Environment" และ "Application" โดยมีความเกี่ยวข้องกันตามแผนภาพด้านล่างคือ จะมี "Application" เป็นหัวข้อหลัก แล้วในแต่ละ "Application" จะมี "Environment" อยู่

หน้าที่ของ "Application" คือ การอัพโหลดหรือควบคุมแอปพลิเคชันที่สร้างขึ้น
หน้าที่ของ "Environment" คือ กำหนดสภาพแวดล้อมที่แอปพลิเคชันที่ทำงานจริง

อ่านรายละเอียดเพิ่มเติมได้ที่ลิงก์ด้านล่างนี้

สร้าง Key Pairs

สร้าง Key Pair ไว้ใช้สำหรับ AWS Elastic Beanstalk

ดูตัวอย่างที่นี่: การ Create Key Pair

ตัวอย่างตั้งค่าการสร้าง Key Pairs ในบทความนี้

※Create Key pairs
Name: tinnakorn-eb-test (ป้อนชื่อที่ต้องการ)
Private key file format: .ppk

สร้าง Service role และ Instance profile ที่ใช้สำหรับ Elastic Beanstalk ใน IAM

ก่อนสร้าง Environment จำเป็นต้องสร้าง Service role และ Instance profile ใน IAM Role เตรียมไว้ โดยแนะนำให้กำหนดชื่อและ Permissions ตาม Documentation ของ AWS ดังนี้

IAM Role Name Permissions
aws-elasticbeanstalk-service-role AWSElasticBeanstalkEnhancedHealth
AWSElasticBeanstalkService
aws-elasticbeanstalk-ec2-role AWSElasticBeanstalkWebTier
AWSElasticBeanstalkWorkerTier
AWSElasticBeanstalkMulticontainerDocker

ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้

สร้าง Application

ค้นหาและเลือก Elastic Beanstalk

เลือก Applications จากเมนูด้านซ้าย

คลิก Create application ด้านขวา

หัวข้อ Application information
・Application name: tinnakorn-eb-test (ป้อนชื่อที่ต้องการ)
แล้วคลิก Create

แล้วจะแสดงหน้าจอแบบนี้

สร้าง Environment ใน Application

คลิก Create new environment

Step 1: Configure environment

หัวข้อ Environment tier
Web server environment (ค่าเริ่มต้น)

หัวข้อ Environment information
ป้อนชื่อที่ต้องการ แต่ตัวอย่างนี้จะใช้ชื่อตามที่ระบบจัดการให้
・Environment name: Tinnakorn-eb-test-env (ค่าเริ่มต้น)
・Domain: Tinnakorn-eb-test-env
・คลิก Check availability

หัวข้อ Platform
AWS Elastic Beanstalk มี Platform ที่รองรับดังนี้:

  • .NET Core on Linux
  • .NET on Windows Server
  • Docker
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
  • Tomcat

การตั้งค่าหัวข้อ Platform คือ
・Platform: PHP
・Platform branch: ระบบเลือกให้อัตโนมัติ
・Platform version: ระบบเลือกให้อัตโนมัติ (มีการอัปเดตเวอร์ชันใหม่เรื่อยๆ แนะนำให้ใช้เวอร์ชันที่มี (Recommended))

หัวข้อ Application code และ Presets จะใช้เป็นค่าเริ่มต้น เมื่อตั้งค่าหน้านี้เสร็จแล้วคลิก Next

Step 2: Configure service access

หัวข้อ Service access
・Service role: Use an existing service role
Existing service roles: aws-elasticbeanstalk-service-role (ระบบเลือกให้ตามที่สร้างตอนแรก)
EC2 key pair: tinnakorn-eb-test (Key Pair ที่สร้างก่อนหน้านี้)
EC2 instance profile: aws-elasticbeanstalk-ec2-role (ระบบเลือกให้ตามที่สร้างตอนแรก)
・คลิก Next

หมายเหตุ: หากไม่สร้าง IAM Role สำหรับ Service role และ EC2 instance profile เตรียมไว้ ระบบจะไม่เลือกให้อัตโนมัติ

Step 3 - optional: Set up networking, database, and tags

Step นี้ระบุว่า "optional" จึงไม่จำเป็นต้องตั้งค่าอะไร เพราะเป็นการทดสอบการใช้งาน ให้คลิก Next ได้เลย

Step 4 - optional: Configure instance traffic and scaling

Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้

หัวข้อ Instances
Root volume (boot device):
・Root volume type: General Purpose (SSD)
・Size: 10 GB (ขั้นต่ำคือ 10 GB)

หัวข้อ Capacity
・Instance types: t3a.nano

แล้วคลิก Next

Step 5 - optional: Configure updates, monitoring, and logging

Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้

หัวข้อ Managed platform updates
・Managed updates: ▢ Activated (ติ๊ก ✅ ออกเพื่อไม่ให้อัปเดต)
แล้วคลิก Next ด้านล่างสุด

หากต้องการอัปเดต OS โดยอัตโนมัติ ให้ติ๊ก ✅ และเมื่อมีการอัปเดต Instance จะรีสตาร์ทโดยอัตโนมัติ ซึ่งการรีสตาร์ท Instance หรือการอัปเดต OS อาจทำให้เกิดปัญหา เช่น บริการหยุดทำงานระหว่างการดำเนินการ แล้วในกรณีที่ติ๊ก ✅ นี้ จำเป็นต้องยืนยันว่าบริการยังทำงานตามปกติระหว่างการดำเนินการหรือไม่ หากมีความกังวล เราขอแนะนำว่าไม่ต้องไปติ๊ก ✅ ครับ

Step 6: Review

ตรวจสอบการตั้งค่าตั้งแต่ "Step 1 - Step 5" แล้วคลิก Submit ด้านล่างสุด แล้วรอสักครู่

ตรวจสอบหน้าเว็บไซต์

เมื่อระบบเริ่มต้นเสร็จแล้วจะแสดงหน้าจอแบบนี้ แล้วคลิกลิงก์ Domain

แล้วจะแสดงหน้าจอเว็บไซต์แบบนี้

ตรวจสอบ Events

เลือก Events จากเมนูด้านซ้าย ก็จะสามารถตรวจสอบข้อมูลการดำเนินการต่างๆ ได้ เช่น "Successfully launched environment: [your_name]-eb-test-env (สร้าง Environment เสร็จแล้ว)"

ตรวจสอบ Monitoring

เลือก Monitoring จากเมนูด้านซ้าย ก็จะสามารถตรวจสอบ Monitoring ได้ที่หน้าจอนี้

เชื่อมต่อกับ Instance ที่สร้างโดย Elastic Beanstalk จาก PuTTY

สิ่งที่จะทำในขั้นตอนนี้คือ:

ตรวจสอบ Instance ID จาก Health

เลือก Health จากเมนูด้านซ้าย แล้วคลิก Instance ID

ก็จะสามารถดู Instance ID แบบนี้ได้ด้วย และในกรณีที่ Instance ใน EC2 มีเยอะ เราสามารถคัดลอก Instance ID นี้ไปค้นหาอันที่เป็นของเราได้ ซึ่งจะอธิบายในขั้นตอนถัดไป

ตรวจสอบ IP Address จาก EC2

เราจะมาตรวจสอบ IP Address จากหน้าจอคอนโซล Instance ใน EC2 เพื่อคัดลอก IP Address ไปใช้ในการ Login จากโปรแกรม PuTTY

มาที่หน้าจอคอนโซล Instance แล้ววาง Instance ID ที่คัดลอกมาเมื่อสักครู่นี้ลงในช่อง FInd Instance by... + Enter
แล้ว Instance ของเราที่ถูกสร้างจาก Elastic Beanstalk จะแสดงขึ้นมา แล้วคลิก Instance ID ของเรา

แล้วจะแสดงหน้าจอแบบนี้ ให้คลิก Public IPv4 address คัดลอกเตรียมไว้เพื่อนำไปใช้เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY ในขั้นตอนถัดไปครับ (บันทึก Public IPv4 address เตรียมไว้เพื่อใช้เทียบกับ Instance ตัวใหม่ในขั้นตอนสุดท้าย โดยจะอธิบายในขั้นตอน ทดสอบ Shutdown Instance)

เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY

ตั้งค่าการเชื่อมต่อกับ Instance ในโปรแกรม PuTTY ตามด้านล่างนี้

ดูตัวอย่างที่นี่: การเชื่อมต่อกับ EC2 Instance ด้วย PuTTY

・Session
Host Name: Your Public IPv4 address (IPv4 address ของ Instance)
Saved Sessions: tinnakorn-eb-test (ป้อนชื่อที่ต้องการ)

・Connection
Seconds between keepalives (0 to turn off): 60

・Connection → Data
Auto-login username: ec2-user (บังคับให้ใส่ตามนี้เพราะ AMI เป็น Amazon Linux)

・Connection → SSH → Auth → Credentials
Private key file for authentication → Private key file for authentication:
คลิก Browse... และเลือก your_key_pair.ppk (เช่น tinnakorn-eb-test.ppk)

・Session (กลับมาที่หัวข้อนี้อีกครั้ง)
Saved Sessions: your_session_name (เช่น tinnakorn-eb-test แล้วคลิก Save และคลิก Open)

เมื่อเชื่อมต่อกับ Instance ได้แล้ว จะแสดงหน้าจอแบบนี้

root@ip-xx-xx-xx-xx:~

Using username "ec2-user".
Authenticating with public key "tinnakorn-eb-test"
  _____ _           _   _      ____                       _        _ _
 | ____| | __   ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
 |  _| | |/ _ \/ __| __| |/ __|  _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
 | |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
 |_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\

 Amazon Linux 2023 AMI

 This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
 WILL BE LOST if the instance is replaced by auto-scaling. For more information
 on customizing your Elastic Beanstalk environment, see our documentation here:
 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.                                          html

   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-xx-xx-xx-xx ~]$

ตรวจสอบไฟล์ PHP หน้า Sample ที่มีอยู่ใน "/var/www/html/"

รันคำสั่งเข้าสู่ระบบผู้ใช้ระดับสูงสุดหรือ root (Superuser)

sudo su -

root@ip-xx-xx-xx-xx:~

[ec2-user@ip-xx-xx-xx-xx ~]$ sudo su -
[root@ip-xx-xx-xx-xx ~]#


รันคำสั่ง cd เพื่อเข้าไปที่โฟลเดอร์ /var/www/html/

cd /var/www/html/

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx ~]# cd /var/www/html/
[root@ip-xx-xx-xx-xx html]#


รันคำสั่งตรวจสอบไฟล์ index.php ในโฟลเดอร์ html นี้

ll

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx html]# ll
total 20
-rw-r--r--. 1 webapp webapp   90 Sep 29 19:02 cron.yaml
-rw-r--r--. 1 webapp webapp 2769 Sep 29 19:02 index.php
-rw-r--r--. 1 webapp webapp  189 Sep 29 19:02 logo_aws_reduced.gif
-rw-r--r--. 1 webapp webapp  367 Sep 29 19:02 scheduled.php
-rw-r--r--. 1 webapp webapp 3490 Sep 29 19:02 styles.css
[root@ip-xx-xx-xx-xx html]#


รันคำสั่งตรวจสอบข้อมูลในไฟล์ index.php

less index.php

แล้วค้นหาคำว่า Congratulations! ตามที่มาร์คไว้ แล้วคัดลอกเตรียมไว้เพื่อนำไปค้นหาในหน้าเว็บเบราว์เซอร์ (ถ้าต้องการออกจากหน้านี้ให้กดปุ่ม q)

root@ip-xx-xx-xx-xx:~

" ...ไม่ได้แสดงส่วนบน... "

<body>
    <section class="congratulations">
        <h1>Congratulations!</h1>
        <p>Your AWS Elastic Beanstalk <em>PHP</em> application is now running on your own dedicated environment in the AWS&nbsp;Cloud</p>
        <p>You are running PHP version <?= phpversion() ?></p>
        <p>This environment is launched with Elastic Beanstalk PHP Platform</p>
    </section>

    <section class="instructions">
        <h2>What's Next?</h2>
        <ul>
            <li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/">AWS Elastic Beanstalk overview</a></li>
            <li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/create_deploy_PHP_eb.html">Deploying AWS Elastic Beanstalk Applications in PHP Using Eb and Git</a></li>
            <li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/create_deploy_PHP.rds.html">Using Amazon RDS with PHP</a>
            <li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html">Customizing the Software on EC2 Instances</a></li>
            <li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/customize-containers-resources.html">Customizing Environment Resources</a</li>
        </ul>

" ...ไม่ได้แสดงส่วนล่าง... "


กลับมาที่หน้าจอเว็บเบราว์เซอร์ที่เปิดลิงก์ Domain จาก Elastic Beanstalk แล้วกดปุ่ม Ctrl + F ให้ช่องค้นหาด้านขวาบนแสดงขึ้นมา แล้ววางข้อความที่คัดลอกเมื่อสักครู่นี้ลงไป + Enter จะเห็นว่ามีข้อความที่ตรงกันเหมือนกับรูปภาพ

ทดสอบ Shutdown Instance

ขั้นตอนนี้จะทดสอบการ Shutdown Instance ซึ่งหลังจากที่ Shutdown ไปแล้ว Instance ตัวเก่าจะถูก Terminate โดยอัตโนมัติ และ Instance ตัวใหม่จะถูกสร้างขึ้นมาเองโดยอัตโนมัติ

รันคำสั่ง Shutdown

shutdown -h now

แล้วโปรแกรม PuTTY ที่กำลัง Login อยู่นั้นจะถูกตัดการเชื่อมต่อทันที ก็ให้คลิก OK ได้เลย ! แต่ยังไม่ต้องปิดโปรแกรม PuTTY

แล้วกลับมาที่หน้าจอ Instance ของเราอีกครั้ง จะเห็นว่า Instance (i-04daxxxxxx) ตัวเก่า ถูก Terminate ไปแล้ว และ Instance (i-07b7xxxxxx) ตัวใหม่ ถูกสร้างขึ้นมาแทนที่โดยอัตโนมัติ ก็ให้คลิกเข้าไปที่ Instance ID ตัวใหม่ได้เลย

แล้วดูที่ Public IPv4 address แล้วนำไปเทียบกับ Instance ID ตัวเก่าที่บันทึกไว้ก่อนหน้านี้ จะเห็นว่า Public IPv4 address ไม่มีการเปลี่ยนแปลง เพราะ Elastic Beanstalk สร้าง Elastic IP ให้โดยอัตโนมัติ

แล้วกลับมาที่หน้าจอโปรแกรม PuTTY แล้วคลิกขวาที่แถบด้านบน และเลือก Restart Session

เลือก Accept เพื่อเชื่อมต่อกับ Instance อีกครั้ง

จะเห็นว่าเราสามารถเชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk ได้โดยที่ไม่ต้องไปตั้งค่าใน PuTTY ใหม่อีกครั้ง

root@ip-xx-xx-xx-xx:~

Using username "ec2-user".
Authenticating with public key "tinnakorn-eb-test"
  _____ _           _   _      ____                       _        _ _
 | ____| | __   ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
 |  _| | |/ _ \/ __| __| |/ __|  _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
 | |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
 |_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\

 Amazon Linux 2023 AMI

 This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
 WILL BE LOST if the instance is replaced by auto-scaling. For more information
 on customizing your Elastic Beanstalk environment, see our documentation here:
 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-xx-xx-xx-xx ~]$


กลับมาที่หน้าจอเว็บเบราว์เซอร์อีกครั้ง และทำการ Reload จะเห็นว่าเราก็ยังสามารถใช้งานหน้าจอเว็บเบราว์เซอร์นี้ได้โดยผ่าน Instance ตัวใหม่ที่ถูกสร้างขึ้นมาแทนที่ตัวเก่าโดยอัตโนมัติ

ลบ AWS Resource ที่สร้างขึ้นในบทความนี้

ลบเรียงตาม AWS Resource ดังนี้

  • Elastic Beanstalk
    • Environments
    • Applications
  • Amazon EC2
    • Key Pairs

ลบ Environments และ Applications ใน Elastic Beanstalk

เข้ามาที่「Service Elastic Beanstalk » Environments」แล้ว Termminate โดยเลือก「Actions » Terminate environment」

เข้ามาที่「Service Elastic Beanstalk » Applications」แล้วลบโดยเลือก「Actions » Delete application」

เข้ามาที่「Service EC2 » Key Pairs」แล้วค้นหาและเลือก Key Pair ที่ต้องการลบ แล้วลบโดยเลือก 「Actions » Delete」

สรุป

การแนะนำครั้งนี้เป็นการใช้งาน Sample Elastic Beanstalk โดยใช้ Platform PHP ซึ่งเราสามารถเลือกใช้ Platform อื่นๆ ได้อีกมากมาย เช่น 「.NET Core on Linux, .NET on Windows Server, Docker, Go, Java, Node.js, PHP, Python, Ruby, Tomcat」 เป็นต้น

นอกจากนี้ Elastic Beanstalk ยังสามารถทำ Auto Scaling ได้ด้วย โดยจะสังเกตได้จากตอนที่ผม Shutdown Instance ตัวเก่าไปแล้วก็จะถูก Terminate โดยอัตโนมัติ และ Instance ตัวใหม่ถูกสร้างขึ้นมาแทนที่ตัวเก่าทันทีโดยอัตโนมัติ ก็จะทำให้เราสามารถใช้งานเว็บเบราว์เซอร์ที่เรากำลังใช้อยู่ได้อย่างต่อเนื่องอีกด้วย

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง