การใช้ Lambda Function เพื่อแปลงข้อมูลใน Firehose

สวัสดีครับสำหรับเนื้อหาในบล็อกนี้ผมมานำเสนอเกี่ยวกับการใช้งาน Function ของ Lambda นะครับซึ่งจะมีการใช้งานควบคู่กับ Firehose ครับ โดยตัวอย่างการใช้งานในครั้งนี้ผมจะยกตัวอย่างการแปลงข้อมูลเวลา Timestamp โดยใช้ Lambda Function นั้นเองครับ ถ้าพร้อมแล้วก็มาเริ่มกันเลยครับ
2022.08.15

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

ขั้นตอนการทำ

สร้าง Amazon S3 Bucket

อันดับแรกสิ่งที่เราต้องมีคือ S3 Bucket นะครับเหมือนกับบล็อกก่อนหน้านี้เลยเพื่อใช้เป็นพื้นที่ในการเก็บข้อมูลเพื่อนำมาแสดงใน Kinesis Firehose ครับ โดยผมจะกำหนดชื่อ S3 Bucket ตามตัวอย่างด้านล่างนี้นะครับ

AS3 Bucket name: chawish-test-[date]

และสำหรับขั้นตอนและวิธีการสร้าง S3 Bucket นะครับสามารถดูได้จากลิ้งค์ด้านล่างเลยครับ

  • การสร้าง Buckets ใน Amazon S3
  • เมื่อเราสร้าง S3 Bucket เรียบร้อยแล้วอันดับต่อไปเราก็จะสร้างและใช้งาน Kinesis Firehose กันครับ

    Kinesis Firehose

    เมื่อเข้าสู่หน้าแรกของ Kinesis Firehose ให้เราเลือกหัวข้อ Kinisis Data Firehose ที่อยู่มุมขวานะครับและกดปุ่ม Create delivery stream ครับตามรูปด้านล่างเลยครับ

    เมื่อกดเข้าไปแล้วในส่วนนี้ให้เรากำหนด Source และ Destination พร้อมกับตั้งชื่อ Delivery ที่เราต้องการนะครับโดยเลือกข้อมูลตามนี้ครับ

    Source:Direct PUT
    Destination:Amazon S3
    Delivery stream name:chawish-test-[date]


    หลังจากนั้นให้เราเลื่อนลงมาในส่วนของ Destination settings แล้วกด Browse ครับและเลือก S3 Bucket ของเราที่ทำการสร้างไปก่อนหน้านี้มาใช้งานครับ

    ถัดไปให้เลื่อนลงมาในหัวข้อ Buffer hints, compression and encryption นะครับ กดที่หัวข้อเพื่อให้ระบบแสดงข้อมูลมาเพิ่มเติมและเปลี่ยนแปลงข้อมูลของ Buffer interval เป็น 60 นะครับ ก็คือกำหนดให้มีการอัพเดททุกๆ 60 วินาทีครับ

    จากนั้นก็กดปุ่ม Create delivery stream ได้เลยครับ และในขั้นตอนต่อไปเราจะทำการสร้าง Lambda function กันครับ

    AWS Lambda

    เริ่มต้นให้เราเข้าไปที่หน้าแรกของเซอร์วิส AWS Lambda นะครับจากนั้นให้เราสังเกตที่หัวข้อมุมขวาชื่อว่า Function นะครับให้เราคลิ้กเข้าไปที่หัวข้อนี้จากนั้นคลิ้กปุ่ม Create function ด้านขวามือเพื่อทำการสร้าง function มาใช้งานกันครับ

    ตามด้วยตั้งค่าข้อมูลเพื่อใช้งานนะครับโดยเราจะเลือกเป็น Author from scratchและกรอกข้อมูลลงไปตามนี้ครับ

    Function name:chawish-test-[date]
    Runtime:Python 3.9

    เมื่อกรอกข้อมูลทั้งหมดเสร็จก็เลื่อนลงมาข้างล่างและกดปุ่ม Create function ได้เลยครับ

    หลังจากนั้นระบบจะแสดงหน้านี้ขึ้นมาเพื่อยืนยันว่าเราได้สร้าง Function สำเร็จเป็นที่เรียบร้อยแล้ว

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

  • Code transform date

  • จากนั้นให้เราคัดลอกโค้ดทั้งหมดมาใส่ในช่องด้านล่างของหน้า Lambda function ของเรา

    หลังจากนั้นก็กดปุ่ม Deploy นะครับ เพื่อทำการอัพเดท Function ใน Lambda ครับ

    หลังจากนั้นให้เราไปที่หัวข้อ Configuration นะครับเพื่อแก้ไขเวลา Timeout

    เมื่อเข้ามาแล้ว เลื่อนลงมาดูข้อมูลด้านล่างและเปลี่ยนแปลงข้อมูลในหัวข้อ Timeout ให้เป็น 1 นาที นะครับ

    และในขั้นตอนถัดไปเราจะมาทดสอบโค้ดที่เรานำมาใส่นะครับ ว่าสามารถใช้งานได้หรือไม่โดยไปที่หัวข้อ Test ครับ

    เมื่อเราเข้ามาให้ส่วน Test แล้วให้เราเลื่อนลงมาด้านล่างเพื่อใส่โค้ด JSON ด้านล่างมาใส่ลงไปตามภาพนะครับ

    {
      "records": []
    }


    จากนั้นให้เราเลื่อนขึ้นมากดปุ่ม Run ได้เลยครับเพื่อทำการทดสอบความถูกต้องของโค้ดว่าสามารถใช้งานได้หรือไม่

    ถ้าโค้ดหรือโปรแกรมทำงานได้ปกติไม่มีปัญหาอะไร ระบบก็จะขึ้นข้อความตามภาพนี้นะครับ

    ก็จบการตั้งค่าในส่วนของ AWS Lambda แล้วนะครับ อันดับต่อไปก็จะเป็นการสร้าง IAM Role กันครับผม

    AWS IAM

    ในส่ส่วนนี้เราจะทำการสร้าง Role เพื่อใช้งานกับ EC2 ครับ โดยจะเป็นการกำนหดสิทธิ์สูงสุดในกับ EC2 เพื่อใช้งาน Firehose นั้นเองโดยเนื้อหาและขั้นตอนสามารถดูได้จากบล็อกที่ผมเขียนก่อนหน้านี้ด้านล่างได้เลยครับ

  • การสร้าง Role เพื่อใช้งาน Firehose
  • Trsusted entity type: AWS Service
    Use case: EC2
    Permission Policy: AmazonKinesisFirehoseFullAccess
    Role name: ec2-chawish-test-20220810

    Amazon EC2

    ทำการติดตั้ง EC2 Instance สำหรับใช้ในการเชื่อมต่อกับ Firehose โดยทำตามลิงก์ด้านล่างนี้ครับ
    จะมีส่วนของหัวข้อ Advanced details ที่เราต้องตั้งค่าเองนะครับไม่มีเนื้อหาในลิ้งค์ด้านล่าง ให้เราเลื่อนลงไปดูวิธีการตั้งค่าด้านล่างของบล็อกนะครับเมื่อทำถึงส่วนนี้แล้ว

    • ※ตัวอย่างตั้งค่าการสร้าง EC2 Instance ในบทความนี้

    Create Key pairs

    Key pairs:chawish-test-[date]

    Launch instances

    Name and tags

    Name:chawish-test-[date]

    Application and OS Images (Amazon Machine Image)

    Amazon Machine Image (AMI):Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type(Default)

    Instance type

    Instance type:t3a.nano

    Key pair (login)

    Key pair name - required:chawish-test-[date]

    Network settings

    Firewall (security groups)

    Security group name - required:chawish-test-[date]
    Description - required:chawish-test-[date]

    Inbound security groups rules

    Security group rule 1 (TCP, 22, 0.0.0.0/0)

    Type:ssh ▼| Source type:My IP ▼| Source:xxx.xxx.x.xxx/32 ✕

    Configure storage

    1x:8GiBgp2 ▼Root volume (Default)

    Advanced details

    ! หลังจากนี้จะเป็นเนื้อหาที่เพิ่มเติมจากการตั้งค่าตามลิ้งค์ด้านบนนะครับIAM Instance profile: เลือก IAM Role ที่เราสร้างก่อนหน้านี้

    เมื่อเราสร้าง Instance เสร็จแล้วอันดับต่อไปก็จะเป็นเกี่ยวกับการรันคำสั่งในโปรแกรม Putty นะครับ

    ขั้นตอนต่อไปเราจะมาดูในส่วนของการตั้งค่าเซิร์ฟเวอร์ผ่าน Putty นะครับ

    Putty

    ในส่วนของการใช้งานและตั้งค่าเซิร์ฟเวอร์นะครับ ผมได้เขียนขั้นตอนและวิธีการใช้งานในบล็อกก่อนหน้านี้แล้ว สามารถเข้าไปดูรายละเอียดตามลิ้งค์ด้้านล่างได้เลยครับ

  • การตั้งค่า EC2 ผ่าน Putty
  • การส่งข้อมูลไปยัง Firehose

    เริ่มต้นให้เราพิมพ์คำสั่ง
    wget https://raw.githubusercontent.com/classmethod-thailand/cmth_seminar/develop/iot_core_webinar/create_sample_json_to_firehose1.py เพื่อ Upload โค้ด Python ที่ผมสร้างไว้ลงไปยังเซิร์ฟเวอร์ครับตามรูปด้านล่างเลย

    ตามด้วยคำสั่งสร้างไฟล์ Python นะครับคือ
    chmod 777 create_sample_json_to_firehose1.py
    และหลังจากนั้นให้เราเข้าไปแก้ไขไฟล์นั้นนะครับโดยใช้คำสั่ง
    vi create_sample_json_to_firehose1.py

    เมื่อเข้ามาในไฟล์แล้วให้เราแก้ไขชื่อ firehose_stream_name ให้เป็นชื่อของ Firehose ที่เราสร้างนะครับวิธีการคือให้เรากด i ครับ เป็นการปรับโหมดเป็น insert mode ข้อมูลซึ่งในโหมดนี้เราสามารถทำการแก้ไขข้อมูลในไฟล์นั้นได้ครับตามตัวอย่างของผมก็จะเป็น

    firehose_stream_name = "chawish-test-[date]"

    เมื่อแก้ไขเสร็จก็กด esc เพื่อออกจากโหมด insert mode ตามด้วยพิมพ์คำสั่ง :x เพื่อทำการบันทึกข้อมูลที่แก้ไขและออกจากไฟล์ครับ

    ขั้นตอนต่อไปก็ให้เราทำาการ Upload ไฟล์นี้ลงไปยัง Amazon S3 โดยใช้คำสั่ง
    python3 create_sample_json_to_firehose1.py

    หลังจากที่เรารันคำสั่งเสร็จก็ให้รอ 60 วินาทีตามที่ได้ตั้งค่า Buffer interval ไว้ แล้วกลับไปตรวจดูที่ S3 Bucket ของเราว่าระบบมีการสร้างไฟล์อะไรขึ้นมาหรือไม่ ซึ่งถ้าเราทำถูกต้องทุกขั้นตอนระบบก็จะมีการสร้างไฟล์และโฟลเดอร์ขึ้นมาตามวันและเวลา ณ ปัจจุบันนั้น ตามตัวอย่างในรูปนะครับ

    ถ้าเราทำตามขั้นตอนมาถึงช่วงนี้ ทุกท่านจะได้ผลลัพธ์ในรูปแบบนี้ถูกต้องไหมครับ ซึ่งถ้าเราสังเกตดีๆ ในส่วนของ timestamp ตัวเลขเวลาจะเป็นจุดทศนิยมถูกไหมครับ ซึ่งเราไม่สามารถอ่านค่าได้เลยว่าเป็นวันที่เวลาเท่าไหร่

    ทำให้เราจำเป็นที่จะต้องนำฟังก์ชั่นที่เราเขียนไว้ใน Lambda มาใช้งานครับ เพื่อแปลงข้อมูลทศนิยมของ timestamp ให้เป็นข้อมูลที่เราสามารถเข้าใจได้ครับ

    การเปิดใช้งาน Lambda function และ ผลลัพธ์ที่ถูกต้อง

    ขั้นตอนนี้ให้เรากลับไปที่ Amazon Kinisis Firehose ของเราก่อนนะครับและเลือกดูที่หัวข้อ Configuration นะครับ ตามด้วยกด Edit
    จากนั้นให้ตั้งค่าข้อมูลตามนี้นะครับเพื่อเปิดใช้งานฟังก์ชันที่เราสร้างใน Lambda

    Data transformation: Enabled
    AWS Lambda function: chawish-test-[date] (เลือก Lambda function ที่เราสร้างไปก่อนหน้านี้ครับ)

    จากนั้นก็กดปุ่ม Save change ได้เลยครับ
    และเมื่อเราเปิดใช้งานฟังก์ชั่น Lambda เรียบร้อยแล้วเราก็จะมาทดสอบการ Upload ข้อมูลกันว่าตอนนี้ข้อมูล Timestamp ถูกเปลี่ยนแปลงรึยังโดยใช้คำสั่ง
    python3 create_sample_json_to_firehose1.py
    หลังจากรันคำสั่งเสร็จและระบบ Upload ข้อมูลใหม่ลงใน Amazon S3 เรียบร้อยแล้วให้เราดาวน์โหลดไฟล์ใหม่มาเปิดดูก็จะพบว่าข้อมูล Timestamp จากก่อนหน้านี้ที่เป็นทศนิยมได้หายไปแล้วและกลายเป็นรูปแบบของวันที่และเวลาที่เราสามารถเข้าใจได้ครับตามภาพที่เห็น

    นี้คือผลลัพธ์ของการใช้งานฟังก์ชัน Lambda ที่เราเขียนนะครับทำให้แปลงข้อมูล Timestamp ออกมาในรูปแบบปกติได้ครับ

    การ Delete และ Terminate เมื่อเลิกใช้งาน

    ในส่วนนี้ของ EC2 ให้ทำตามลิ้งค์ด้านล่างนี้ได้เลยครับ

  • การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2
  • และในส่วนของ Firehose กับ S3 Bucket สามารถดูขั้นตอนได้จากบล็อกของผมก่อนหน้านี้ได้เลยครับตามลิ้งค์ด้านล่าง

  • การหยุดการใช้งาน
  • และสุดท้ายจะเป็นการลบฟังก์ชั่น Lambda นะครับ ให้เราเข้าไปที่หน้า Function และเลือกฟังก์ชั่นที่เราสร้างขึ้นตามด้วยกด Action -> Delete ครับผม เพียงเท่านี้เราก็ทำการลบฟังก์ชั่น Lambda เรียบร้อยแล้ว

    สรุป

    สำหรับเนื้อหาในบล็อกครั้งนี้ผมหวังเป็นอย่างยิ่งว่าจะมีส่วนช่วยในการให้ความรู้และวิธีการใช้งาน Lanbda Function เพิ่มมากขึ้นนะครับ และในอนาคตข้างหน้าผมก็จะเขียนบล็อกให้ความรู้เกี่ยวกับเซอร์วิสของ AWS ต่อไปเรื่อยๆ เพื่อเป็นการเพิ่มประสบการณ์และทักษะในการใช้งาน AWS ให้มากยิ่งขึ้นครับ

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

  • AWS Amazon Kinesis คืออะไร? การแนะนำฟังก์ชันล่าสุดของ AWS ในปี 2022
  • การส่งข้อมูลจาก EC2 ไปยัง Firehose
  • การใช้งาน S3 ควบคู่กับ Amazon Kinesis Data Firehose
  • วิธีการใช้ S3 จาก EC2 และการใช้ AWS CLI S3
  • วิธีติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY