การเรียกใช้ AWS Lambda หลังจาก AWS Glue Crawler รวบรวมข้อมูล

ในบทความนี้เราสามารถตั้งค่าเพื่อเรียกใช้งาน AWS Lambda หลังจากที่ AWS Glue Crawler รวบรวมข้อมูลเรียบร้อยแล้ว หวังว่าบทความนี้จะเป็นประโยชน์สำหรับการนำข้อมูลมาประมวลผลแบบอัตโนมัติ

บทความนี้แปลมาจากบทความที่เป็นภาษาญี่ปุ่นที่ชื่อว่า AWS Glue crawler のクロールが終わったら Lambda を実行する โดยเจ้าของบทความนี้คือ คุณ Yuta Shimizu

จุดประสงค์

ในบทความนี้ เราจะมาสร้างการกำหนดค่าเพื่อเรียกใช้ Lambda หลังจากที่ AWS Glue Crawler รวบรวมข้อมูลเสร็จแล้ว
โดยระบบการทำงานจะเป็นเหมือนรูปภาพนี้

บทความนี้อ้างอิงจากบล็อกของทาง AWS Event-driven refresh of SPICE datasets in Amazon QuickSight [1] โดยส่วนใหญ่จะใช้คำสั่ง CDK

ข้อกำหนดเบื้องต้น/สิ่งที่ต้องรู้

  • บัญชี AWS
  • IAM Role และ Policy ที่มีสิทธิ์ในการสร้าง EC2 instance
  • AWS region ที่สามารถใช้คำสั่ง cdk bootstrap
  • วิธีการสร้าง IAM Role และ Policy และการใช้ role กับ EC2 instance, วิธีการใช้ Session Manager และ AWS CLI

Step 1: สร้าง IAM role เพื่อนำไปใช้กับ EC2 instance

สร้าง role โดยใช้ policy ตามด้านล่างนี้
จากนั้นจึงนำ role ไปใช้กับ EC2 instance ภายหลัง
Note: ในการใช้งานจริงควรตั้งค่าให้สิทธิ์ตามหลัก least privilege

  • AmazonSSMManagedInstanceCore: ใช้เพื่อให้ Session Manager เชื่อมต่อกับ EC2 instance
  • AmazonS3FullAccess: สำหรับการอัปโหลดและลบไฟล์ใน Amazon S3
  • Inline Policy ตามด้านล่างนี้: เพื่อให้มีสิทธิ์ในการ deploy CDK (อ้างอิงจากบทความ[2]) และเริ่มใช้งาน AWS Glue Crawler, CloudWatch Logs และ CloudFormation Stacks สำหรับการค้นหาและตรวจสอบ event ที่เกิดขึ้น
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "sts:AssumeRole"
                ],
                "Resource": [
                    "arn:aws:iam::*:role/cdk-*"
                ]
            },
            {
                "Sid": "StartCrawler",
                "Effect": "Allow",
                "Action": [
                    "glue:StartCrawler"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Sid": "TailLog",
                "Effect": "Allow",
                "Action": [
                    "logs:StartLiveTail",
                    "logs:FilterLogEvents"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Sid": "CfnDescribe",
                "Effect": "Allow",
                "Action": [
                    "cloudformation:DescribeStacks"
                ],
                "Resource": [
                    "*"
                ]
            }
        ]
    }

    จากนั้นให้นำ role ไปใช้กับ EC2 instance
    ซึ่งในบทความนี้จะตั้งค่า EC2 instance ตามด้านล่างนี้

  • OS: Amazon Linux 2023
  • Instance type: t2.micro
  • Subnet: Public subnet
  • Public IP assignment: Enabled
  • Security group: ปิดทุก port เนื่องจากเราตั้งค่าให้ใช้แค่เพียง Session Manager ในการเชื่อมต่อ

Step 2: ติดตั้งแพ็คเกจที่จำเป็นบน EC2 instance สำหรับการใช้งาน CDK

เชื่อมต่อ EC2 instance ผ่านทาง Session Manager จากนั้นใช้คำสั่งตามนี้
สามารถเข้าได้โดยไปที่หน้า Management console เข้าไปที่ EC2 > เลือก instance ที่ต้องการเชื่อมต่อ > คลิก Connect > คลิก Session Manager

cd ~
sudo dnf install -y git
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash  # อ้างอิงจากบทความ [3]
source ~/.bashrc
nvm install --lts
npm -g install typescript aws-cdk

