DEV Community

วิธีการนำข้อมูล 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

Discussion (1)

Collapse
chatchaikomrangded profile image
Chatchai Komrangded (Bas)

Good one!