使用動 DynamoDB TTL 自動將項目存檔到 Amazon S3 - AWS 方案指引

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

使用動 DynamoDB TTL 自動將項目存檔到 Amazon S3

由虎斑病房(AWS)創建

程式碼儲存庫:使用 DynamoDB TLL 將項目存檔至 S3

環境:PoC 或試點

技術:現代化;資料庫;無伺服器;儲存與備份;成本管理

工作負載:開源

AWS 服務:Amazon S3;Amazon DynamoDB;Amazon Kinesis;AWS Lambda

Summary

此模式提供了從 Amazon DynamoDB 表中移除舊資料的步驟,並將其存檔到 Amazon Web 服務 (AWS) 上的 Amazon 簡單儲存服務 (Amazon S3) 儲存貯體,而無需管理一群伺服器。 

此模式會使用 Amazon DynamoDB 存留時間 (TTL) 自動刪除舊項目,並使用 Amazon DynamoDB 串流來擷取 TTL 過期的項目。然後,它會將 DynamoDB Streams 連接到 AWS Lambda,而不需佈建或管理任何伺服器即可執行程式碼。 

將新項目新增至 DynamoDB 串流時,會啟動 Lambda 函數,並將資料寫入 Amazon 資料 Firehose 交付串流。Firehose 提供簡單、全受管的解決方案,可將資料當做存檔載入 Amazon S3。

DynamoDB 通常用於儲存時間序列資料,例如網頁點擊流資料或來自感應器和連線裝置的物聯網 (IoT) 資料。許多客戶不想刪除存取頻率較低的項目,而是希望將其封存以供稽核之用。TTL 會根據時間戳記屬性自動刪除項目,藉此簡化此封存。 

TTL 刪除的項目可以在 DynamoDB Streams 中識別,這會擷取一系列按時排序的項目層級修改,並將序列儲存在記錄中最多 24 小時。Lambda 函數可以使用此資料,並將其存檔在 Amazon S3 儲存貯體中,以降低儲存成本。為了進一步降低成本,您可以建立 Amazon S3 生命週期規則,將資料 (一旦建立完成) 自動轉移到成本最低的儲存類別,例如 S3 Glacier 即時擷取或 S3 Glacier 彈性擷取,或用於長期儲存的 Amazon S3 Glacier 深度存檔。

先決條件和限制

先決條件

架構

技術, 堆

  • Amazon DynamoDB

  • Amazon DynamoDB 串流

  • Amazon 數據 Firehose

  • AWS Lambda

  • Amazon S3

從 DynamoDB 到 S3 儲存貯體的四個步驟程序。
  1. TTL 會刪除項目。

  2. DynamoDB 串流觸發程序會叫用 Lambda 串流處理器函數。

  3. Lambda 函數會以批次格式將記錄放入 Firehose 交付串流中。

  4. 資料記錄會存檔在 S3 儲存貯體中。

工具

  • AWS CLI — AWS Command Line Interface (AWS CLI) (AWS CLI) 是管理 AWS 服務的統一工具。

  • 亞馬遜 DynamoDB — Amazon DynamoDB 是一個鍵值和文件資料庫,可在任何規模下提供 10 毫秒的效能。

  • Amazon DynamoDB 存留時間 (TTL) — Amazon DynamoDB TTL 可協助您定義每個項目的時間戳記,以確定何時不再需要某個項目。

  • Amazon DynamoDB 串流 — Amazon Dynam oDB 串流會在任何 DynamoDB 表格中擷取一系列按時間排序的項目層級修改,並將此資訊儲存在日誌中長達 24 小時。

  • Amazon 資料 Firehose — Amazon 資料 Firehose 是可靠地將串流資料載入資料湖、資料存放區和分析服務的最簡單方法。

  • AWS Lambda — AWS Lambda 可執行程式碼,無需佈建或管理伺服器。您只需為使用的運算時間支付費用。

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) 是一種物件儲存服務,提供業界領先的可擴展性、資料可用性、安全性和效能。

Code

此模式的程式碼可在使用 DynamoDB TTL 儲 GitHub 存庫將項目存檔至 S3 中取得。

