DEV Community

7 1

วิธีการนำข้อมูล CSV จาก Amazon S3 เข้า Amazon DynamoDB

สารบัญ (Table of Content)

  1. บทนำ
  2. แผนผังของระบบ
  3. การประเมินราคาเบื้องต้น
  4. ข้อจำกัดของตัวอย่างที่ควรรู้
  5. ขั้นตอนที่ 1: นำข้อมูลตัวอย่างเข้า Amazon S3
  6. ขั้นตอนที่ 2: สร้าง DynamoDB Table และเตรียม configuration
  7. ขั้นตอนที่ 3: สร้าง Lambda Function และเตรียม configuration
  8. ขั้นตอนที่ 4: Copy python code สำหรับ import ไปยัง Lambda
  9. ขั้นตอนที่ 5: Execute Lambda Function
  10. ขั้นตอนที่ 6: ตรวจสอบข้อมูลที่ import ที่ DynamoDB
  11. วิธีการอื่น ๆ เพิ่มเติม

บทนำ

หลาย ๆ ครั้ง ผู้ใช้งานมีความต้องการที่จะนำข้อมูล จากระบบฐานข้อมูลแบบตาราง (RDBMS) ซึ่งอยู่ในรูปแบบ CSV file นำเข้า (import) ไปยังระบบฐานข้อมูลแบบ NoSQL อย่างเช่น Amazon DynamoDB เป็นต้น และผู้ใช้งานพบว่า Amazon DynamoDB ไม่ได้มี feature อย่างเช่นการ import โดยตรง ทำให้ผู้ใช้งาน พบปัญหาเกี่ยวกับการเขียน application ขึ้นมาเอง และวิธีการกำหนดสิทธิต่าง ๆ

ในบทความนี้จะเป็นตัวอย่างของการนำข้อมูล CSV file เข้า Amazon DynamoDB โดยมีวิธีการ รวมถึงตัวอย่าง code ที่ผู้ใช้งานสามารถนำไปปรับใช้ให้เหมาะสมกับข้อมูลที่ผู้ใช้งานต้องการได้อีกด้วย

แผนผังของระบบ (Architecture Diagram)

Architect

การประเมินราคาเบื้องต้น (Cost Estimation)

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

ข้อจำกัดของตัวอย่างที่ควรรู้

  • CSV file จะต้องมี header อยู่ที่ row แถวแรกของ file
  • การกำหนด partition key ของ DynamoDB จะต้องชื่อตรงกับ column header name ที่อยู่ใน file แบบ case-sensitive (ตัวเล็กตัวใหญ่มีผล)
  • Lambda resource และ timeout configuration ควรปรับเปลี่ยนให้เหมาะสมกับขนาดของข้อมูล
  • IAM Policy ของ Lambda Execution Role ควรกำหนดให้เหมาะสม เมื่อนำไปใช้งานจริง

ขั้นตอนที่ 1: นำข้อมูลตัวอย่างเข้า Amazon S3

  • Download ข้อมูลตัวอย่าง SaaS-Sales.csv
  • Upload ข้อมูลตัวอย่างขึ้น S3 (e.g. nutchanon-ddb-importer) UploadS3

ขั้นตอนที่ 2: สร้าง DynamoDB Table และเตรียม configuration

  • สร้าง DynamoDB Table ชื่อ "quicksight-ddb" โดยมี parition key ชื่อ "Row ID" (ตัวเล็กตัวใหญ่ มีผลต่อข้อมูลตัวอย่าง) และปรับ capacity mode เป็น On-Demand DDBCreation DDBCapacity

ขั้นตอนที่ 3: สร้าง Lambda Function และเตรียม configuration

  • สร้าง Lambda Function ด้วย python 3.9 (e.g. ddb-csv-importer)
  • ปรับ Lambda resource และ timeout configuration ให้เป็น 256MB และ timeout 15 นาที LambdaConfig
  • จากนั้นเพิ่ม permission ให้ Lambda Execution Role สามารถอ่านข้อมูลจาก S3 และเขียนข้อมูลเข้า DynamoDB ได้ (DDBBatchWrite)

⚠️ สำหรับการทดสอบเท่านั้น ในการใช้งานต้อง จะต้องมีการระบุ IAM policy ให้ restrict เฉพาะเท่าที่ใช้งานเท่านั้น

LambdaPermission
S3Policy
DDBWritePolicy

ขั้นตอนที่ 4: Copy python code สำหรับ import ไปยัง Lambda

  • Copy Python Lambda code ตามด้านล่าง แล้วอย่าลืมเปลี่ยน configuration "s3_csv_bucket", "s3_csv_data", "ddb_table_src" ให้เป็นของผู้ใช้งานด้วย
import boto3
import os
import json
import csv
import codecs
import json

s3 = boto3.client('s3')
ddb = boto3.resource('dynamodb')
s3_csv_bucket = "nutchanon-ddb-importer" # Source Amazon S3 bucket
s3_csv_data = "SaaS-Sales.csv" # Source Amazon S3 object file
ddb_table_src = "quicksight-ddb" # Target Amazon DynamoDB Table

def lambda_handler(event, context):
    # get data
    obj = s3.get_object(Bucket= s3_csv_bucket, Key= s3_csv_data)

    # json data
    ddb_data = []
    for rows in csv.DictReader(codecs.getreader("utf-8-sig")(obj[u'Body'])):
        ddb_data.append(rows)

    # define dynamodb table
    ddb_table = ddb.Table(ddb_table_src)

    # batch write data to dynamodb table
    with ddb_table.batch_writer() as batch:
        for item in ddb_data:
            batch.put_item(Item=item)

    return None
Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 5: Execute Lambda Function

  • รัน execute บน Lambda function ด้วย test event ใด ก็ได้ รอจน return success LambdaResult

ขั้นตอนที่ 6: ตรวจสอบข้อมูลที่ import ที่ DynamoDB

  • ตรวจสอบข้อมูลใน DynamoDB Table ด้วย "Give live item count" DDBLiveItems

วิธีการอื่น ๆ เพิ่มเติม

CastleArm

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (1)

Collapse
 
chatchaikomrangded profile image
Chatchai Komrangded (Bas)

Good one!

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more