การรัน Script โดยอัตโนมัติด้วย UserData เมื่อทำการ Start จากการ Stop EC2

การรัน Script โดยใช้ UserData ใน EC2 Instance ช่วยให้การติดตั้งแอปพลิเคชัน หรือ Script นั้นง่ายขึ้น โดยที่ไม่ต้องเข้าไปยัง PuTTy เพื่อทำการติดตั้งด้วยตนเอง

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ผมป๊อปนะครับ ครั้งนี้ผมจะมาแนะนำการรัน Script โดยอัตโนมัติด้วย UserData เมื่อทำการ Start จากการ Stop EC2

ความแตกต่างของการใช้งาน UserData

การติดตั้งแอปพลิเคชันลง Server Amazon Linux 2 ผ่าน User data」 และ 「การรัน Script โดยอัตโนมัติด้วย UserData เมื่อ Start จากการ Stop EC2แตกต่างกันอย่างไร?

  • การติดตั้งแอปพลิเคชันลง Server Amazon Linux 2 ผ่าน User data คือการใส่คำสั่งลงใน UserData ในระหว่างการสร้าง EC2 Instance และเมื่อสร้างเสร็จแล้ว คำสั่งต่างๆ ใน UserData นั้นจะถูกรันโดยอัตโนมัติโดยที่ไม่ต้องเข้าไปยัง PuTTy เพื่อรันคำสั่งด้วยตัวเอง
  • การรัน Script โดยอัตโนมัติด้วย UserData เมื่อ Start จากการ Stop EC2 คือการใส่คำสั่งลงใน UserData ในขณะที่ EC2 Instance มีสถานะเป็น Stopped จากนั้นเมื่อทำการ Start EC2 Instande อีกครั้ง ชุดคำสั่ง Script ใน UserData ก็จะถูกรันออกมากลายเป็นรูปแบบไฟล์โดยอัตโนมัติ

สิ่งที่ต้องมี

ทำการสร้าง EC2 Instance ตามลิงก์ด้านล่างนี้ โดยจะใช้ชื่ออะไรก็ได้ ซึ่งในบทความนี้จะใช้เป็นชื่อtinnakorn-userdata-restart

เมื่อสร้าง EC2 Instance เสร็จแล้ว ต่อไปให้เชื่อมต่อ Elastic IP เข้ากับ Instance เพื่อไม่ให้ IP Address เกิดการเปลี่ยนแปลงในขณะที่ Stop และ Start EC2 Instance ทำตามลิงก์ด้านล่างนี้ได้เลย

เมื่อเราทำการสร้าง EC2 Instance ขึ้นมาและเชื่อมต่อ Elastic IP เสร็จเรียบร้อยแล้ว จะได้หน้าตาแบบนี้
ins_run_script

การรัน Script อัตโนมัติโดยใช้ UserData

สมมุติว่าผมทำการสร้าง EC2 Instance และเชื่อมต่อ Elastic IP เข้ากับ EC2 Instance เรียบร้อยแล้ว จากนี้ผมจะเริ่มตั้งค่าและรัน Script โดยใช้ UserData ใน EC2 Instance

การ Stop instance

ถ้า EC2 Instance มีสถานะ Stopped ให้ข้ามขั้นตอนนี้ไปได้เลย
แต่ถ้า EC2 Instance มีสถานะ Running ให้ทำการ Stop instance ดังนี้
» เลือกInstance state ▼
» เลือกStop instance
run_script-1

คลิกStop
run_script-2

การตั้งค่า Script ใน UserData

เมื่อ Stop instance แล้ว ให้เข้าไปที่ user data ตามนี้
» เลือกActions ▼
» เลือกInstance settings ▶
» เลือกEdit user data
run_script-3

เลื่อนลงมาด้านล่างสุด จากนั้น Copy Script ด้านล่างนี้ลงในช่องของ user data ตามด้วยคลิกSave(ถ้าไม่ Stop instance ก่อนจะไม่สามารถตั้งค่าได้)

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo `/bin/date` >> /tmp/testfile.txt
--//--

ชุดคำสั่งscripts-user, alwaysคือ Script จะถูกรันทุกครั้งเมื่อมีการ Stop/Start EC2 Instance

ส่วนชุดคำสั่งด้านล่างนี้คือ เมื่อชุดคำสั่งนี้ถูกรันไปแล้ว ก็จะสามารถตรวจสอบวันที่ เวลาปัจจุบันของการรัน Script ได้

#!/bin/bash
/bin/echo `/bin/date` >> /tmp/testfile.txt

run_script-4

การ Start instance

เมื่อตั้งค่าเสร็จแล้ว ให้ Start instance ตามนี้
» เลือกInstance state ▼
» เลือกStart instance
run_script-5

การตรวจสอบ Script ของ UserData ใน PuTTy

ให้ทำการเชื่อมต่อ EC2 ด้วย PuTTy ตามลิงก์ วิธีติดตั้ง Amazon Linux บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTy นี้ในหัวข้อที่3. Connect to EC2 by PuTTY

เมื่อเชื่อมต่อ EC2 ด้วย PuTTy เรียบร้อยแล้ว จะได้หน้าตาแบบนี้
putty_run_userdata-1

