AWS Lambda 的清單管理員範例應用程式 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS Lambda 的清單管理員範例應用程式

清單管理員範例應用程式會示範如何使用 AWS Lambda 來處理 Amazon Kinesis 資料串流中的記錄。Lambda 事件來源映射會以批次方式從串流讀取記錄,並叫用 Lambda 函數。該函數使用記錄中的資訊來更新 Amazon DynamoDB 中的文件,並將其處理的記錄存放在 Amazon Relational Database Service (Amazon RDS) 中。

用戶端將記錄傳送至 Kinesis 串流,以便存放記錄並使其可用於處理。Kinesis 串流的用途如同佇列,可緩衝記錄直到它們可以被處理。與 Amazon SQS 佇列不同的是,Kinesis 串流中的記錄在處理後不會被刪除,因此多個取用者可以處理相同的資料。Kinesis 中的記錄也會按順序處理,而佇列項目可以不按順序交付。記錄會在 7 天後從串流中刪除。

除了處理事件的函數之外,應用程式還包含第二個函數,用於在資料庫上執行管理工作。函數程式碼可在下列檔案中取得:

您可以在幾分鐘內透過 AWS CLI 和 AWS CloudFormation 部署範例。若要下載、設定,以及在您的帳戶中部署,請依照 README 中的指示進行。

架構和事件結構

範例應用程式會使用下列 AWS 服務:

  • Kinesis - 接收來自用戶端的事件,並暫時存放它們以進行處理。

  • AWS Lambda - 從 Kinesis 串流中讀取並將事件傳送至函數的處理常式程式碼。

  • DynamoDB - 存放應用程式產生的清單。

  • Amazon RDS - 在關聯式資料庫中存放已處理記錄的副本。

  • AWS Secrets Manager - 存放資料庫密碼。

  • Amazon VPC - 提供私有區域網路,用於函數與資料庫之間的通訊。

定價

每項服務均需收取標準費用。

應用程式會處理來自用戶端的 JSON 文件,其中包含更新清單所需的資訊。它支援兩種清單類型:計數和排名。計數包含新增至索引鍵目前值 (如果存在) 的值。為使用者處理的每個項目會增加指定資料表中的索引鍵值。

下列範例顯示增加使用者 stats 清單 xp (經驗點) 值的文件。

範例 記錄 - 計數類型
{ "title": "stats", "user": "bill", "type": "tally", "entries": { "xp": 83 } }

排名包含項目清單,其中值是排名的順序。排名可以使用覆寫目前值的不同值來更新,而不是遞增值。下列範例顯示最愛電影的排名:

範例 記錄 - 排名類型
{ "title": "favorite movies", "user": "mike", "type": "rank", "entries": { "blade runner": 1, "the empire strikes back": 2, "alien": 3 } }

Lambda 事件來源映射會以批次方式從串流中讀取記錄,並叫用處理器函數。函數處理常式收到的事件包含物件陣列,每個物件都包含記錄的詳細資料,例如收到記錄的時間、串流的詳細資料,以及原始記錄文件的編碼表示法。

範例 events/kinesis.json - 記錄
{ "Records": [ { "kinesis": { "kinesisSchemaVersion": "1.0", "partitionKey": "0", "sequenceNumber": "49598630142999655949899443842509554952738656579378741250", "data": "eyJ0aXRsZSI6ICJmYXZvcml0ZSBtb3ZpZXMiLCAidXNlciI6ICJyZGx5c2N0IiwgInR5cGUiOiAicmFuayIsICJlbnRyaWVzIjogeyJibGFkZSBydW5uZXIiOiAyLCAidGhlIGVtcGlyZSBzdHJpa2VzIGJhY2siOiAzLCAiYWxpZW4iOiAxfX0=", "approximateArrivalTimestamp": 1570667770.615 }, "eventSource": "aws:kinesis", "eventVersion": "1.0", "eventID": "shardId-000000000000:49598630142999655949899443842509554952738656579378741250", "eventName": "aws:kinesis:record", "invokeIdentityArn": "arn:aws:iam::123456789012:role/list-manager-processorRole-7FYXMPLH7IUS", "awsRegion": "us-east-2", "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/list-manager-stream-87B3XMPLF1AZ" }, ...

解碼後,資料包含一個記錄。函數會使用記錄來更新使用者清單,以及儲存所有使用者累積值的彙總清單。它也會將事件的副本儲存在應用程式的資料庫中。

使用 AWS X-Ray 檢測

應用程式會使用 AWS X-Ray 來追蹤函數調用以及函數對 AWS 服務進行的呼叫。X-Ray 會使用它從函數接收的追蹤資料來建立服務映射,以協助您找出錯誤。

範本中會設定 Node.js 函數來進行有效追蹤,並在程式碼中透過 適用於 Node.js 的 AWS X-Ray SDK 檢測。X-Ray 開發套件會針對使用 AWS 開發套件或 MySQL 用戶端進行的每次呼叫記錄子區段。

該函數使用 Node.js JavaScript 中的 AWS SDK 來讀取和寫入每個記錄的兩個表。主要資料表儲存每個清單名稱和使用者組合的目前狀態。彙總資料表儲存結合多個使用者資料的清單。

AWS CloudFormation 範本和其他資源

應用程式以 Node.js 模組實作,並使用 AWS CloudFormation 範本和支援的 Shell 指令碼部署。應用程式範本會建立兩個函數、Kinesis 串流、DynamoDB 資料表和下列支援資源。

應用程式資源
  • 執行角色 - IAM 角色,可授予函數存取其他 AWS 服務的許可。

  • Lambda 事件來源映射 - 會從資料串流中讀取並叫用函數。

檢視上的應用程式範本 GitHub。

第二個範本 template-vpcrds.yml 會建立 Amazon VPC 和資料庫資源。雖然可以在一個範本中建立所有的資源,但將它們分開可以更容易地清理應用程式,並可讓資料庫重複使用於多個應用程式。

基礎架構資源
  • VPC - 具有私有子網路、路由表和 VPC 端點的虛擬私有雲端網路,允許函數在沒有網際網路連線的情況下與 DynamoDB 進行通訊。

  • 資料庫 - Amazon RDS 資料庫執行個體和將其連線到 VPC 的子網路群組。