การอัปเดต SPICE ของ QuickSight จาก Lambda function เมื่อ Glue Crawler ทำการรวบรวมข้อมูลและการสร้างตารางเสร็จแล้ว

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

บทความนี้แปลมาจากบทความที่เป็นภาษาญี่ปุ่นที่ชื่อว่า Glue Crawler のクローリングが完了したら Lambda function から QuickSight の SPICE を更新する โดยเจ้าของบทความนี้คือ คุณ Yuta Shimizu

จุดประสงค์

ในบทความนี้เราจะสร้างการกำหนดค่าที่อัปเดต SPICE ของ QuickSight ที่จะทำงานหลังจาก Glue Crawler ทำการรวบรวมข้อมูลและการสร้างตารางเสร็จแล้ว
บทความนี้อ้างอิงจากบล็อกของทาง AWS Event-driven refresh of SPICE datasets in Amazon QuickSight [1]
โดยบทความนี้จะคล้ายกับบทความก่อนหน้า แต่จะมีการอัปเดตเนื้อหา SPICE ของ QuickSight หลังจากการรวบรวมข้อมูลเสร็จสิ้นเพิ่มเข้ามา

ซึ่งในบทความนี้จะมีแผนผังการตั้งค่าตามนี้
https://devio2023-media.developers.io/wp-content/uploads/2024/04/blog_glue_trigger_refresh_qs_spice_architecture_diagram-1.png
ใน Step 1 -2 ของแผนภาพจะคล้ายกับบทความด้านบน และถึงแม้ว่าส่วนใหญ่เราจะใช้คำสั่ง CDK แต่ QuickSight ยังคงต้องใช้ CLI กับ Management console ในการตั้งค่า
อย่างไรก็ตาม เราสามารถสร้างการตั้งค่าเดียวกันนี้ใน Management console และอัปเดต SPICE โดยอัตโนมัติหลังจากทำการรวบรวมข้อมูลและการสร้างตารางเสร็จแล้ว

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

  • บัญชี AWS ที่มีการตั้งค่า QuickSight เรียบร้อยแล้ว
  • สิทธิในการสร้าง IAM Role, Policy และ Cloud9
  • คำสั่ง cdk bootstrap ที่ถูกรันใน region ที่เราต้องการใช้งาน
  • วิธีการสร้าง IAM Role และ Policy และการใช้ AWS CLI

Step 1: เตรียมสภาพแวดล้อมใน Cloud9 สำหรับการใช้งาน CDK

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

  • AWSCloud9SSMInstanceProfile: เพื่อเชื่อมต่อไปยัง Cloud9 ผ่านทาง Session Manager
  • AmazonS3FullAccess: สำหรับการอัปโหลดและลบไฟล์ใน Amazon S3
  • Inline Policy ตามด้านล่างนี้: เพื่อให้มีสิทธิ์ในการ deploy CDK และเริ่มใช้งาน AWS Glue Crawler, QuickSight และ 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": "CfnDescribe",
                "Effect": "Allow",
                "Action": [
                    "cloudformation:DescribeStacks"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Sid": "QS",
                "Effect": "Allow",
                "Action": [
                    "quicksight:*"
                ],
                "Resource": [
                    "*"
                ]
            }
        ]
    }

    จากนั้นสร้าง Cloud9 และติดตั้ง role ไปที่ EC2 instance โดยอิงจากบทความด้านล่าง

Step 2: สร้าง resource ต่างๆที่นอกเหนือจาก QuickSight

เข้าไปที่ Cloud9 แล้วใช้คำสั่งตามด้านล่าง เพื่อโคลนโปรเจกต์ตาม ลิงก์ และติดตั้งแพ็คเกจที่จำเป็น

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

หลังจากที่กำหนดตัวแปรที่ใช้ CDK แล้ว
ให้สร้าง resources โดยใช้คำสั่ง CDK

# กำหนด dataset id ของ QuickSight และการสร้าง resource
export QS_DATA_SET_ID='blog-glue-trigger-refresh-qs-spice-dataset'
cdk deploy --require-approval never

หลังจากใช้คำสั่งด้านบนจะได้ผลลัพธ์ตามนี้

✨ Total time: 133.24s

