Day 28 - AWS Lambda 结合 Dynamodb
有了 DynamoDB 可以存储资料,接着需要透过适当的方法去存取 DynamoDB ,于是 AWS 提供了 AWS Lambda 作为撰写程式的全托管服务。
AWS Lambda
AWS Lambda 是一种无伺服器的运算服务,可让软体设计者开发并执行程式但不必布建或管理伺服器、建立工作负载感知丛集扩展逻辑、维护事件整合或管理执行阶段。使用 Lambda,软体设计者可以透过虚拟方式执行任何类型的应用程式或后端服务,全部无需管理。只要以 ZIP 档案或容器映像上传您的程式码,Lambda 就可以自动并精准地分配运算执行力,并根据传入请求或事件执行您的程式码,适用于任何规模的流量。可以将自己的程式码设成可以从超过 200 种 AWS 服务和 SaaS 应用程式自动触发,或从任何 Web 或行动应用程式直接呼叫。可以用自己最喜爱的语言 (Node.js、Python、Go、Java 等) 写入 Lambda 函式,而且可以使用 AWS SAM 或 Docker CLI 等无伺服器和容器工具建置、测试和部署您的函式。
下图列出了传统布署与无服务器布署的差异,在无服务器的环境中,软体开发者可以更专心的在软体的开发跟维运上。云计算的其中一个优势是,使用者可以抽象化基础设施层,例如,选择一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例类型,并使用 Elastic Load Balancing 和 EC2 Auto Scaling 对其进行配置以处理需求。
然而,无伺服器计算进一步扩展了基础设施抽象,软体设计者可以专注于应用程式的代码,不必管理实例、操作系统或伺服器,无服务器环境处理运行和扩展高度可用的应用程式所需的一切工作。此外,借助无伺服器计算,您的代码仅在需要时运行,代码未运行时,您无需为任何基础设施付费。
图 1、传统布署与无服务器布署的差异
AWS Lambda 工作原理
下图说明 AWS Lambda 工作原理,事件源是向 AWS Lambda 发布事件的实体,而 Lambda 函式是提供的用于处理事件的自定义代码,AWS Lambda 执行 Lambda 函式,AWS Lambda 与其他 AWS 服务集成以调用函式,最后回应呼叫的事件源。
图 2、AWS Lambda 工作原理
下图说明 AWS Lambda 的内容组成包含了:
- 访问许可权 (permission):是指当 Lambda 函式需要存取到 S3 时,并需要先给予访问 S3 的许可权。
- 触发事件:指定透过何种事件来触发 Lambda 函式。
- 代码:主要的功能代码就撰写在这里,需考虑的是传入参数,功能以及回应内容。
- 依赖项和库:代码中所需要的依赖项和库也需要一起打包,或是套用已建立好的库层 (Layer) 的方式,以方便代码调用。
- 配置:这里包含了执行环境参数、记忆体、逾时和并发性等执行参数。
图 3、AWS Lambda 的内容组成
下图说明 AWS Lambda 的许可权类型,AWS Lambda 具有两种类型的许可权:
- 调用许可权:事件源需要触发 Lambda 函式的许可权。
- 执行许可权:Lambda 函式需要与其他 AWS 服务和资源进行交互的许可权。
调用和执行许可权通过 AWS Identity and Access Management (IAM) 进行处理。
图 4、AWS Lambda 的调用许可权和执行许可权
AWS Lambda 结合 Amazon DynamoDB
如同图 3. AWS Lambda 的内容组成中说明,整个 AWS Lambda 应该包含了访问许可权、触发事件、代码、依赖项和库、配置,基于由浅入深原则,我们只处理必要的元素就是访问许可权和代码这两个部分,其他三个会在后续文章中提到。
访问许可权
我们要透过 AWS Lambda 存取 DynamoDB ,所以需要赋予 DynamoDB 的执行许可权,这个部分可以透过 IAM 来完成,在 IAM 中建立一个角色 (Role),并赋予它存取 DynamoDB 的许可权。
打开 IAM 管理控制台,点击左手边功能选单的 角色,接着点击右手边主画面的 建立角色 按钮,如下图所示。
图 5、IAM 管理控制台中新增角色
建立角色共有四个步骤:
- 选择使用案例
- 黏贴(attach)许可政策
- 建立标签
- 检阅
下图是选择使用案例画面,使用案例指的是主动的 AWS 服务,也就是透过这个服务来调用其他 AWS 服务,我们的案例就是透过 AWS Lambda 来读取 DynamoDB ,所以在这里要选择 Lambda,接着点击 下一个:许可。
图 6、新增角色中选择使用案例
要存取的是 DynamoDB,所以在筛选政策中输入 dynamo ,会看到下方出现很多跟 dynamo 有关的政策,选取 AmazonDynamoDBFullAccess,并点击 下一个:标签。其实以我们的功能指会读取 DynamoDB,所以选取 AmazonDynamoDBReadOnlyAccess 更为洽当。
图 7、AWS Lambda 的调用许可权和执行许可权
标签部分我们就不设定,继续跳到下一个检阅画面,下图就是检阅画面,输入角色名称,特别注意一下底下的受信任实体与政策,这说明这个角色是可以被 AWS Lambda 所调用,且拥有完全存取 DynamoDB 的许可权。
图 8、AWS Lambda 的调用许可权和执行许可权
代码
进入 AWS Lambda 控制台,点击左手边功能选单的 函式 ,接着再点击右手边主画面的 建立函式,如下图所示。
图 9、AWS Lambda 的建立函式画面
输入函式名称,如 getDataFromDynamoDB ,指定执行时间所用的程式语言 Python 3.8,再指定执行角色,就是先前设定的角色,完成后点击 建立函式。
图 10、AWS Lambda 的函式配置画面
进入函式编辑画面,点选上方的函式名称,再下方会有一个操作介面,选取 程式码 页签,再撰写程式码后记得要先布署 (Deploy),才可以进行测试 (Test):下方的画面分布:左手边为档案管理画面,右手边则是代码区。
图 11、AWS Lambda 函式编辑画面
撰写代码后要先进行测试来判断代码是否正确,点击 Test 会进入AWS Lambda 的测试配置画面,如下图所示,输入事件名称,测试内容不用修改,直接存储即可。
图 12、AWS Lambda 的测试配置画面
输入以下代码后,点击 Deploy 后,在点击 Test,就会出现代码运行结果,如下图,显示测试名称,回传结果,运行时间,运行时所用的记忆体数量,如果需要观察结果,还可以用 print() 来显示内容。
import json
import boto3
client = boto3.client('dynamodb')
def lambda_handler(event, context):
data = client.get_item(
TableName='fishInfoTbl',
Key={
'LatinName': {
'S': 'Altolamprologus compressiceps'
}
}
)
print(data['Item'])
response = {
'statusCode': 200,
'body': json.dumps(data['Item']),
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
}
return response
图 13、AWS Lambda 的测试结果
参考资料
- 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