[AWS-IoT] Manage Greengrass ผ่าน Secure Tunneling Component
![[AWS-IoT] Manage Greengrass ผ่าน Secure Tunneling Component](https://thanapon.info/wp-content/uploads/2022/09/aws-iot-secure-tunneling.jpg)
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 กันนะครับ ขอบคุณที่ติดตาม สวัสดีครับ
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