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

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

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

บทความนี้แปลมาจากบทความที่เป็นภาษาญี่ปุ่นที่ชื่อว่า 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 を更新する(ภาษาญี่ปุ่น)

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

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.