เก็บรายชื่อ resource จาก CloudFormation (S3 bucket, Glue Crawler และ Athena work group) ไว้ในตัวแปรโดยใช้คำสั่งด้านล่าง

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')
athena_work_group_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueAthenaWorkGroupName`].OutputValue')

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

aws s3 cp ./s3_test_data/data/test1 "s3://${bucket_name}/data/test1"
aws glue start-crawler --name "${crawler_name}"

ข้อมูลของไฟล์ s3_test_data/data/test1 ที่ถูกอัปโหลดจะประกอบไปด้วยข้อมูลตามด้านล่างและจะถูกนำไปใช้ใน QuickSight ภายหลัง

{"timestamp": "2024-01-01 00:00:00", "metric1": 1, "dimension1": "foo"}
{"timestamp": "2024-01-01 00:00:00", "metric1": 3, "dimension1": "bar"}
{"timestamp": "2024-01-01 00:01:00", "metric1": 1, "dimension1": "foo"}
{"timestamp": "2024-01-01 00:01:00", "metric1": 1, "dimension1": "bar"}

Step 3: สร้าง QuickSight

ตั้งแต่ขั้นตอนนี้ไป เราจะใช้ทั้ง CLI และ Management console
เริ่มด้วยการให้สิทธิ์ QuickSight เพื่อเข้าถึง S3 ที่สร้างจากคำสั่ง CDK
คลิก Manage QuickSight ที่ด้านบนขวาของ management console จากนั้นคลิก Security & permissions

⚠️ เราอาจจะต้องเปลี่ยน region เพื่อตรวจสอบ Security & permissions ขึ้นอยู่กับการตั้งค่าใน QuickSight
ซึ่งในบทความนี้เราจะตั้ง region เป็น N.Virginia จากนั้นคลิก Manage QuickSight
https://devio2023-media.developers.io/wp-content/uploads/2024/04/manage_quick_sight.png
คลิกที่ Manage เพื่อตั้งค่าให้ QuickSight เข้าถึงบริการต่างๆของ AWS
https://devio2023-media.developers.io/wp-content/uploads/2024/04/manage_permission_qs.png
อนุญาตให้เข้าถึง S3 bucket ที่ถูกสร้างด้วย CDK จากนั้นให้กลับไปที่ region เดิม
https://devio2023-media.developers.io/wp-content/uploads/2024/04/qs_permission_s3.png
การอนุญาตนี้จะทำให้ QuickSight สามารถ query ข้อมูลจาก S3 โดยการใช้ Athena ได้

ต่อไปให้ใช้คำสั่งนี้ใน Cloud9 เพื่อรับ ID จากบัญชี AWS

export AAI=$(aws sts get-caller-identity --query "Account" --output text)

จากนั้นใน management console ให้คัดลอก username ของ QuickSight โดยอยู่ที่มุมบนขวาตามรูปด้านล่าง
https://devio2023-media.developers.io/wp-content/uploads/2024/04/blog_glue_trigger_refresh_qs_spice_qs_username.png
ใช้คำสั่งตามนี้ เพื่อใส่ username ของ QuickSight ไว้ในตัวแปร

# หลังจากใช้คำสั่งนี้แล้ว ให้ใส่ username ที่เพิ่งคัดลอกมา จากนั้นกด Enter
read -s QUICKSIGHT_USERNAME; export QUICKSIGHT_USERNAME

ต่อจากนี้ไปเราจะสร้าง resource ทั้งหมดของ QuickSight โดยใช้ CLI
โดยเราสามารถสร้าง Dataset ด้วยการใช้ CLI หรืออีกวิธีคือสร้างด้วย management console และอัปเดต SPICE จาก Lambda
ซึ่งเราจะสร้าง resource 4 อย่างประกอบด้วย data source, dataset, analysis และ dashboard ด้วยขั้นตอนดังต่อไปนี้
1. ใช้ไฟล์ jsonnet ประกอบกันเพื่อสร้างไฟล์ JSON ที่กำหนดค่า resource ของ QuickSight
2. สร้าง resource ของ QuickSight ด้วย aws quicksight create- --cli-input-json

ไฟล์ JSON ถูกสร้างขึ้นโดยอิงตามบทความนี้[2]

เริ่มด้วยการสร้าง data source โดยการเปลี่ยนพื้นที่เก็บ qs_jsonnet/create-data-source.jsonnet ให้เป็น JSON ด้วย jsonnet
แล้วให้ jsonnet อนุญาตให้ใช้ตัวแปร ดังนั้นเราจึงสามารถใส่ค่าที่หลากหลายซึ่งขึ้นอยู่กับ environment (อย่างเช่น ID ของ AWS) ลงไปในตัวแปร
เนื่องจาก jsonnet ไม่สามารถอ่านตัวแปรสภาพแวดล้อม ดังนั้นเราจึงใช้อาร์กิวเมนต์ --ext-str เพื่อส่งผ่านค่า

docker run \
	-v $(pwd):/app \
	-w /app \
	bitnami/jsonnet:latest \
	--ext-str "AWS_ACCOUNT_ID=$AAI" \
	--ext-str "QUICKSIGHT_USERNAME=$QUICKSIGHT_USERNAME" \
	--ext-str "ATHENA_WORKGROUP=$athena_work_group_name" \
	qs_jsonnet/create-data-source.jsonnet > jsonnet.out/create-data-source.json
aws quicksight create-data-source --cli-input-json file://jsonnet.out/create-data-source.json

สร้าง dataset, analysis และ dashboard โดยใช้วิธีเดียวกัน

# สร้าง dataset
docker run \
	-v $(pwd):/app \
	-w /app \
	bitnami/jsonnet:latest \
	--ext-str "AWS_ACCOUNT_ID=$AAI" \
	--ext-str "QUICKSIGHT_USERNAME=$QUICKSIGHT_USERNAME" \
	--ext-str "DATA_SET_ID=$QS_DATA_SET_ID" \
	qs_jsonnet/create-data-set.jsonnet > jsonnet.out/create-data-set.json
aws quicksight create-data-set --cli-input-json file://jsonnet.out/create-data-set.json

# สร้าง analysis
docker run \
	-v $(pwd):/app \
	-w /app \
	bitnami/jsonnet:latest \
	--ext-str "AWS_ACCOUNT_ID=$AAI" \
	--ext-str "QUICKSIGHT_USERNAME=$QUICKSIGHT_USERNAME" \
	qs_jsonnet/create-analysis.jsonnet > jsonnet.out/create-analysis.json
aws quicksight create-analysis --cli-input-json file://jsonnet.out/create-analysis.json

# สร้าง dashboard
docker run \
	-v $(pwd):/app \
	-w /app \
	bitnami/jsonnet:latest \
	--ext-str "AWS_ACCOUNT_ID=$AAI" \
	--ext-str "QUICKSIGHT_USERNAME=$QUICKSIGHT_USERNAME" \
	qs_jsonnet/create-dashboard.jsonnet > jsonnet.out/create-dashboard.json
aws quicksight create-dashboard --cli-input-json file://jsonnet.out/create-dashboard.json

ตรวจสอบที่หน้าจอ QuickSight ของ management console เพื่อดู resource ที่เราสร้าง

blog-glue-trigger-refresh-qs-spice ถูกสร้างไว้ที่ dataset
https://devio2023-media.developers.io/wp-content/uploads/2024/04/qs_dataset.png
analysis จะถูกสร้างไว้ที่ Analyzes โดยมีชื่อเหมือนกับ dataset
https://devio2023-media.developers.io/wp-content/uploads/2024/04/qs_analyses.png
และ dashboard ก็ถูกสร้างไว้ที่ Dashboards
https://devio2023-media.developers.io/wp-content/uploads/2024/04/qs_dashboard.png
ตอนนี้ resource ที่จำเป็นก็พร้อมใช้งานแล้ว

Step 4: ใช้งาน Glue Crawler เพื่อตรวจสอบว่า SPICE มีการอัปเดต

เริ่มจากใช้คำสั่งนี้ใน Cloud9 เพื่อสร้างไฟล์ใน S3 และเรียกใช้งาน Glue Crawler

aws s3 cp ./s3_test_data/data/test2 "s3://${bucket_name}/data/test2"
aws glue start-crawler --name "${crawler_name}"

เมื่อรวบรวมข้อมูลเรียบร้อยแล้ว EventBridge จะเรียก Lambda โดยอิงตามไฟล์นี้ ใน Lambda นี้ SPICE จะถูกอัปเดตโดยใช้ SDK ของ QuickSight อย่างที่แสดงด้านล่าง

response = quicksight.create_ingestion(AwsAccountId=account_id, DataSetId=data_set_id,
                                                   IngestionId=ingestion_id)

จากนั้นในหน้า management console คลิก QuickSight > Datasets > blog-glue-trigger-refresh-qs-spice > Refresh ซึ่งจะใช้เวลาประมาณ 1 นาทีในการประมวลผล
เมื่อรวบรวมข้อมูลเสร็จแล้ว Refresh จะปรากฏตามรูปด้านล่าง
https://devio2023-media.developers.io/wp-content/uploads/2024/04/qs_refresh_spice.png
ทันทีที่ Refresh เรียบร้อยแล้ว ให้ตรวจสอบที่ Dashboard
เมื่อมีการอัปเดต SPICE ข้อมูลที่แสดงใน Dashboard ก็จะอัปเดตเช่นกันตามรูปด้านล่าง
https://devio2023-media.developers.io/wp-content/uploads/2024/04/qs_dashboard_after_refresh.png

Step 5: ลบ resource

ลบ resource ทีละรายการโดยใช้คำสั่งต่อไปนี้สำหรับส่วนที่ถูกสร้างด้วย CDK และส่วนที่ยังไม่เปิดใช้งาน

# ลบ resource ทั้งหมดใน QuickSight
aws quicksight delete-dashboard --aws-account-id $AAI --dashboard-id blog-glue-trigger-refresh-qs-spice-dashboard
aws quicksight delete-analysis --aws-account-id $AAI --analysis-id blog-glue-trigger-refresh-qs-spice-analysis
aws quicksight delete-data-set --aws-account-id $AAI --data-set-id blog-glue-trigger-refresh-qs-spice-dataset
aws quicksight delete-data-source --aws-account-id $AAI --data-source-id blog-glue-trigger-refresh-qs-spice-data-source

# ลบไฟล์ทั้งหมดใน S3 bucket เพื่อให้ CDK สามารถลบ S3 ได้
aws s3 rm "s3://${bucket_name}" --recursive
cdk destroy --force

สรุป

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

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

Glue Crawler のクローリングが完了したら Lambda function から QuickSight の SPICE を更新する(ภาษาญี่ปุ่น)

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