本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用動 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 生命週期規則,將資料 (一旦建立完成) 自動轉移到成本最低的儲存類別
先決條件和限制
先決條件
作用中的 AWS 帳戶
AWS Command Line Interface (AWS CLI) (AWS CLI) 1.7 或更新版本,可在 macOS、Linux 或視窗上安裝和設定。
Python 3.7
或更高版本。 Boto3
, 安裝和配置. 如果 Boto3 尚未安裝,請執行 python -m pip install boto3
指令以進行安裝。
架構
技術, 堆
Amazon DynamoDB
Amazon DynamoDB 串流
Amazon 數據 Firehose
AWS Lambda
Amazon S3
![從 DynamoDB 到 S3 儲存貯體的四個步驟程序。](images/pattern-img/9dbc833f-cf3c-4574-8f09-d0b81134fe41/images/50d9da65-5398-4a99-bc8f-58afc80e9d7b.png)
TTL 會刪除項目。
DynamoDB 串流觸發程序會叫用 Lambda 串流處理器函數。
Lambda 函數會以批次格式將記錄放入 Firehose 交付串流中。
資料記錄會存檔在 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 中建立一個名為的表格。
| 雲架構師、應用程式開發 |
開啟 DynamoDB 資料庫。 | 使用 AWS CLI 為屬性開啟 DynamoDB 資料庫 TTL。
| 雲架構師、應用程式開發 |
開啟動 DynamoDB 料流。 | 使用 AWS CLI 透過使用串流類型為
此資料流會包含 TTL 所刪除之新項目、更新項目、刪除的項目和項目的記錄。TTL 刪除之項目的記錄包含一個額外的中繼資料屬性,以區分它們與手動刪除的項目。用於 TTL 刪除的 在此模式中,只有 TTL 刪除的項目會封存,但您只能封存存在 | 雲架構師、應用程式開發 |
任務 | 描述 | 所需技能 |
---|---|---|
建立 S3 儲存貯體。 | 使用 AWS CLI 在您的 AWS 區域建立目的地 S3 儲存貯體,並以您
請確定 S3 儲存貯體的名稱是全域唯一的,因為該命名空間是由所有 AWS 帳戶共用的。 | 雲架構師、應用程式開發 |
為 S3 儲存貯體建立 30 天的生命週期政策。 |
| 雲架構師、應用程式開發 |
任務 | 描述 | 所需技能 |
---|---|---|
建立並設定 Firehose 傳送串流。 | 從 GitHub 儲存庫下載並編輯 此程式碼以 Python 撰寫,並示範如何建立 Firehose 交付串流和 AWS Identity and Access Management (IAM) 角色。IAM 角色將具有可供 Firehose 用來寫入目標 S3 儲存貯體的政策。 若要執行指令碼,請使用下列命令和命令列引數。 引數 1= 引數 2= 您的 Firehose 名稱(此飛行員正在使 引數 3= 您的 IAM 角色名稱 (此試行方案正在使用
如果指定的 IAM 角色不存在,指令碼將建立具有受信任關係政策的假設角色,以及授予足夠 Amazon S3 權限的政策。如需這些原則的範例,請參閱其他資訊一節。 | 雲架構師、應用程式開發 |
驗證「Firehose」交付串流。 | 使用 AWS CLI 來確認交付串流是否已成功建立,以描述 Firehose 交付串流。
| 雲架構師、應用程式開發 |
任務 | 描述 | 所需技能 |
---|---|---|
為 Lambda 函數建立信任政策。 | 使用下列資訊建立信任原則檔案。
這會提供您的函數存取 AWS 資源的權限。 | 雲架構師、應用程式開發 |
建立 Lambda 函數的執行角色。 | 若要建立執行角色,請執行下列程式碼。
| 雲架構師、應用程式開發 |
將權限新增至角色。 | 若要將權限新增至角色,請使用
| 雲架構師、應用程式開發 |
建立 Lambda 函數。 | 通過運行以下命令壓縮從代碼存儲庫中的
當您建立 Lambda 函數時,您將需要 Lambda 執行角色 ARN。要獲取 ARN,請運行以下代碼。
若要建立 Lambda 函數,請執行下列程式碼。
| 雲架構師、應用程式開發 |
設定 Lambda 函數觸發器。 | 使用 AWS CLI 設定觸發器 (DynamoDB Streams),此觸發器會叫用 Lambda 函數。400 的批次大小是為了避免遇到 Lambda 並行發生問題。
| 雲架構師、應用程式開發 |
任務 | 描述 | 所需技能 |
---|---|---|
將具有過期時間戳記的項目新增至「保留區」表格。 | 若要測試功能,請將具有過期紀元時間戳記的項目新增至資料表 Lambda 函數會在 DynamoDB 串流活動時啟動,並篩選事件以識別 Firehose 交付串流會將項目傳輸到具有 重要:若要優化資料擷取,請使用「其他資訊」一節中詳細 | 雲端架構師 |
任務 | 描述 | 所需技能 |
---|---|---|
刪除所有資源。 | 刪除所有資源,以確保您不會為未使用的任何服務付費。 | 雲架構師、應用程式開發 |
相關資源
其他資訊
建立並設定 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/
。