Thanapon Tapala

Backend Developer

Embedded Developer

Smart Farmer

Maker

Thanapon Tapala

Backend Developer

Embedded Developer

Smart Farmer

Maker

Blog Post

[AWS-IoT] Manage Greengrass ผ่าน Secure Tunneling Component

September 24, 2022 AWS, Docker, MQTT, RaspberryPi
[AWS-IoT] Manage Greengrass ผ่าน Secure Tunneling Component

AWS IoT secure tunneling ?

คือ Component ตัวหนึ่งของ Greengrass service ที่ทำให้เราสามารถ Remote เข้าไปเชื่อมต่อกับ Greengrass device นั้นๆได้ โดยที่ไม่ต้องคอยกังวลเกี่ยวกับ Firewall ของระบบ Network ที่รันอยู่ ซึ่งข้อดีของ AWS IoT Secure Tunneling นั้น เราจะเอาไว้สำหรับแก้ไขปัญหาการตั้งค่าอุปกรณ์ที่อยู่คนละที่กับเราได้เลย ทำให้เราลดเวลาที่จะลงไปดูหน้างานจริงๆและสามารถแก้ไขปัญหาได้ทันท่วงที

AWS IoT Greengrass คือ service ตัวหนึ่งที่เราสามารถเอามาใช้ในการสร้าง Edge service หรือ Gateway ในการส่งข้อมูลไปยัง AWS IoT Core

Secure tunneling concepts

  • Client access token (CAT): Token ที่ AWS IoT Secure Tunneling สร้างขึ้นมาเอาไว้ใช้ในการเชื่อมต่อระหว่างเครื่อง Source กับ Destination
  • Destination application: Service ที่รันอยู่บนเครื่องที่เราต้องการจะ Remote เช่น SSH, HTTP
  • Destination device: เครื่องที่เราต้องการจะ Remote
  • Device agent: Agent ที่ Subscribe topic “$aws/things/thing-name/tunnels/notify” สำหรับรับ Token ที่สร้างมาจาก Secure Tunneling ซึ่งจะใช้ Token ในการสร้าง Tunnel
  • Local proxy: Software ที่รันบนเครื่อง Source ที่ใช้ในการ Relay message จาก Secure Tunneling กับ Application ที่รันอยู่บนเครื่อง Remote
  • Source device: Computer/Laptop ของเรา
  • Tunnel: Logical pathway ที่ AWS IoT สร้างให้ระหว่างเครื่อง Source กับ Destination

How secure tunneling works

  • เริ่มต้นเราต้องสร้าง Tunnel ใน AWS Console ก่อน โดยเข้าไปที่ AWS IoT > Manage > Tunnels
  • พวก Description ก็ใส่อะไรก็ได้ที่มันสื่อความหมายกับ Tunnel ของเรานะครับ ซึ่ง Service ผมจะใช้เป็น SSH เข้าไปที่อุปกรณ์ “iot-gg-rpi-dev-5” ส่วนสุดท้ายจะเป็น Timeout ก็แล้วแต่เรากำหนดเลย โดยปกติผมจะเปิดไว้ไม่เกิน 1 ชั่วโมง
  • เมื่อสร้าง Tunnel เสร็จแล้วก็ให้ Copy “Access token for source” ไว้ด้วยนะครับ
  • เมื่อเราเข้ามาดูใน Tunnel ID ที่เราสร้างมาจะเห็นว่าตอนนี้ Destination connection state นั้น Connected แล้วเหลือแค่ส่วนของ Source connection state เท่านั้นที่ Disconnected

Setting up Localproxy

  • ขั้นตอนตอนไปเราต้องมาติดตั้ง Local proxy ก่อนเพื่อให้มัน Relay ข้อมูลระหว่างเครื่อง Source กับ Destination โดยเราสามารถ Clone repository ได้จาก

AWS Iot Secure Tunneling local proxy reference C++ implementation

https://github.com/aws-samples/aws-iot-securetunneling-localproxy.git
  • หลังจากที่เรา Clone repository มาแล้ว ซึ่งถ้าสังเกตดูในไฟล์เราจะเห็น Bash script สำหรับสร้าง docker image อยู่ แสดงว่าเราสามารถให้มันรันบน docker ได้เลยไม่ต้องติดตั้ง dependencies ต่างๆ บนเครื่องเราด้วย สบายบรื้ออออ!!!!!
  • รัน “docker-build.sh” สำหรับสร้าง Docker image กันนะจ๊ะ อาจจะต้องใช้เวลาสักพักถึงจะสร้าง Docker image เสร็จ
./docker-build.sh
  • Build Docker Image เสร็จแล้ว ก็ถึงเวลาใช้งานกัน โดยที่เราจะรัน “docker-run.sh” ตามด้วย Port ที่เราจะ expose ออกมาให้เราสามารถ SSH เข้าไปยังเครื่อง Remote
./docker-run.sh -p 5555
  • ลองรัน localproxy โลด

-b: ให้ localproxy สามารถเรียกจากข้างนอก Container ได้

-r: Region ของ AWS ที่เราใช้งานอยู่

-s: Port ที่เรา expose ออกไปก่อนหน้านี้

-t: Access token ที่มาจากขั้นตอนการสร้าง Tunnel ใน AWS Console

./localproxy -b 0.0.0.0 -r ap-southeast-1 -s 5555 -t ${access_token}
  • เช็คดูสถานะใน AWS Console > Manage > Tunnels จะเห็นว่า Connected

SSH from local machine

  • ลอง SSH ผ่าน Terminal ดูสิ
ssh pi@localhost -p 5555
  • ลองดู Log ของ Greengrass บ้างสิ
sudo tail -f /greengrass/v2/logs/greengrass.log

สรุปสามารถใช้งานได้จ้าาา หวังว่าจะเป็นประโยชน์กับผู้ที่สนใจที่จะมาศึกษา AWS IoT กันนะครับ ขอบคุณที่ติดตาม สวัสดีครับ

AWS IoT secure tunneling

https://docs.aws.amazon.com/iot/latest/developerguide/secure-tunneling.html

AWS Iot Secure Tunneling local proxy reference C++ implementation

https://github.com/aws-samples/aws-iot-securetunneling-localproxy
Taggs: