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的主要内容,如果未能解决你的问题,请参考以下文章

在Dynamo DB中索引本地二级索引

扫描Dynamo DB中的特定行

如何将现有的关系数据库模型转换为适合无 sql 数据库的模型(如 Mongo DB 或 Amazon Dynamo DB)

在 Dynamo DB 中对本地二级索引进行索引

如何在 AWS lambda 函数中设置 dynamo db 触发器

Dynamo可视化程序结构剖析BIM