使用 DynamoDB TTL 自动将项目归档到 Amazon S3 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 DynamoDB TTL 自动将项目归档到 Amazon S3

创建者:Tabby Ward(AWS)

代码存储库:使用 DynamoDB TLL 将项目存档到 S3

环境:PoC 或试点

技术:现代化;数据库;无服务器;存储和备份;成本管理

工作负载:开源

Amazon Web Services:Amazon S3;Amazon DynamoDB;Amazon Kinesis;AWS Lambda

Summary

此模式提供了从 Amazon DynamoDB 表中删除较旧的数据并将其存档到 Amazon Web Services(AWS)上的 Amazon Simple Storage Service(Amazon S3)存储桶的步骤,而无需管理服务器实例集。 

此模式使用 Amazon DynamoDB 生存时间(TTL)自动删除旧项目,使用 Amazon DynamoDB Streams 来捕获 TTL 过期项目。然后,它将 DynamoDB Streams 连接到 AWS Lambda,后者无需预调配或管理任何服务器即可运行代码。 

向 DynamoDB 流中添加新项目时,Lambda 函数会启动,并将数据写入亚马逊数据 Firehose 传输流。Firehose 提供了一种简单、完全托管的解决方案,可将数据作为存档加载到 Amazon S3 中。

DynamoDB 通常用于存储时间序列数据,例如来自传感器和联网设备的网页点击流数据或物联网(IoT)数据。许多客户不想删除访问频率较低的项目,而是将其存档以供审计。TTL 根据时间戳属性自动删除项目,从而简化了存档。 

DynamoDB Streams 中可以识别由 TTL 删除的项目,DynamoDB Streams 可捕获按时间排序的项目级修改序列,并将该序列存储在日志中长达 24 个小时。这些数据可由 Lambda 函数使用并存档在 Amazon S3 存储桶中,以降低存储成本。为了进一步降低成本,可以创建 Amazon S3 生命周期规则,自动将(创建的)数据立即转换为成本最低的存储类别,例如 S3 Glacier 即时检索或 S3 Glacier 灵活检索,或者用于长期存储的 Amazon S3 Glacier Deep Archive。

先决条件和限制

先决条件

架构

技术堆栈

  • Amazon DynamoDB

  • Amazon DynamoDB Streams

  • 亚马逊 Data Firehose

  • AWS Lambda

  • Amazon S3

  1. TTL 会删除项目。

  2. DynamoDB 流触发器调用 Lambda 流处理器函数。

  3. Lambda 函数以批处理格式将记录放入 Firehose 交付流中。

  4. 数据记录存档在 S3 存储桶中。

工具

  • AWS CLI – AWS 命令行界面(AWS CLI)是用于管理 Amazon Web Services 的统一工具。

  • Amazon DynamoDB – Amazon DynamoDB 是一个键值和文档数据库,在任何规模上都能提供个位数的毫秒性能。

  • Amazon DynamoDB 生存时间(TTL)– Amazon DynamoDB TTL 可以定义每个项目的时间戳,以确定何时不再需要某个项目。

  • Amazon DynamoDB Streams – Amazon DynamoDB Streams 可在任何 DynamoDB 表中捕获按时间排序的项目级修改序列,并将这类信息存储在日志中长达 24 个小时。

  • Amazon Data Firehos e — Amazon Data Firehose 是将流数据可靠地加载到数据湖、数据存储和分析服务的最简单方法。

  • AWS Lambda – AWS Lambda 无需预调配或管理服务器即可运行代码。您只需按使用的计算时间付费。

  • Amazon S3 – Amazon Simple Storage Service(Amazon S3)是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。

代码

此模式的代码可在使用 DynamoDB TTL 存储库将项目 GitHub 存档到 S3 中找到。

操作说明

任务描述所需技能

创建 DynamoDB 表。

使用 AWS CLI 在 DynamoDB 中创建一个名为 Reservation的表。选择随机读取容量单位(RCU)和写入容量单位(WCU),并给表两个属性:ReservationIDReservationDate。 

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 TTL。

使用 AWS CLI 为 ReservationDate属性开启 DynamoDB TTL。

aws dynamodb update-time-to-live \ --table-name Reservation\ --time-to-live-specification Enabled=true,AttributeName=ReservationDate
云架构师、应用程序开发人员

开启 DynamoDB 流。

使用 AWS CLI 通过 NEW_AND_OLD_IMAGES流类型为 Reservation表打开 DynamoDB 流。 

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

此流将包含新项目、更新项目、已删除项目和由 TTL 删除的项目的记录。由 TTL 删除的项目的记录包含一个额外的元数据属性,用于将其与手动删除的项目区分开来。TTL 删除的 userIdentity字段表示 DynamoDB 服务执行了删除操作。 

在这种模式中,只有通过 TTL 删除的项目才会被存档,但只能存档 eventNameREMOVE以及 userIdentity包含等于 dynamodb.amazonaws.comprincipalId的记录。

云架构师、应用程序开发人员
任务描述所需技能

创建 S3 存储桶。

使用 AWS CLI 在 Amazon Web Services Region 中创建目标 S3 存储桶,us-east-1 替换为您的区域。 

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

确保 S3 存储桶名称是全局唯一的,因为命名空间由所有 Amazon Web Services account 共享。

云架构师、应用程序开发人员

为 S3 存储桶创建 30 天的生命周期策略。

  1. 登录 Amazon Web Services Management Console,打开 Amazon S3 控制台。 

  2. 选择包含来自 Firehose 的数据的 S3 存储桶。 

  3. 在 S3 存储桶中,选择管理选项卡,然后选择添加生命周期规则。 

  4. 生命周期规则对话框内输入规则名称,并为存储桶配置 30 天生命周期规则。

云架构师、应用程序开发人员
任务描述所需技能

创建和配置 Firehose 传送流。

从 GitHub 存储库下载并编辑CreateFireHoseToS3.py代码示例。 

此代码是用 Python 编写的,向您展示了如何创建 Firehose 传输流和 AWS 身份和访问管理 (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 Stream 活动时启动的,它会筛选事件以识别 REMOVE活动或已删除的项目。然后,它以批处理格式将记录放入 Firehose 传送流。

Firehose 交付流将项目传输到带有前缀的目标 S3 存储桶。firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/

重要提示:要优化数据检索,请使用 PrefixErrorOutputPrefix配置 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 配置

选择具有以下 PrefixErrorOutputPrefix前缀的 Amazon S3 配置来优化数据检索。 

prefix

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

Firehose 首先在 S3 存储桶下创建一个firehosetos3example名为的基本文件夹。然后,它使用 Java DateTimeFormatter格式!{timestamp:HH}将表达式!{timestamp:yyyy}!{timestamp:MM}!{timestamp:dd}、、和计算为年、月、日和小时。

例如,在 Unix 纪元时间中,1604683577 的近似到达时间戳的评估结果为 year=2020month=11day=06hour=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}/

ErrorOutputPrefix 结果会直接在 S3 存储桶下生成名为 firehosetos3erroroutputbase的基本文件夹。表达式 !{firehose:random-string}的评估结果为 11 个字符的随机字符串,例如 ztWxkdg3Thg。传输失败记录的 Amazon S3 对象的位置可以评估为 firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/