สารบัญ (Table of Content)
- บทนำ
- แผนผังของระบบ
- การประเมินราคาเบื้องต้น
- ข้อจำกัดของตัวอย่างที่ควรรู้
- ขั้นตอนที่ 1: นำข้อมูลตัวอย่างเข้า Amazon S3
- ขั้นตอนที่ 2: สร้าง Amazon Elasticsearch Service domain
- ขั้นตอนที่ 3: สร้าง AWS Cloud9 และเตรียม configuration
- ขั้นตอนที่ 4: แก้ไข application configuration ให้พร้อมกับการใช้งาน
- ขั้นตอนที่ 5: Execute import code บน AWS Cloud9
- ขั้นตอนที่ 6: ตรวจสอบข้อมูลที่ import ที่ Amazon Elasticsearch Service
บทนำ
หลาย ๆ ครั้ง ผู้ใช้งานมีความต้องการที่จะนำข้อมูล จากระบบฐานข้อมูลแบบตาราง (RDBMS) ซึ่งอยู่ในรูปแบบ CSV file นำเข้า (import) ไปยังระบบฐานข้อมูลแบบ NoSQL อย่างเช่น Amazon Elasticsearch Service เป็นต้น และผู้ใช้งานพบว่า Amazon Elasticsearch Service ไม่ได้มี feature อย่างเช่นการ import โดยตรง ทำให้ผู้ใช้งาน พบปัญหาเกี่ยวกับการเขียน application ขึ้นมาเอง และวิธีการกำหนดสิทธิต่าง ๆ
ในบทความนี้จะเป็นตัวอย่างของการนำข้อมูล CSV file เข้า Amazon Elasticsearch Service โดยมีวิธีการ รวมถึงตัวอย่าง code ที่ผู้ใช้งานสามารถนำไปปรับใช้ให้เหมาะสมกับข้อมูลที่ผู้ใช้งานต้องการได้อีกด้วย
แผนผังของระบบ (Architecture Diagram)
การประเมินราคาเบื้องต้น (Cost Estimation)
- ราคา Cluster ของ Amazon Elasticsearch Service - Amazon Elasticsearch Service Pricing
- ราคา Storage ของ S3 - Amazon S3 Pricing
- (option 1) ราคาของ AWS Cloud9 Instance - AWS Cloud9
- (option 2) ราคาเครื่องของ Amazon EC2 - Amazon EC2 Pricing
ℹ️ หมายเหตุ: อาจจะมีราคาอีกนิดหน่อยในส่วนของ Network ที่ยังไม่ได้รวม
ข้อจำกัดของตัวอย่างที่ควรรู้
- CSV file จะต้องมี header อยู่ที่ row แถวแรกของ file
- หากผู้ใช้เลือก Amazon EC2 ในการติดตั้ง application จะต้องทำการติดตั้ง Python Binary version 3.7 เป็นต้นไปด้วย แต่หากใช้ AWS Cloud9 จะทำการติดตั้งไว้ให้เรียบร้อยแล้ว
- ผู้ใช้งานสามารถเลือกใช้งาน Internet Gateway (IGW) หรือ VPC S3 Gateway Endpoint สำหรับเชื่อมต่อระหว่าง Amazon S3 กับ Internal VPC services ได้
- ในตัวอย่าง เป็นการเลือกติดตั้ง Amazon Elasticsearch Service บน VPC และเปิดการใช้งาน "Fine-grained Access Control" ผ่าน HTTP สำหรับ Username และ Password
ขั้นตอนที่ 1: นำข้อมูลตัวอย่างเข้า Amazon S3
- Download ข้อมูลตัวอย่าง SaaS-Sales.csv
- Upload ข้อมูลตัวอย่างขึ้น S3 (e.g. nutchanon-es-importer)
ขั้นตอนที่ 2: สร้าง Amazon Elasticsearch Service domain
- สร้าง Amazon Elasticsearch cluster พร้อมกับปรับ configuration ด้านความปลอดภัยให้เหมาะสมตามนี้
- กำหนด access control policy ใน "Fine-grained Access Control" เพื่อให้ user สามารถเขียนข้อมูลใน index ที่กำหนดได้
- เลือก deploy บน VPC และกำหนด security group สำหรับให้ Cloud9 หรือ EC2
ขั้นตอนที่ 3: สร้าง AWS Cloud9 และเตรียม configuration
- สร้าง AWS Cloud9 environment สำหรับใช้งาน
- ตรวจสอบ version ของ python ผ่าน command line โดยคาดหวังว่าจะเจอ Python version 3.7+
python3 -V
- ทำการ download code ตัวอย่างจาก Github:load-s3-to-es[1]
git clone https://github.com/nutchanon-l/load-s3-to-es.git
- ทำการติดตั้ง Python packages สำหรับ pre-requisite ที่จำเป็นผ่าน
pip3 install -r load-s3-to-es/requirements.txt
- ทำการสร้าง IAM Role สำหรับ AWS Cloud9 ให้สามารถดึงข้อมูลจาก Amazon S3 ด้วย IAM Policy ดังตัวอย่าง (อย่าลืมเปลี่ยน Amazon S3 Bucket)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3ReadObject",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::nutchanon-es-importer",
"arn:aws:s3:::nutchanon-es-importer/*"
]
}
]
}
- ทำการ attach IAM role ไปยัง AWS Cloud9 Instance ผ่าน Amazon EC2 Console
ขั้นตอนที่ 4: แก้ไข application configuration ให้พร้อมกับการใช้งาน
- แก้ไข config.json ไฟล์ (อย่าลืมเปลี่ยน Elasticsearch endpoint ด้วย)
{
"s3": {
"bucket": "nutchanon-es-importer",
"prefix": "/"
},
"elasticsearch": {
"url": ["https://vpc-nutcha-es-01-jozw26jnqvxcufjccrpcmiowam.ap-southeast-1.es.amazonaws.com"],
"port": 443,
"username": "<your_username>",
"password": "<your_password>"
}
}
- แก้ไข metadata.json ไฟล์
{
"index": {
"es_index_as_filename": true,
"es_index_name": ""
},
"data": {
"headers": ["Row ID", "Order ID", "Order Date", "Date Key", "Contact Name", "Country", "City", "Region", "Subregion", "Customer", "Customer ID", "Industry", "Segment", "Product", "License", "Sales", "Quantity", "Discount", "Profit"],
"id_field": "Row ID"
}
}
ขั้นตอนที่ 5: Execute import code บน AWS Cloud9
- ทำการรัน code ด้วย command ดังต่อไปนี้
cd load-s3-to-es
python3 s3-to-es.py
- รอจนสุดท้ายขึ้นว่า
INFO: Bulk write succeed: 9994 documents
ขั้นตอนที่ 6: ตรวจสอบข้อมูลที่ import ที่ Amazon Elasticsearch Service
- ตรวจสอบ index ที่ทำการ import จาก command ดังนี้ (อย่าลืมเปลี่ยน Elasticsearch endpoint ด้วย)
$ curl -u <your_username>:<your_password> -X GET "https://vpc-nutcha-es-01-jozw26jnqvxcufjccrpcmiowam.ap-southeast-1.es.amazonaws.com/_cat/indices?v&s=index"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana_1 cJyYpOa0RkOmvZHKCFAgMw 1 1 0 0 416b 208b
green open .opendistro_security 15W1rxD9TJOTfuld6W_p1g 1 2 9 4 172.9kb 59.6kb
green open saas-sales KvhEecP2QvCO4UfThBki_A 5 1 9994 0 8.4mb 4.1mb
- ทดสอบการค้นหาข้อมูลด้วย search API ผ่าน "saas-sales" index (อย่าลืมเปลี่ยน Elasticsearch endpoint ด้วย)
curl -u <your_username>:<your_password> -X GET "https://vpc-nutcha-es-01-jozw26jnqvxcufjccrpcmiowam.ap-southeast-1.es.amazonaws.com/saas-sales/_search"
Top comments (1)
Good one!