iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
AI & Data

觀賞魚辨識的YOLO全餐系列 第 29

Day 29 - AWS Lambda 接收參數查詢 Dynamodb

Day 29 - AWS Lambda 接收參數查詢 Dynamodb

Day 28 - AWS Lambda 結合 Dynamodb 介紹了如何利用 AWS Lambda 來讀取 Dynamodb,只是查詢的條件太過單調,只能用事先定義好的主鍵,在這裡展示兩種常見的用法:

  1. 指定 Dynamodb 特定屬性查詢
  2. 傳入參數給 Amazon Lambda

指定 Dynamodb 特定屬性查詢

如果要在 Dynamodb 的資料表中基於非主鍵屬性來查詢資料的話,需要建立二級索引。通過二級索引,使用者可以對表主鍵之外的屬性執行查詢。 利用二級索引,除了可對主鍵進行查詢外,還可使用替代鍵查詢表中的數據。除了替代鍵屬性和主鍵屬性(分區鍵和排序鍵)之外,二級索引還包含其他表屬性的子集。當建立索引時,可指定哪些屬性將從基表複製或投影到索引。DynamoDB 至少會將鍵屬性從基表投影到索引中。二級索引包含以下內容:

  • 替代鍵屬性。
  • 主鍵屬性。
  • 基表中其他屬性的可選子集(投影屬性)。

二級索引可以是以下其中一種類型:

  • 全域二級索引 (Global Secondary Indexes, GSI):分區鍵和排序鍵均可與基表中的分區鍵和排序鍵不同的索引。全域二級索引之所以稱為"全域",是因為對該索引的查詢可跨過所有分區,涵蓋基表中的所有數據。全域二級索引沒有大小限制,且具有其自己的讀取和寫入活動預置輸送量設置,這些設置獨立於表的相應設置。
  • 本地二級索引 (Local Secondary Indexes, LSI):分區鍵與基表相同但排序鍵不同的索引。本地二級索引之所以稱為"本地",是因為該索引的每個分區的範圍都限定為具有相同分區鍵值的基表分區。因此,對於任何一個分區鍵值,索引專案的大小總和不得超過 10GB。 此外,本地二級索引與其索引的表共用為讀取和寫入活動預置的輸送量設置。

DynamoDB 中的每個表最多可具有 20 個全域二級索引(預設限制)和 5 個本地二級索引。

打開 DynamoDB 控制台,點擊左手邊主要功能列中的 資料表,選取事先建立好的資料表 fishInfoTbl ,點擊 索引 頁籤,接著點擊 建立索引 按鈕。

https://ithelp.ithome.com.tw/upload/images/20210929/20129510EhYupW97U6.png
圖 1、建立 DynamoDB 資料表的二級索引

進入建立全域輔助索引配置畫面,輸入分區索引鍵 Mark ,因為我們要查詢的分區索引鍵並非所有資料表的分區鍵,所以這是屬於全域二級索引,設定完畢後,點擊 建立索引 按鈕,需要等待 5 分鐘左右才會完成建立索引,索引需要額外收費。

https://ithelp.ithome.com.tw/upload/images/20210929/20129510IEaqsJyU9N.png
圖 2、建立 DynamoDB 資料表的全域二級索引

在 AWS Lambda 進行非主鍵的查詢,進入 AWS Lambda 控制台,找到 Day 28 - Amazon Lambda 結合 Dynamodb 所建立的 Lambda 函式 getDataFromDynamoDB,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20210929/20129510iK8xaoxwXA.png
圖 3、進入 AWS Lambda 函式

將以下代碼輸入 lambda_function.py ,主要是使用 boto3 包指定要存取 dynamodb 資源,而指定要查詢的對象是 fishInfoTbl 資料表中 Mark='1' 的結果,在這裡提醒一個注意事項, AWS Lambda 與 DynamoDB 都是區域型的 AWS 服務,所以要先確認兩者是在同一個地區 (Region),不然會運行會出錯。

lambda_function.py

import json
import boto3
from boto3.dynamodb.conditions import Key

dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):
  qry = '1'
  table = dynamodb.Table('fishInfoTbl')
  data = table.query(
    IndexName='Mark-index',
    KeyConditionExpression = Key('Mark').eq(qry)
  )
  print('data=',data['Items'][0])
  response = {
      'statusCode': 200,
      'body': json.dumps(data['Items'][0]),
      'headers': {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
      },
  }
  return response  

運行 AWS Lambda 函式結果如下圖所示,記得在撰寫完代碼後要先 Deploy ,在透過 Test 來運行。

https://ithelp.ithome.com.tw/upload/images/20210929/20129510DeIuoiORsg.png
圖 4、運行 AWS Lambda 函式

傳入參數給 AWS Lambda

傳入參數的部分,可以重新設定測試事件,在 Test 按鈕旁有一個倒三角形按鈕,按下該按鈕後,點擊 Configure test event ,可以重新組態 test 事件內容,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20210929/20129510eOYvaoCljQ.png
圖 5、重新設定測試事件

下圖中可以 JSON 格式指定要傳入的參數。
https://ithelp.ithome.com.tw/upload/images/20210929/20129510WAksiAHYhe.png
圖 6、指定測試事件中的參數

設定完畢後,可以透過呼叫函式 lambda_handler 中的 event 參數取得 test 事件中所傳進來的參數內容。

lambda_function.py

import json
import boto3
from boto3.dynamodb.conditions import Key

dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):
  qry = event['Mark'] # 只需修改此行就可接收參數
  table = dynamodb.Table('fishInfoTbl')
  data = table.query(
    IndexName='Mark-index',
    KeyConditionExpression = Key('Mark').eq(qry)
  )
  print('data=',data['Items'][0])
  response = {
      'statusCode': 200,
      'body': json.dumps(data['Items'][0]),
      'headers': {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
      },
  }
  return response  

https://ithelp.ithome.com.tw/upload/images/20210929/20129510tAlrO9u6qS.png
圖 7、AWS Lambda 函式取得參數的運算結果

參考資料


上一篇
Day 28 - AWS Lambda 結合 Dynamodb
下一篇
Day 30 - 實作 Amazon API GateWay 整合 AWS Lambda 與 Dynamodb
系列文
觀賞魚辨識的YOLO全餐38

尚未有邦友留言

立即登入留言