Day 28 - AWS Lambda 结合 Dynamodb

33 篇文章 6 订阅

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 管理控制台中新增角色

建立角色共有四个步骤:

  1. 选择使用案例
  2. 黏贴(attach)许可政策
  3. 建立标签
  4. 检阅

下图是选择使用案例画面,使用案例指的是主动的 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值