AWS Thai Blog

การส่งต่อพอร์ทเพื่อเชื่อมกับรีโมทโฮสต์ด้วย AWS Systems Manager Session Manager

ไม่นานมานี้เราได้ประกาศความสามารถใหม่ใน AWS Systems Manager Session Manager ที่อนุญาตให้ส่งต่อการเชื่อมต่อจากเครื่องลูกค้าไปยังพอร์ตบนรีโมทโฮสต์ นี้ช่วยให้ผู้ใช้เข้าถึงและจัดการรีโมทเซิร์ฟเวอร์ (ฐานข้อมูล เว็บเซิร์ฟเวอร์ เป็นต้น) ในเครือข่ายเอกชนโดยไม่จำเป็นต้องตั้งค่าโฮสต์บาสเชียนหรือเปิดพอร์ตเพิ่มเติมสำหรับเครือข่ายภายนอก ในโพสต์นี้ผมจะแนะนำให้คุณดูตัวอย่างการตั้งค่าการส่งต่อพอร์ตไปยังรีโมทโฮสต์โดยใช้ฟีเจอร์ใหม่ของ Session Manager

บทความนี้แปลจาก Use port forwarding in AWS Systems Manager Session Manager to connect to remote hosts โดยคุณ Faraz Rehman

เกี่ยวกับ AWS Systems Manager Session Manager

AWS Systems Manager Session Manager เป็นความสามารถของ Systems Manager ที่ได้รับการดูแลอย่างเต็มรูปแบบ Session Manager ช่วยให้คุณเชื่อมต่อและจัดการกับ instance ของคุณ อุปกรณ์ Edge รวมถึงเซิร์ฟเวอร์ On-premise  และ Virtual Machine (VMs) บนที่ตั้ง คุณสามารถใช้ AWS Cloud Shell ที่สามารถคลิกใช้งานผ่านเบราว์เซอร์หรือ AWS Command Line Interface (AWS CLI) ได้

สถานการณ์ตัวอย่าง

สมมติว่าคุณกำลังพยายามใช้เครื่องมือในเชิงกราฟิกบนของคุณ (เช่น SQL Workbench/J) เพื่อจัดการกับ instance (MySQL) ที่อยู่ภายในซับเนตภายใน Amazon Virtual Private Cloud (Amazon VPC) (รูปที่ 1) โดยทั่วไปแล้วตัวเครื่องจะต้องการให้คุณเปิดพอร์ต TCP 3306 เพื่ออนุญาตให้เชื่อมต่อกับฐานข้อมูลนี้ผ่านอินเทอร์เน็ต อย่างไรก็ตาม นี่ไม่ใช่สิ่งที่ดีจากมุมมองด้านความปลอดภัย หรือในกรณีอื่น คุณอาจลองติดตั้งบาสเตี้ยนโฮสต์ (Bastion Host) และติดตั้งเครื่องมือทั้งหมดลงในนั้น แต่นั่นจะต้องมีงานที่คุณจะต้องทำเพิ่มเติมเพื่อตั้งค่าและบำรุงรักษา ในส่วนถัดไป ผมจะแสดงวิธีการใช้ “การส่งต่อพอร์ต” ใน Session Manager เพื่อเชื่อมต่อกับฐานข้อมูล MySQL ระยะไกลจากไคลเอนต์ในเครือข่ายส่วนตัวโดยไม่ต้องมีความยุ่งยากในการตั้งค่าบาสเตี้ยนโฮสต์

รูปที่ 1: โซลูชั่นโดยรวมในการเชื่อมไปหารีโมทโฮสบนเน็ตเวิร์กส่วนตัว

ข้อกำหนดเบื้องต้น

ขอแจ้งก่อนว่าเซสชั่นของ Systems Manager Session Manager สามารถเปิดได้ผ่านคอนโซลหรือ AWS CLI ก็ได้ แต่สำหรับโพสต์นี้ผมจะแสดงวิธีเปิดผ่าน CLI

ขั้นตอนที่ 1: เซตอัพ Instance และตรวจสอบคอนเนคชั่น

ก่อนหน้านั้นคุณต้องเชคว่าคุณสามารถเชื่อมต่อกับ Instance ที่ถูกจัดการด้วย Systems Manager บนเครื่องของคุณได้