การใช้งาน PuTTy ต้องทำการเปลี่ยน ec2-user ให้เป็น root ทุกครั้ง เพื่อที่จะสามารถจัดการระบบใน Server Amazon Linux 2 ได้

เรียกใช้คำสั่งนี้เพื่อเข้าสู่ระบบในฐานะผู้ใช้ที่มีสิทธิ์ root

sudo su -

putty_run_userdata-2

เรียกใช้คำสั่งนี้เพื่อตรวจสอบสถานะของ Script ใน UserData

less /var/log/cloud-init-output.log

putty_run_userdata-3

เมื่อเข้ามาแล้วจะมีหน้าตาแบบนี้ ซึ่งเราสามารถตรวจสอบการติดตั้งแอปพลิเคชันต่างๆ รวมไปถึงข้อมูล Script ที่ใส่ลงใน UserData ได้อย่างละเอียด
ถ้าต้องการออกจากหน้านี้ ให้กดปุ่มq
putty_run_userdata-4

เรียกใช้คำสั่งนี้เพื่อตรวจสอบไฟล์ Script ที่ถูกรันผ่าน UserData

less /tmp/testfile.txt

putty_run_userdata-4-1

เมื่อรันคำสั่งไปแล้วจะมีเวลาปัจจุปันแสดงขึ้นมาพร้อมชื่อไฟล์ที่ได้มาจากการรัน Script
ถ้าต้องการออกจากหน้านี้ ให้กดปุ่มq
putty_run_userdata-4-2

ต่อไปจะทำการทดสอบ Stop และ Start EC2 Instance อีกครั้ง
กลับมาที่ EC2 Instance แล้วทำการ Restart Instance โดยการ Stop และ Start Instance อีกครั้งนั่นเอง

ในขณะที่ EC2 Instance มีสถานะ Running ให้ทำการ Stop instance ดังนี้
» เลือกInstance state ▼
» เลือกStop instance
run_script-1

คลิกStop
run_script-2

เมื่อ EC2 Instance มีสถานะ Stopped แล้ว ให้ Start instance อีกครั้งตามนี้
» เลือกInstance state ▼
» เลือกStart instance
run_script-5

จากนั้นกลับมาที่โปรแกรม PuTTy แล้วคลิกขวาที่แถบด้านบน จากนั้นเลือกRestart Session
restart_userdata-1

เรียกใช้คำสั่งนี้เพื่อเข้าสู่ระบบในฐานะผู้ใช้ที่มีสิทธิ์ root

sudo su -

restart_userdata-2

เรียกใช้คำสั่งนี้อีกครั้งเพื่อตรวจสอบไฟล์ Script ที่ถูกรันผ่าน UserData

less /tmp/testfile.txt

restart_userdata-3

เมื่อรันคำสั่งไปแล้วจะมีเวลาปัจจุบันแสดงเพิ่มขึ้นมาเรื่อยๆ หลังจากมีการ Stop/Start EC2 Instance
ถ้าต้องการออกจากหน้านี้ ให้กดปุ่มq
restart_userdata-4

ตัวอย่างการใช้งาน Scripts

ต่อไปจะยกตัวอย่างเกี่ยวกับการใช้ชุดคำสั่งที่แตกต่างกัน
ในกรณีที่ต้องการเรียกใช้ Script อื่นๆ ในขณะที่ทำการ Start EC2 Instance ต้องสร้างชุดคำสั่งนี้ขึ้นมา และนำไปใส่ใน UserData

ตัวอย่างการใช้งาน Script (yum update -y)

ตัวอย่างเช่น เมื่อทำการเพิ่ม Script ลงใน UserData แล้ว ก็จะสามารถเรียกใช้yum update -yได้ทุกครั้งที่เราทำการ Start EC2 Instance

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

yum update -y
--//--

ตัวอย่างการใช้งาน Script (การดาวน์โหลดไฟล์)

อีกตัวอย่างหนึ่ง คือการดาวน์โหลดไฟล์จากเว็บไซต์หลังจากทำการ Start EC2 Instance
เมื่อเพิ่มชุดคำสั่งนี้ลงใน UserData แล้ว ก็จะสามารถเรียกใช้`wget https://www.classmethod.co.th/en/`ได้ทุกครั้งที่เราทำการ Start EC2 Instance

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

wget https://www.classmethod.co.th/en/
--//--

เข้ามายัง PuTTy และเรียกใช้คำสั่งนี้เพื่อตรวจสอบไฟล์ของเว็บไซต์

less index.html

restart_userdata-7

เมื่อเข้ามาแล้ว เราจะสามารถตรวจสอบไฟล์ข้างในได้
ถ้าต้องการออกจากหน้านี้ ให้กดปุ่มq
restart_userdata-8

สรุป

คุณสามารถใช้ UserData เพื่อเรียกใช้โปรแกรมทุกครั้งที่ Start EC2 Instance นอกจากนี้เรายังสามารถรันคำสั่งต่างๆ ตามไอเดียของเราได้อีกด้วย

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

อ้างอิง : https://aws.amazon.com/premiumsupport/knowledge-center/execute-user-data-ec2/?nc1=h_ls