วิธีการสร้างกราฟข้อมูลจาก Amazon DynamoDB ด้วย Amazon QuickSight
Tags: aws, awsthai, quicksight, dynamodb
Published: 2021-09-14 03:20:25

## สารบัญ (Table of Content)
1. [บทนำ](#intro)
2. [แผนผังของระบบ](#diagram)
3. [การประเมินราคาเบื้องต้น](#cost)
4. [ขั้นตอนที่ 1: เตรียมความพร้อมของ AWS Services](#step1)
5. [ขั้นตอนที่ 2: สร้าง Amazon Athena Data source](#step2)
6. [ขั้นตอนที่ 3: ทดลอง Query ข้อมูล DynamoDB ผ่าน Amazon Athena](#step3)
7. [ขั้นตอนที่ 4: เชื่อมต่อ Amazon QuickSight กับ Amazon Athena ด้วย Federated Query feature](#step4)
8. [ขั้นตอนที่ 5: สร้าง QuickSight Dataset จาก DynamoDB ผ่าน Athena](#step5)
9. [ขั้นตอนที่ 6: ทดลองสร้าง QuickSight Analyse จาก DynamoDB Dataset](#step6)
10. [บทสรุป](#summary)

<a name="intro"></a>
## บทนำ
บางครั้งในองค์กร อาจจะมีความต้องการที่จะนำข้อมูลที่อยู่ในระบบฐานข้อมูล (database) อย่าง Amazon DynamoDB, Amazon DocumentDB, Apache HBase, และอื่น ๆ นำมาแสดงผลในรูปของกราฟ (graph) หรือสร้าง dashboard เพื่อวิเคราะห์ หา insights จากข้อมูล

ทาง AWS มี service ที่ใช้สำหรับทำ Business Intelligent (BI) tool ชื่อว่า Amazon QuickSight โดยสามารถใช้ service ในการสร้างกราฟหรือ dashboard จากฐานข้อมูลที่รองรับได้ เช่น Amazon RDS and Aurora, Amazon S3, Amazon Athena, และอื่น ๆ 

แต่ Amazon QuickSight ไม่ได้มี native support ระบบฐานข้อมูลแบบ NoSQL เช่น Amazon DynamoDB, Amazon DocumentDB เป็นต้น ทำให้ผู้ใช้งานต้องทำการย้ายข้อมูลไปยังถังข้อมูลอื่น ๆ ซึ่งจะเกิด overhead ในส่วนของ data synchronization และ การจัดการ application ที่ใช้ย้ายข้อมูล

บทความนี้จะแสดงวิธีการเชื่อมต่อระหว่าง Amazon QuickSight ไปยังระบบฐานข้อมูลแบบ NoSQL เช่น Amazon DynamoDB โดยตรง โดยไม่มีการย้ายข้อมูลจากต้นทาง และทำให้ข้อมูลที่แสดงอยู่ในกราฟ มีความถูกต้องเหมือนข้อมูลต้นทาง
<a name="diagram"></a>
## แผนผังของระบบ (Architecture Diagram)
![Architecture Diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r95r7hnbyynmf4j2vyud.png)

<a name="cost"></a>
## การประเมินราคาเบื้องต้น (Cost Estimation)
* ราคา Storage และ Read Capacity Unit (RCU) ของ DynamoDB - [Amazon DynamoDB Pricing](https://aws.amazon.com/dynamodb/pricing/)
* ราคา Data Scan ของ Athena - [Amazon Athena Pricing](https://aws.amazon.com/th/athena/pricing/)
* ราคา User และ SPICE ของ QuickSight - [Amazon QuickSight Pricing](https://aws.amazon.com/quicksight/pricing/)
* ราคา Storage ของ S3 - [Amazon S3 Pricing](https://aws.amazon.com/s3/pricing)

> :information_source:  หมายเหตุ: อาจจะมีราคาอีกนิดหน่อยในส่วนของ Lambda, Network ที่ยังไม่ได้รวม

<a name="step1"></a>
## ขั้นตอนที่ 1: เตรียมความพร้อมของ AWS Services
* เริ่มใช้งาน Amazon Athena โดยต้องเป็น engine version 2 และกำหนด S3 Result Data bucket (e.g. nutchanon-athena-query-results)
![AthenaS3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ye01n9o87zsf59t6s2zn.png)
* สร้าง Amazon S3 สำหรับ Spill Bucket Data ของ Athena
![Spill](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oal0s3mw6nlnevb02cqc.png)
* เริ่มใช้งาน Amazon QuickSight โดยการ Setup - [Setting Up for Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/setting-up.html)
![QuickSightStart](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsirfu1rctrua2x9xwzn.png)
* ตรวจสอบข้อมูลใน DynamoDB Table (e.g.quicksight-ddb) ว่าพร้อมสำหรับใช้งาน
![DDBData](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ld0ayp6c54bua1qjttfv.png)

> :information_source:  หมายเหตุ: โดยหากสำหรับผู้ที่ยังไม่มีข้อมูล DynamoDB ที่ใช้ในการทดลองสามารถดูวิธีการนำข้อมูลตัวอย่างจาก CSV file เข้าใน DynamoDB Table ได้จาก [วิธีการนำข้อมูล CSV จาก Amazon S3 เข้า Amazon DynamoDB](https://dev.to/awscommunity-asean/csv-amazon-s3-amazon-dynamodb-3i2f)

<a name="step2"></a>
## ขั้นตอนที่ 2: สร้าง Amazon Athena Data source
* สร้าง Data Source ใหม่จาก "Connect data source"
![AthenaData](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gkvfsggc8bajzan6qxkn.png)
* เลือก "Query a data source" และ "Amazon DynamoDB"
![AtDataSrc](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7u8bs46kvkvbrnrvg3ad.png)
* เลือก "Configure new AWS Lambda function" เพื่อสร้าง Lambda Connector
![Lambda Connector](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j6ubq2qqcol4e8218xvt.png)
* เลือก "SpillBucket", "AthenaCatalogName" และยืนยัน "Custom IAM Roles" แล้วกด "Deploy" จากนั้นระบบจะทำการสร้าง Cloudformation สำหรับ Lambda Connector ให้
![LambdaConfig](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r2wk9f5jbpzyu03e4axk.png)
* กลับมาเลือก Lambda Connector ที่เพิ่งสร้าง (อาจจะต้องกด refresh 1 ครั้ง) แล้วตั้งชื่อ catalog ให้เรียบร้อย
![Lambda Connector2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aejudjaod01k4z78alqu.png)

<a name="step3"></a>
## ขั้นตอนที่ 3: ทดลอง Query ข้อมูล DynamoDB ผ่าน Amazon Athena
* เลือก "Data Source" เป็น catalog name ที่เพิ่งสร้าง หลังจากนั้นจะปรากฏข้อมูล table ของ DynamoDB ให้ทำการ select ข้อมูลดู
![AthenaDDB](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ymuno0t7uvrdjm8towj4.png)

<a name="step4"></a>
## ขั้นตอนที่ 4: เชื่อมต่อ Amazon QuickSight กับ Amazon Athena ด้วย Federated Query feature
* เปลี่ยน QuickSight region ไปที่ N.Virginia เพื่อแก้ไข configuration และเลือกไปที่ "Manage QuickSight"
![QSRegion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yd8b95u33l13d0f2kvh3.png)
* จองข้อมูล SPICE Capacity ให้เรียบร้อย (อ่านว่า SPICE คืออะไร ได้จาก [Managing SPICE Capacity](https://docs.aws.amazon.com/quicksight/latest/user/managing-spice-capacity.html)
![QSSPICEAllocate](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g46tuju17simz020gvsi.png)
* ในส่วนของ "Security & Permission" ให้เลือก "Add or Remove"
![QSAdminSec](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4zfz0knssdxgr19bu5cx.png)
* ให้เลือก Amazon Athena (หากเลือกอยู่แล้ว ให้กด 2 ครั้ง) จะมีหน้าต่างให้เลือก permission สำหรับ Amazon S3 ให้เลือก Athena Spill และ Result Data Bucket พร้อมกับ write permission
![QSPermission](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mal9fmynwzu4ehnh03nb.png)
![QSS3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dplbglzzqggqu31xuaqp.png)
* เปลี่ยน QuickSight region ไปที่ Singapore (หรือต้นทางที่ใช้งาน) เพื่อเตรียมพร้อมสำหรับการสร้าง Dataset
* กลับไปที่หน้า AWS Management Console และไปยัง "IAM" Service และไปยัง IAM Role
* เพิ่ม policy ที่ IAM Role "aws-quicksight-s3-consumers-role-v0" ที่ทางระบบจะสร้างให้อัตโนมัติหลังจาก grant S3 permission ใน QuickSight
![QSIAMRole](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/as7jsb2eyhe84ynmecgw.png)
โดยทำการเพิ่ม "inline policy" ชื่อ "InvokeAthenaFedereted" ตาม JSON ด้านล่าง

> :warning:  อย่าลืมแก้ "aws_account_id" และ Lambda Function name ที่กำหนดไว้ในขั้นตอนที่ 2 (ตัว "AthenaCatalogName")
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "InvokeAthenaFedereted",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:ap-southeast-1:<aws_account_id>:function:dynamocatalog"
        }
    ]
}
```

<a name="step5"></a>
## ขั้นตอนที่ 5: สร้าง QuickSight Dataset จาก DynamoDB ผ่าน Athena
* เลือกสร้าง Dataset จาก Athena Data Source โดยให้ตั้งชื่อ connection เช่น "athena-dynamodb"
![QSAthenaDDB](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zl43y44pat7g4udhebj6.png)
* เลือก catalog name ที่สร้างเอาไว้ (ชื่อเดียวกับที่สร้างไว้ในขั้นตอนที่ 2) และ table ให้เรียบร้อย
![QSCatalog](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eo5j1bxs9rk24wx7i3gd.png)
* เลือกสร้างข้อมูลจาก SPICE
![QSSPICE](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/25fu73ywfcogbr4ffb52.png)
* รอจน import data เข้าไปที่ SPICE ให้เรียบร้อย
![QSSPICE/](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3mzvhrxsashep79rspig.png)
* เปลี่ยน data type ของแต่ละ column ให้เหมาะสมกับต้นทาง ซึ่งจะมีผลกับการนำไปสร้างกราฟต่อ ๆ ไป
![QSDataType](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oee5q3kdtklry6m2ozap.png)

<a name="step6"></a>
## ขั้นตอนที่ 6: ทดลองสร้าง QuickSight Analyse จาก DynamoDB Dataset
* ทดลองสร้างกราฟ จะพบว่า สามารถสร้างกราฟต่าง ๆ จากข้อมูล DynamoDB ได้โดยตรง
![QSAnalyse](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/en839wel301qbs9w7bc0.png)

> :information_source:  หมายเหตุ: การเปลี่ยน data type ของแต่ละ column ใน dataset มีผลต่อการสร้างกราฟอย่างมาก

<a name="summary"></a>
## บทสรุป
Amazon QuickSight สามารถเชื่อมต่อโดยตรงกับระบบฐานข้อมูล หรือ data source ที่ไม่ได้ support โดยตรงผ่าน Amazon Athena Federeted Query ได้ โดยผู้ใช้งานสามารถสร้าง Lambda Connector ไปเชื่อมต่อระบบฐานข้อมูลอย่าง Amazon DynamoDB หรือ Amazon DocumentDB ได้

ซึ่งจะช่วยให้ผู้ใช้งาน สามารถสร้างกราฟจากข้อมูลต่าง ๆ ที่อยู่บนระบบฐานข้อมูลโดยไม่จำเป็นต้องย้ายข้อมูลไปที่อื่น ไม่จำเป็นต้องจัดการ application ที่ใช้สำหรับย้ายข้อมูล และยังได้ข้อมูลที่นำมาแสดงผลแบบ real-time อีกด้วย

![CastleArm](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u3pp3cc9du87hqg20ugb.jpg)

### แหล่งอ้างอิง
[1] https://aws.amazon.com/blogs/big-data/accessing-and-visualizing-data-from-multiple-data-sources-with-amazon-athena-and-amazon-quicksight/
[2] https://aws.amazon.com/blogs/big-data/query-any-data-source-with-amazon-athenas-new-federated-query/