ใช้ DynamoDB กับ Lambda สร้างฟังก์ชัน History : Serverless Web App บน AWS : Part 7

ใช้ DynamoDB กับ Lambda สร้างฟังก์ชัน History : Serverless Web App บน AWS : Part 7

เชื่อมต่อกับ DynamoDB เพื่อดึงเอาข้อมูลมาแสดงเป็น History
Clock Icon2024.11.11

บทความนี้ดัดแปลงเนื้อหาบางส่วนมาจาก Hands-on Training ของ Website AWS Official ของญี่ปุ่น สามารถอ่านเนื้อหาต้นฉบับได้ที่ AWS Hands-on for Beginners Serverless #1 サーバーレスアーキテクチャで翻訳 Web API を構築する | AWS Webinar

บทความนี้เป็นส่วนนึงของเนื้อหาในบทเรียนเกี่ยวกับ AWS API Gateway ที่ผมสร้างขึ้นมา คุณผู้อ่านสามารถตรวจสอบเนื้อหาทั้งหมดได้โดยการคลิกที่ชื่อของผม

เป้าหมายใหญ่สุดของบทเรียนนี้คือ การทำ Web app แปลภาษาที่เป็น serverless ครับ

สวัสดีครับ ต้า ครับ

บทความนี้เป็นส่วนนึงของเนื้อหาในบทเรียนเกี่ยวกับ AWS API Gateway ที่ผมสร้างขึ้นมา
ซึ่งผมทำการแยกย่อยๆออกมาโดยเนื้อหาในบทความพวกนี้สามารถจบได้ในตัวของมันเอง

สำหรับหัวข้ออื่นๆ ของบทความนี้ สามารถตรวจสอบได้ที่ช่วงท้ายของบทความครับ

สำหรับบทความนี้เราจะมาทำกันในส่วนนี้ครับ

Hands-On-for-Beginners_2022_Serverless1_0819_v1_6

ในหัวข้อนี้ เราจะมาทำระบบประวัติที่เราทำการค้นหา โดยที่จะไปดึงข้อมูลจาก DynamoDB มาแสดงขึ้นที่ หน้าเว็บ โดยการกระทำนี้เราจะต้องสร้าง API ขึ้นมาใหม่อีกอัน เชิญรับชมในหัวข้อต่อไปได้เลยครับ

บทความนี้เราจะมาทำกันใน Singapore Region กันครับ

เริ่มลงมือทำ

ทำระบบ History

สิ่งที่เราจะทำกันในบทความนี้ คือ ทำระบบประวัติ

โดยที่ตอนนี้เรารู้ว่า เรามีการเก็บข้อมูลประวัติข้อมูลที่เราทำการค้นหาลงใน DynamoDB โดยเราจะทำการดึงข้อมูลจาก DynamoDB มาแสดงขึ้นในหน้า index.html ของเรากันครับ

โดยเราต้อง

  • สร้าง Lambda Function สำหรับดึงข้อมูลจาก DynamoDB ใหม่
  • เพิ่มการตั้งค่าใน API Gateway

ในการดึงข้อมูลนี้มา

ก่อนอื่นเราจะสร้าง Lambda Function ใหม่กันก่อนครับ

Lambda Function สำหรับดึงข้อมูลจาก DynamoDB

ใน Lambda Function ที่เราสร้างรอบนี้จะเป็นการดึงข้อมูลมาจาก DynamoDB
ซึ่งไม่ได้มีการรับ input จาก API Gateway เขามาเลย

ทำให้ในการเทสนั้น เราจะไม่ใช้ Lambda proxy integration ซึ่งจะไปเกี่ยวกับหัวข้อที่เราจะมาตั้งค่าใน API Gateway ในหัวข้อถัดไป

ให้เราเข้าลิ้งค์ต่อไปนี้เพื่อทำการสร้าง Lambda Function
Create function

ตั้งค่าตามต่อไปนี้
◉ Author from scratch
Function name: get-history-translate
Runtime: Python 3.12

Screenshot 2024-10-01 110157

เราจะใช้ Lambda นี้ส่ง Request ไปยัง AWS DynamoDB ทำให้เราต้องทำให้ Lambda Function นี้ต้องมีสิทธิในการเข้าถึง AWS DynamoDB ก่อน โดยการตั้งค่าต่อไปนี้

