iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
AI & Data

觀賞魚辨識的YOLO全餐系列 第 28

Day 28 - AWS Lambda 結合 Dynamodb

  • 分享至 

  • twitterImage
  •  

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 對其進行配置以處理需求。

然而,無伺服器計算進一步擴展了基礎設施抽象,軟體設計者可以專注於應用程式的代碼,不必管理實例、操作系統或伺服器,無服務器環境處理運行和擴展高度可用的應用程式所需的一切工作。此外,藉助無伺服器計算,您的代碼僅在需要時運行,代碼未運行時,您無需為任何基礎設施付費。

https://ithelp.ithome.com.tw/upload/images/20210928/20129510Z1mOEfpeH0.png
圖 1、傳統佈署與無服務器佈署的差異

AWS Lambda 工作原理

下圖說明 AWS Lambda 工作原理,事件源是向 AWS Lambda 發佈事件的實體,而 Lambda 函式是提供的用於處理事件的自定義代碼,AWS Lambda 執行 Lambda 函式,AWS Lambda 與其他 AWS 服務集成以調用函式,最後回應呼叫的事件源。

https://ithelp.ithome.com.tw/upload/images/20210928/20129510QR7RFSj1Xz.png
圖 2、AWS Lambda 工作原理

下圖說明 AWS Lambda 的內容組成包含了:

  • 訪問許可權 (permission):是指當 Lambda 函式需要存取到 S3 時,並需要先給予訪問 S3 的許可權。
  • 觸發事件:指定透過何種事件來觸發 Lambda 函式。
  • 代碼:主要的功能代碼就撰寫在這裡,需考慮的是傳入參數,功能以及回應內容。
  • 依賴項和庫:代碼中所需要的依賴項和庫也需要一起打包,或是套用已建立好的庫層 (Layer) 的方式,以方便代碼調用。
  • 配置:這裡包含了執行環境參數、記憶體、逾時和併發性等執行參數。

https://ithelp.ithome.com.tw/upload/images/20210928/20129510pyFhPdg4w2.png
圖 3、AWS Lambda 的內容組成

下圖說明 AWS Lambda 的許可權類型,AWS Lambda 具有兩種類型的許可權:

  • 調用許可權:事件源需要觸發 Lambda 函式的許可權。
  • 執行許可權:Lambda 函式需要與其他 AWS 服務和資源進行交互的許可權。

調用和執行許可權通過 AWS Identity and Access Management (IAM) 進行處理。

https://ithelp.ithome.com.tw/upload/images/20210928/20129510oZzcJIlC3o.png
圖 4、AWS Lambda 的調用許可權和執行許可權

AWS Lambda 結合 Amazon DynamoDB

如同圖 3. AWS Lambda 的內容組成中說明,整個 AWS Lambda 應該包含了訪問許可權、觸發事件、代碼、依賴項和庫、配置,基於由淺入深原則,我們只處理必要的元素就是訪問許可權和代碼這兩個部分,其他三個會在後續文章中提到。

訪問許可權

我們要透過 AWS Lambda 存取 DynamoDB ,所以需要賦予 DynamoDB 的執行許可權,這個部分可以透過 IAM 來完成,在 IAM 中建立一個角色 (Role),並賦予它存取 DynamoDB 的許可權。

打開 IAM 管理控制台,點擊左手邊功能選單的 角色,接著點擊右手邊主畫面的 建立角色 按鈕,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20210928/20129510ifCWvc2VRw.png
圖 5、IAM 管理控制台中新增角色

建立角色共有四個步驟:

  1. 選擇使用案例
  2. 黏貼(attach)許可政策
  3. 建立標籤
  4. 檢閱

下圖是選擇使用案例畫面,使用案例指的是主動的 AWS 服務,也就是透過這個服務來調用其他 AWS 服務,我們的案例就是透過 AWS Lambda 來讀取 DynamoDB ,所以在這裡要選擇 Lambda,接著點擊 下一個:許可

https://ithelp.ithome.com.tw/upload/images/20210928/20129510G1jOACWuRI.png
圖 6、新增角色中選擇使用案例

要存取的是 DynamoDB,所以在篩選政策中輸入 dynamo ,會看到下方出現很多跟 dynamo 有關的政策,選取 AmazonDynamoDBFullAccess,並點擊 下一個:標籤。其實以我們的功能指會讀取 DynamoDB,所以選取 AmazonDynamoDBReadOnlyAccess 更為洽當。

https://ithelp.ithome.com.tw/upload/images/20210928/20129510S3mHN8D2gV.png
圖 7、AWS Lambda 的調用許可權和執行許可權

標籤部分我們就不設定,繼續跳到下一個檢閱畫面,下圖就是檢閱畫面,輸入角色名稱,特別注意一下底下的受信任實體與政策,這說明這個角色是可以被 AWS Lambda 所調用,且擁有完全存取 DynamoDB 的許可權。

https://ithelp.ithome.com.tw/upload/images/20210928/201295107QEfHWI0R7.png
圖 8、AWS Lambda 的調用許可權和執行許可權

代碼
進入 AWS Lambda 控制台,點擊左手邊功能選單的 函式 ,接著再點擊右手邊主畫面的 建立函式,如下圖所示。
https://ithelp.ithome.com.tw/upload/images/20210928/20129510WNz7Imt3xj.png
圖 9、AWS Lambda 的建立函式畫面

輸入函式名稱,如 getDataFromDynamoDB ,指定執行時間所用的程式語言 Python 3.8,再指定執行角色,就是先前設定的角色,完成後點擊 建立函式
https://ithelp.ithome.com.tw/upload/images/20210928/20129510wJfrjFan1I.png
圖 10、AWS Lambda 的函式配置畫面

進入函式編輯畫面,點選上方的函式名稱,再下方會有一個操作介面,選取 程式碼 頁籤,再撰寫程式碼後記得要先佈署 (Deploy),才可以進行測試 (Test):下方的畫面分布:左手邊為檔案管理畫面,右手邊則是代碼區。

https://ithelp.ithome.com.tw/upload/images/20210928/20129510reWjgOGVxZ.png
圖 11、AWS Lambda 函式編輯畫面

撰寫代碼後要先進行測試來判斷代碼是否正確,點擊 Test 會進入AWS Lambda 的測試配置畫面,如下圖所示,輸入事件名稱,測試內容不用修改,直接存儲即可。

https://ithelp.ithome.com.tw/upload/images/20210928/20129510qUJfdQnb7u.png
圖 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

https://ithelp.ithome.com.tw/upload/images/20210928/20129510743Pn6BYVS.png
圖 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

上一篇
Day 27 - 成本估計與 Amazon DynamoDB
下一篇
Day 29 - AWS Lambda 接收參數查詢 Dynamodb
系列文
觀賞魚辨識的YOLO全餐38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言