史诗

任務描述所需技能

建立 DynamoDB 資料表。

使用 AWS CLI 在 DynamoDB 中建立一個名為的表格。Reservation選擇隨機讀取容量單位 (RCU) 和寫入容量單位 (WCU),並為您的表格指定兩個屬性:ReservationID和。ReservationDate 

aws dynamodb create-table \ --table-name Reservation \ --attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \ --key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100

ReservationDate是將用來開啟 TTL 的時間戳記。

雲架構師、應用程式開發

開啟 DynamoDB 資料庫。

使用 AWS CLI 為屬性開啟 DynamoDB 資料庫 TTL。ReservationDate

aws dynamodb update-time-to-live \ --table-name Reservation\ --time-to-live-specification Enabled=true,AttributeName=ReservationDate
雲架構師、應用程式開發

開啟動 DynamoDB 料流。

使用 AWS CLI 透過使用串流類型為Reservation表格開啟 DynamoDB NEW_AND_OLD_IMAGES 串流。 

aws dynamodb update-table \ --table-name Reservation \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

此資料流會包含 TTL 所刪除之新項目、更新項目、刪除的項目和項目的記錄。TTL 刪除之項目的記錄包含一個額外的中繼資料屬性,以區分它們與手動刪除的項目。用於 TTL 刪除的userIdentity欄位表示 DynamoDB 服務已執行刪除動作。 

在此模式中,只有 TTL 刪除的項目會封存,但您只能封存存在REMOVEuserIdentity包含principalId等於的記錄。eventName dynamodb.amazonaws.com

雲架構師、應用程式開發
任務描述所需技能

建立 S3 儲存貯體。

使用 AWS CLI 在您的 AWS 區域建立目的地 S3 儲存貯體,並以您us-east-1的區域取代。 

aws s3api create-bucket \ --bucket reservationfirehosedestinationbucket \ --region us-east-1

請確定 S3 儲存貯體的名稱是全域唯一的,因為該命名空間是由所有 AWS 帳戶共用的。

雲架構師、應用程式開發

為 S3 儲存貯體建立 30 天的生命週期政策。

  1. 登入 AWS 管理主控台並開啟 Amazon S3 主控台。 

  2. 選擇包含來自 Firehose 資料的 S3 儲存貯體。 

  3. 在 S3 儲存貯體中,選擇管理索引標籤,然後選擇新增生命週期規則。 

  4. 在「生命週期規則」對話方塊中輸入規則的名稱,並為值區設定 30 天的生命週期規則。

雲架構師、應用程式開發
任務描述所需技能

建立並設定 Firehose 傳送串流。

從 GitHub 儲存庫下載並編輯CreateFireHoseToS3.py程式碼範例。 

此程式碼以 Python 撰寫,並示範如何建立 Firehose 交付串流和 AWS Identity and Access Management (IAM) 角色。IAM 角色將具有可供 Firehose 用來寫入目標 S3 儲存貯體的政策。

若要執行指令碼,請使用下列命令和命令列引數。

引數 1=<Your_S3_bucket_ARN>,這是您先前建立的儲存貯體的 Amazon 資源名稱 (ARN)

引數 2= 您的 Firehose 名稱(此飛行員正在使firehose_to_s3_stream用。)

引數 3= 您的 IAM 角色名稱 (此試行方案正在使用firehose_to_s3.)

python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3

如果指定的 IAM 角色不存在,指令碼將建立具有受信任關係政策的假設角色,以及授予足夠 Amazon S3 權限的政策。如需這些原則的範例,請參閱其他資訊一節。

雲架構師、應用程式開發

驗證「Firehose」交付串流。

使用 AWS CLI 來確認交付串流是否已成功建立,以描述 Firehose 交付串流。

aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream
雲架構師、應用程式開發
任務描述所需技能

為 Lambda 函數建立信任政策。

使用下列資訊建立信任原則檔案。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

這會提供您的函數存取 AWS 資源的權限。

雲架構師、應用程式開發

建立 Lambda 函數的執行角色。

