CloudFormation - 为 DynamoDB 创建表启用 TTL
Posted
技术标签:
【中文标题】CloudFormation - 为 DynamoDB 创建表启用 TTL【英文标题】:CloudFormation - Enable TTL for DynamoDB Create Table 【发布时间】:2017-08-10 22:15:52 【问题描述】:我想通过 CloudFormation 为我新创建的表启用 TTL。我尝试了以下方法无济于事:
"Resources" :
"mytable" :
"Type" : "AWS::DynamoDB::Table",
"Properties" :
"TableName" : "my_table",
"ProvisionedThroughput" : "ReadCapacityUnits" : 1, "WriteCapacityUnits" : 5,
"KeySchema" :
[
"AttributeName" : "user_email", "KeyType" : "HASH",
"AttributeName" : "datetime", "KeyType" : "RANGE"
],
"AttributeDefinitions": [
"AttributeName" : "user_email", "AttributeType" : "S",
"AttributeName" : "datetime", "AttributeType" : "S"
],
"TimeToLiveDescription":
"AttributeName": "expire_at",
"TimeToLiveStatus": "ENABLED"
我使用了我从this doc 获得的 TimeToLiveDescription。
尝试创建堆栈时出现以下错误:
Encountered unsupported property TimeToLiveDescription
【问题讨论】:
我最初也是这样做的。属性 TimeToLiveDescription 是描述表的输出,而不是创建表时资源声明的一部分。命名有点混乱。 【参考方案1】:现在存在对 CloudFormation 的 DynamoDB TTL 支持。见:
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-timetolivespecification.html
例子:
"TableName": "MyTable",
"AttributeDefinitions": [
"AttributeName": "Uid",
"AttributeType": "S"
],
"KeySchema": [
"AttributeName": "Uid",
"KeyType": "HASH"
],
"ProvisionedThroughput":
"ReadCapacityUnits": "1",
"WriteCapacityUnits": "1"
,
"TimeToLiveSpecification":
"AttributeName": "TimeToLive",
"Enabled": "TRUE"
【讨论】:
我不明白这个例子。表示Item必须有一个名为“TimeToLive”的属性,属性类型为“N”??你能提供一个 dynamoDB.putItem() 方法的例子吗?【参考方案2】:为了完整起见,下面是一个示例 CloudFromation YAML,它创建一个启用了 TTL 的表
AWSTemplateFormatVersion: '2010-09-09'
Description: The database for my Service
Resources:
BatchDataTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: "MyDynamoTable"
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: Id
AttributeType: S
- AttributeName: SortKey
AttributeType: S
KeySchema:
- AttributeName: Id
KeyType: "HASH"
- AttributeName: SortKey
KeyType: "RANGE"
TimeToLiveSpecification:
AttributeName: TimeToLive
Enabled: true
现在,如果您使用名为“TimeToLive”的属性将项目添加到此表,并将其值设置为项目应到期的 Unix 纪元,则 DynamoDB 将在达到 TTL 时从该表中清除该项目。
【讨论】:
属性名称不应该在双引号内吗?或者这只是可选的? 它是可选的。我尽量与引用保持一致:-)【参考方案3】:AWS Dynamo DB 的 TTL 是一项新功能(于 2017 年 2 月推出),就像 Jared 在他的回答中提到的那样,AWS Cloudformation 似乎还不支持它。与此同时,您可以做的 - 如果您在同一个 cloudformation 模板中启动一个新的 EC2 实例 - 执行(在 UserData 下)您链接到的 aws cli 命令,将更新 TTL aws dynamodb update-time-to-live --table-name TTLExample --time-to-live-specification "Enabled=true, AttributeName=ttl"
,制作一个参考您的发电机数据库资源(mytable)。 (还要确保该实例使用的 IAM 角色具有能够更新此资源的必要策略)。
【讨论】:
即使我没有启动新的 EC2 实例,我是否可以在模板中执行 CLI 命令? CLI 命令需要在某种类型的主机或环境上执行——据我所知,另一种替代方法是添加一个执行 cli 命令的 Lambda 函数。你可以在这里阅读更多关于它的信息:alestic.com/2016/11/aws-lambda-awscli我不知道任何其他方法。 我知道的唯一其他方法(不在模板中)是使用像 Jenkis 这样的构建服务/服务器来启动 Cloudformation 堆栈,然后从构建服务器执行必要的 aws 命令。 (您需要在服务器上安装 AWS cli 等)。 您好,在dynamo中启用了ttl,但是dynamodb只删除了id的字段而不删除记录,为什么会这样?【参考方案4】:该链接是 AWS CLI 的示例。
cloudformation 尚未添加对配置 DynamoDB TTL 的支持。
【讨论】:
已添加!以上是关于CloudFormation - 为 DynamoDB 创建表启用 TTL的主要内容,如果未能解决你的问题,请参考以下文章
如何将现有的关系数据库模型转换为适合无 sql 数据库的模型(如 Mongo DB 或 Amazon Dynamo DB)