ไปที่ Function ที่เราสร้างขึ้น > Configuration > Permissions > คลิก Role ที่เราสร้างขึ้น

part3-1

กด Add permissions > Attach policies > ☑AmazonDynamoDBFullAccess > Add permissions

เราสามารถจำกัดสิทธิ์ให้มีความสามารถเท่าที่จำเป็นได้ แต่เพื่อความสะดวก ในบทความนี้จึงขอใช้เป็น FullAccess ไปก่อน

ถ้าได้ตามภาพด้านล่างนี้คือโอเคครับ

part3-2

กลับมาที่ Lambda Function ที่เราสร้างขึ้น
ไปที่โค้ดก็อบข้อความด้านล่างไปใส่

โดยในการดึงข้อมูลครั้งนี้เราจะทำการดึงมาแค่ 5 ไอเทมล่าสุดเท่านั้น

แล้วกด Deploy

import boto3
from boto3.dynamodb.conditions import Key

def lambda_handler(event, context):
    # Initialize DynamoDB client
    dynamodb = boto3.resource('dynamodb')

    # Specify your table name
    table_name = 'translate-log'
    table = dynamodb.Table(table_name)

    # Perform the scan operation
    response = table.scan(
        #ScanIndexForward=False  # This will sort in descending order
    )

    # Extract items from the response
    items = response['Items']

    # Sort items based on a timestamp field (assuming you have one)
    # Replace 'timestamp' with your actual timestamp field name
    sorted_items = sorted(items, key=lambda x: x['timestamp'], reverse=True)

    # Get the last 5 items (or fewer if there are less than 5 items)
    last_five_items = sorted_items[:5]

    return {
        'statusCode': 200,
        'body': last_five_items,
        'headers': {
            "Access-Control-Allow-Origin": "*", 
            "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET"
        }
    }

translate13

จากนั้นเรากด Test ดู เราจะเห็นหน้าต่างให้เราสร้าง Event
ผมจะตั้งชื่อไว้ว่า history-test แล้วกด Save

translate14

แล้วกด Test อีกที
หาเราได้คำแปลล่าสุดออกมาประมาณด้านล่างคือ โอเคครับ

translate15

แก้ไข API

เปิดหน้าต่าง API ที่เราสร้างขึ้น

กด Create resource

part3-4

ในส่วนของ Resource name ให้เรากรอก history
ส่วน CORS ยังไม่ต้องติ๊กตอนนี้ เราจะไปสร้างต่อในขั้นต่อไป

กด Create resource

part3-5-1

จากนั้นให้เรามาที่ /history แล้วเลือก Create method

part3-6-2

จากนั้นเราเลือก Method type: GET
Lambda function:get-history-translate

แล้วจากนั้นเลือก Create method

part3-7

จากนั้นเลือกเปิดการใช้งาน CORS ให้เรากด Enable CORS

part3-13 (1)

☑GET
☑OPTION

เลือก Save

part3-14

เท่านี้ถือว่าสร้างเสร็จแล้วครับ

ให้เรามาที่ในส่วน GET ของ /history ให้เรากด Deploy API

part3-8

เลือก stage:dev

แล้วเลือก Deploy

part3-9

ให้เรามาที่ในส่วน GET ของ /history แล้วทำการ Copy ลิ้งค์

part3-10

แล้วนำไปเปิด หากได้ภาพประมาณด้านล่างนี้ถือว่าโอเคครับ

part3-11

จากนั้นให้เราไปเปิดเปิดไฟล์ script.js ที่เราโหลดมา

part2-13

ทำการเอาลิ้งค์ที่ Copy มาเอาไปใส่ใน API_ENDPOINT_HISTORY ของ function callHistory

part3-15

แล้วทำการเปิดไฟล์ index.html ดู หากได้ตามภาพด้านล่างถือว่าเสร็จสิ้นครับ

Screenshot 2024-10-02 142749

ทิ้งท้าย

ในบทความนี้ เราได้ระบบ History ไปแล้ว ต่อไปเราจะพาอัพเว็บไซต์เราทั้งหมดลงใน AWS เพื่อให้ทั้งหมดเป็น Serverless ครับ

บทความ Part อื่นๆ

บทความอ้างอิง

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.