Day 29 - AWS Lambda 接收参数查询 Dynamodb

33 篇文章 6 订阅

Day 29 - AWS Lambda 接收参数查询 Dynamodb

Day 28 - AWS Lambda 结合 Dynamodb 介绍了如何利用 AWS Lambda 来读取 Dynamodb,只是查询的条件太过单调,只能用事先定义好的主键,在这里展示两种常见的用法:

  1. 指定 Dynamodb 特定属性查询
  2. 传入参数给 AWS Lambda

指定 Dynamodb 特定属性查询

如果要在 Dynamodb 的资料表中基于非主键属性来查询资料的话,需要建立二级索引。通过二级索引,使用者可以对表主键之外的属性执行查询。利用二级索引,除了可对主键进行查询外,还可使用替代键查询表中的数据。除了替代键属性和主键属性(分区键和排序键)之外,二级索引还包含其他表属性的子集。当建立索引时,可指定哪些属性将从基表复制或投影到索引。 DynamoDB 至少会将键属性从基表投影到索引中。二级索引包含以下内容:

  • 替代键属性。
  • 主键属性。
  • 基表中其他属性的可选子集(投影属性)。

二级索引可以是以下其中一种类型:

  • 全域二级索引 (Global Secondary Indexes, GSI):分区键和排序键均可与基表中的分区键和排序键不同的索引。全域二级索引之所以称为"全域",是因为对该索引的查询可跨过所有分区,涵盖基表中的所有数据。全域二级索引没有大小限制,且具有其自己的读取和写入活动预置输送量设置,这些设置独立于表的相应设置。
  • 本地二级索引 (Local Secondary Indexes, LSI):分区键与基表相同但排序键不同的索引。本地二级索引之所以称为"本地",是因为该索引的每个分区的范围都限定为具有相同分区键值的基表分区。因此,对于任何一个分区键值,索引专案的大小总和不得超过 10GB。此外,本地二级索引与其索引的表共用为读取和写入活动预置的输送量设置。

DynamoDB 中的每个表最多可具有 20 个全域二级索引(预设限制)和 5 个本地二级索引。

打开 DynamoDB 控制台,点击左手边主要功能列中的 资料表,选取事先建立好的资料表 fishInfoTbl ,点击 索引 页签,接着点击 建立索引 按钮。

在这里插入图片描述
图 1、建立 DynamoDB 资料表的二级索引

进入建立全域辅助索引配置画面,输入分区索引键 Mark ,因为我们要查询的分区索引键并非所有资料表的分区键,所以这是属于全域二级索引,设定完毕后,点击 建立索引 按钮,需要等待 5 分钟左右才会完成建立索引,索引需要额外收费。

在这里插入图片描述
图 2、建立 DynamoDB 资料表的全域二级索引

在 AWS Lambda 进行非主键的查询,进入 AWS Lambda 控制台,找到 Day 28 - AWS Lambda 结合 Dynamodb 所建立的 Lambda 函式 getDataFromDynamoDB,如下图所示。

在这里插入图片描述
图 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 来运行。

在这里插入图片描述
图 4、运行 AWS Lambda 函式

传入参数给 AWS Lambda

传入参数的部分,可以重新设定测试事件,在 Test 按钮旁有一个倒三角形按钮,按下该按钮后,点击 Configure test event ,可以重新组态 test 事件内容,如下图所示。

在这里插入图片描述
图 5、重新设定测试事件

下图中可以 JSON 格式指定要传入的参数。
在这里插入图片描述
图 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  

在这里插入图片描述
图 7、AWS Lambda 函式取得参数的运算结果

参考资料

  • 使用輔助索引來改善資料存取,https://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/SecondaryIndexes.html
  • AWS Lambda 文件,https://docs.aws.amazon.com/zh_tw/lambda/
  • AWS Lambda,https://aws.amazon.com/tw/lambda/
  • 搭配其他服務使用 AWS Lambda,https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/lambda-services.html
  • 搭配使用 AWS Lambda 與 Amazon CloudWatch Events,https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/services-cloudwatchevents.html
  • AWS Lambda 許可,https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/lambda-permissions.html
  • Calling DynamoDB from a Lambda function in Python,https://docs.amplify.aws/guides/functions/dynamodb-from-python-lambda/q/platform/js/#getting-an-item-by-primary-key-in-dynamodb-from-lambda
  • Hands-On Examples for Working with DynamoDB, Boto3, and Python,https://highlandsolutions.com/blog/hands-on-examples-for-working-with-dynamodb-boto3-and-python
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值