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 函式取得参数的运算结果

参考资料


<<:  Day29:辗转相除法(Euclidean algorithm)

>>:  Day 29:Google Map 自订资讯视窗

Day 16:把做好的 HTML 加入 Angular 吧!

三天前,我们已成功把静态档案加入 Angular 的专案了,如果感到有点陌生,可以再到以下连结,重新...

Day17 在React 中使用Material icons

在React中可以插入Material icon组件使用,步骤如下: Material icons网...

30-22 之 Remote Facade

接下来这篇文章我们将要谈谈《 Patterns of Enterprise Application ...

Proxmox VE 安装虚拟机:Windows 10 (三)

对於需要效能的客体机来说,最关键的部份就在於网路传输及磁碟读写效能,它们会直接影响到客体机服务的顺...

Quora、Answer the Public: 解决用户问题,先知道大家都问些什麽问题?

这个实用网路行销工具系列文,将会整理我平常研究的各项网路行销工具,帮助工程师如果有现成的服务可以快速...