หลักจากที่ใช้คำสั่งตามด้านบน git จะถูกติดตั้ง(ใช้สำหรับการโคลนโปรเจกต์ในภายหลัง)
ตามด้วยติดตั้ง node.js, typescript, และ aws-cdk เพื่อรันคำสั่ง CDK
หากไม่พบข้อผิดพลาดใดๆในขั้นตอนนี้ เพียงเท่านี้ก็พร้อมใช้งานแล้วครับ

Step 3: สร้าง S3 bucket, Glue Crawler, EventBridge Rule, CloudWatch logs และ Lambda function

เชื่อมต่อ EC2 instance ผ่านทาง Session Manager จากนั้นใช้คำสั่งตามด้านล่างเพื่อโคลนโปรเจกต์ตาม ลิงก์ และติดตั้งแพ็คเกจที่จำเป็น

cd ~
git clone https://github.com/yuta-cmth/blog-glue-trigger.git
cd blog-glue-trigger
npm i

จากนั้นสร้าง resource ต่างๆด้วยคำสั่ง CDK

cdk deploy --require-approval never

หลังจากรันคำสั่งตามด้านบน เมื่อสำเร็จแล้วจะแสดงผลลัพธ์ตามด้านล่าง

✨ Total time: 110.1s

โดย resource ต่างๆที่สร้างขึ้นจากคำสั่ง CDK จะมีดังนี้ตามภาพด้านล่าง


หากต้องการตรวจสอบ resource ต่างๆก็สามารถตรวจสอบได้ที่ Management console หรือ CloudFormation Stack

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

  1. เรียกใช้งาน Crawler
  2. หลังจากที่ Crawler รวบรวมข้อมูลเสร็จแล้ว EventBridge Rule จะทำการจับ event และเรียกใช้งาน Lambda
  3. Lambda จะเขียน log ไปที่ CloudWatch Logs(สามารถดูโค้ดของ AWS Lambda ได้ที่ ลิงก์)
  4. ทำการยืนยันว่า logs ถูกเขียนไปที่ CloudWatch Logs

ต่อไปนี้เราจะทำการตรวจสอบกระบวนการว่าเป็นไปตามแผนภาพหรือเปล่า

Step 4: ยืนยันว่า Lambda ทำงานหลังจากการรวบรวมข้อมูล

เริ่มด้วยการใช้คำสั่งตามด้านล่าง เพื่อเก็บรายชื่อ resource จาก CloudFormation ไว้ในตัวแปร

# ให้ S3 bucket รวบรวมข้อมูล crawler และ lambda log ที่ทำงานหลังจากการรวบรวมข้อมูลเสร็จแล้ว
# ได้รับจากผลลัพธ์ CloudFormation
bucket_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueCrawlerBucketName`].OutputValue')
crawler_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueCrawlerName`].OutputValue')
log_group_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueCrawlerEventHandlerLogGroupName`].OutputValue')

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

aws s3 cp ./s3_test_data/data "s3://${bucket_name}/data" --recursive
aws glue start-crawler --name "${crawler_name}"
aws logs tail --follow "${log_group_name}"

การรวบรวมข้อมูลอาจจะใช้เวลาประมาณ 1 นาที
หากมีข้อความจาก Lambda แสดงตามภาพด้านล่าง แสดงว่า Lambda กำลังทำงานอยู่หลังจากการรวบรวมข้อมูลเสร็จสมบูรณ์

Step 5: เคลียร์ resource

ลบ resource ที่สร้างด้วย CDK โดยใช้คำสั่งดังต่อไปนี้

aws s3 rm "s3://${bucket_name}" --recursive
cdk destroy --force

เราใช้ s3 rm เพราะว่าคำสั่ง cdk destroy ไม่สามารถลบ S3 bucket ที่มีข้อมูลอยู่ได้

สรุป

ในบทความนี้เราได้อธิบายวิธีสร้างการกำหนดค่าเพื่อที่จะใช้งาน Lambda หลังจากที่ AWS Glue Crawler รวบรวมข้อมูลเสร็จเรียบร้อย หวังว่าบทความนี้จะมีประโยชน์กับการนำไปใช้การประมวลผลข้อมูลอัตโนมัติ

บทความต้นฉบับ

AWS Glue crawler のクロールが終わったら Lambda を実行する(ภาษาญี่ปุ่น)

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