Day 28 - AWS Lambda 结合 Dynamodb 介绍了如何利用 AWS Lambda 来读取 Dynamodb,只是查询的条件太过单调,只能用事先定义好的主键,在这里展示两种常见的用法:
指定 Dynamodb 特定属性查询
如果要在 Dynamodb 的资料表中基於非主键属性来查询资料的话,需要建立二级索引。通过二级索引,使用者可以对表主键之外的属性执行查询。 利用二级索引,除了可对主键进行查询外,还可使用替代键查询表中的数据。除了替代键属性和主键属性(分区键和排序键)之外,二级索引还包含其他表属性的子集。当建立索引时,可指定哪些属性将从基表复制或投影到索引。DynamoDB 至少会将键属性从基表投影到索引中。二级索引包含以下内容:
二级索引可以是以下其中一种类型:
DynamoDB 中的每个表最多可具有 20 个全域二级索引(预设限制)和 5 个本地二级索引。
打开 DynamoDB 控制台,点击左手边主要功能列中的 资料表,选取事先建立好的资料表 fishInfoTbl ,点击 索引 页签,接着点击 建立索引 按钮。
图 1、建立 DynamoDB 资料表的二级索引
进入建立全域辅助索引配置画面,输入分区索引键 Mark ,因为我们要查询的分区索引键并非所有资料表的分区键,所以这是属於全域二级索引,设定完毕後,点击 建立索引 按钮,需要等待 5 分钟左右才会完成建立索引,索引需要额外收费。
图 2、建立 DynamoDB 资料表的全域二级索引
在 AWS Lambda 进行非主键的查询,进入 AWS Lambda 控制台,找到 Day 28 - Amazon 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 函式取得参数的运算结果
<<: Day29:辗转相除法(Euclidean algorithm)
三天前,我们已成功把静态档案加入 Angular 的专案了,如果感到有点陌生,可以再到以下连结,重新...
在React中可以插入Material icon组件使用,步骤如下: Material icons网...
接下来这篇文章我们将要谈谈《 Patterns of Enterprise Application ...
对於需要效能的客体机来说,最关键的部份就在於网路传输及磁碟读写效能,它们会直接影响到客体机服务的顺...
这个实用网路行销工具系列文,将会整理我平常研究的各项网路行销工具,帮助工程师如果有现成的服务可以快速...