若要建立執行角色,請執行下列程式碼。

aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json
雲架構師、應用程式開發

將權限新增至角色。

若要將權限新增至角色,請使用attach-policy-to-role指令。

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess
雲架構師、應用程式開發

建立 Lambda 函數。

通過運行以下命令壓縮從代碼存儲庫中的LambdaStreamProcessor.py文件。

zip function.zip LambdaStreamProcessor.py

當您建立 Lambda 函數時,您將需要 Lambda 執行角色 ARN。要獲取 ARN,請運行以下代碼。

aws iam get-role \ --role-name lambda-ex

若要建立 Lambda 函數,請執行下列程式碼。

aws lambda create-function --function-name LambdaStreamProcessor \ --zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \ --role {Your Lamda Execution Role ARN}\ --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = arn:aws:s3:::reservationfirehosedestinationbucket,iam_role_name = firehose_to_s3, batch_size=400}"
雲架構師、應用程式開發

設定 Lambda 函數觸發器。

使用 AWS CLI 設定觸發器 (DynamoDB Streams),此觸發器會叫用 Lambda 函數。400 的批次大小是為了避免遇到 Lambda 並行發生問題。

aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \ --batch-size 400 --starting-position LATEST \ --event-source-arn <Your Latest Stream ARN From DynamoDB Console>
雲架構師、應用程式開發
任務描述所需技能

將具有過期時間戳記的項目新增至「保留區」表格。

若要測試功能,請將具有過期紀元時間戳記的項目新增至資料表Reservation。TTL 會根據時間戳記自動刪除項目。 

Lambda 函數會在 DynamoDB 串流活動時啟動,並篩選事件以識別REMOVE活動或已刪除的項目。然後,它會以批次格式將記錄放入 Firehose 傳送串流中。

Firehose 交付串流會將項目傳輸到具有firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/前置詞的目的地 S3 儲存貯體。

重要:若要優化資料擷取,請使用「其他資訊」一節中詳細ErrorOutputPrefix說明的Prefix和來設定 Amazon S3。

雲端架構師
任務描述所需技能

刪除所有資源。

刪除所有資源,以確保您不會為未使用的任何服務付費。 

雲架構師、應用程式開發

相關資源

其他資訊

建立並設定 Firehose 傳送串流 — 政策範例

Firehose 信任關係政策範例文件

firehose_assume_role = { 'Version': '2012-10-17', 'Statement': [ { 'Sid': '', 'Effect': 'Allow', 'Principal': { 'Service': 'firehose.amazonaws.com' }, 'Action': 'sts:AssumeRole' } ] }

S3 許可政策範例

s3_access = { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "{your s3_bucket ARN}/*", "{Your s3 bucket ARN}" ] } ] }

測試功能 — Amazon S3 組態

選擇具有下列項Prefix目的 Amazon S3 組態來優化資料擷取。ErrorOutputPrefix 

prefix

firehosetos3example/year=! {timestamp: yyyy}/month=! {timestamp:MM}/day=! {timestamp:dd}/hour=!{timestamp:HH}/

Firehose 首先創建一個firehosetos3example直接在 S3 存儲桶下面調用的基本文件夾。然後 !{timestamp:yyyy}!{timestamp:MM}!{timestamp:dd}它會使用 Java DateTimeFormatter格式評估運算式、、和年、月、日和小時。!{timestamp:HH}

例如,在 Unix 紀元時間中,近似的到達時間戳記 1604683577 會評估為year=2020、、和。month=11 day=06 hour=05因此,Amazon S3 中資料記錄交付的位置會評估為firehosetos3example/year=2020/month=11/day=06/hour=05/

ErrorOutputPrefix

firehosetos3erroroutputbase/!{firehose:random-string}/!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd}/

firehosetos3erroroutputbase直接在 S3 儲存貯體下方呼叫的基本資料夾產生ErrorOutputPrefix結果。運!{firehose:random-string}算式會評估為 11 個字元的隨機字串,例如ztWxkdg3Thg。交付失敗記錄的 Amazon S3 物件的位置可以評估到firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/