เปิดโปรแกรมเทอร์มินอลที่คุณชอบ (putty, หรือ Mac Terminal หรืออะไรก็ได้) และพิมคอมแมนด์ดังนี้. แก้คำว่า ssm-managed-instance-id ด้วย Instance ID ของ EC2 ของคุณที่ถูก SSM จัดการไว้

aws ssm start-session --target <ssm-managed-instance-id>

ถ้าการเชื่อมต่อสำเร็จแสดงว่าการ setup ผ่าน คุณสามารถปิดคอนเนคชั่นได้และไปยังขั้นตอนต่อไป

ขั้นตอนที่ 2: เปิดการส่งต่อการเชื่อมต่อไปหาพอร์ทรีโมทบนเซิฟเว่อร์ MySQL

ในขั้นตอนนี้ คุณจะเปิดเซสชั่น Session Manager ใหม่อีกรอบ แต่คราวนี้คุณจะต้องรัน Systems Manager Document เพื่อที่จะส่งต่อการเชื่อมต่อไปหาฐานข้อมูลรีโมทของคุณ

พิมคอมแมนด์ดังนี้ลงบนเทอร์มินอลโดยที่เปลี่ยน ssm-managed-instance-id และ remote-database-host-name ด้วยค่าที่คุณใช้ตอนแรก

หมายเหตุ: ในตัวอย่างนี้ผมกำลังเลือกพอร์ท local ที่ 1053 แต่คุณสามารถเลือกพอร์ทใดก็ได้

aws ssm start-session --target <ssm-managed-instance-id> --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"portNumber":["3306"],"localPortNumber":["1053"],"host":[" remote-database-host-name"]}'

โปรดเปิดค้างไว้จนกว่าจะจบทุกขั้นตอน

ขั้นตอนที่ 3: (ไม่ต้องทำก็ได้) ตรวจสอบว่าการเชื่อมต่อนั้นทำงานอยู่

เราสามารถจะตรวจสอบได้ว่าการส่งต่อการเชื่อมต่อนั้นทำงานอยู่ด้วยการรันคอมแมนด์ใหม่บนหน้า terminal ใหม่ โดยที่คอมแมนด์นี้จะทำให้คุณสามารถเชื่อมกับฐานข้อมูลได้ด้วยเซสชั่นบน CLI

mysql -h 127.0.0.1 --port 1053 -u admin -p

ขั้นตอนที่ 4: เชื่อมต่อด้วย SQL Workbench/J

เปิด SQL Workbench/J บนเครื่องของคุณ ถ้าคุณมีโปรไฟล์การเชื่อมต่ออยู่แล้วคุณสามารถเลือกใช้อันนั้นได้หรือไม่ก็สร้างการเขื่อมต่อใหม่โดยอิงจากพารามิเตอร์การเชื่อมต่อของฐานข้อมูลของคุณ โปรดสังเกตด้วยว่าแทนที่จะใช้รีโมท IP หรือชื่อโฮสของฐานข้อมูลของคุณ คุณจะใช้ IP ของเครื่องคุณแทนในส่วนของ URL

Jdbc:mysql://127.0.0.1:1053/<database-name>

รูปที่ 2: SQL Workbench – โปรไฟล์การเชื่อมต่อ

กด “OK”, และคุณจะถูกเชื่อมกับฐานข้อมูลรีโมท

รูปที่ 3: SQL Workbench โชว์ผลลัพท์การ query

บทสรุป

ในโพสนี้ผมได้แสดงให้คุณเห็นการเชื่อมต่อหาเซิฟเวอร์รีโมนภายในเน็ตเวิร์กส่วนตัวด้วย Systems Manager Session Manager ด้วยฟีเจอร์ในการส่งต่อพอร์ทไปยังรีโมทโฮสต์

ถึงแม้ว่าผมใช้ RDS mySQL server ในตัวอย่างนี้ แต่คุณสามารถที่จะใช้วิธีนี้ในการต่อกับโฮสต์ไหนก็ได้ด้วยซอฟต์แวร์ในการจัดการใดก็ได้ที่คุณชอบ