2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Serverless FrameworkでDynamoDBのttl(有効期限)を設定するときの注意点

Posted at

DynamoDBに有効期限を設定する

DynamoDBの項目を自動で削除したいので、TTL(有効期限)を設定することにしました。
以下のようにserverless.ymlに追記します。

serverless.yml
resources:
  Resources:
    DemoDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        TableName: ${self:service}-${self:provider.stage}-${self:custom.pj-env.dynamo1}
        AttributeDefinitions:
          - AttributeName: request_id
            AttributeType: S
         ################ ↓追加 ################
          - AttributeName: expired_at_unix_time
            AttributeType: N
         ################ ↑追加 ################
        KeySchema:
          - AttributeName: request_id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
         ################ ↓追加 ################
        TimeToLiveSpecification:
          AttributeName: expired_at_unix_time
          Enabled: true
         ################ ↑追加 ################

呼び出し元のLambda(Python)はこんな感じにしています。
これは項目を登録して15分後に有効期限が切れる設定です。

handler.py
from datetime import datetime, timezone, timedelta
from decimal import Decimal
import boto3

def alerts(event, context):
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table(DYNAMO_TABLENAME1)
    request_id = '1234567890'
    expired_at_unix_time = Decimal((datetime.now() + timedelta(minutes=15)).timestamp())

    response = table.put_item(
        Item={
            'request_id': request_id,
            'expired_at_unix_time': expired_at_unix_time,
        }
    )

エラー発生

sls deploy -vするとエラーが発生・・。

ServerlessError: An error occurred: DemoDynamoDbTable - One or more parameter values were invalid: Number of attributes in KeySchema does not exactly match number of attributes defined in AttributeDefinitions 
(Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 8AMRJ8FQDP78L8T73PE0M06VRNVV4KQNSO5AEMVJF66Q9ASUAAJG).

翻訳するとこんな意味でした

DemoDynamoDbTable - 1 つ以上のパラメータ値が無効です。KeySchema の属性の数が、AttributeDefinitions で定義されている属性の数と正確に一致しません。

調査した結果

AttributeDefinitionsにはキー以外の設定いらないというのが結論でした。
以下のようにserverless.ymlを修正して再度、sls deploy -vします。

serverless.yml
resources:
  Resources:
    DemoDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        TableName: ${self:service}-${self:provider.stage}-${self:custom.pj-env.dynamo1}
        AttributeDefinitions:
          - AttributeName: request_id
            AttributeType: S
         ################ ↓不要 ################
#          - AttributeName: expired_at_unix_time
#            AttributeType: N
         ################ ↑不要 ################
        KeySchema:
          - AttributeName: request_id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
         ################ ↓追加 ################
        TimeToLiveSpecification:
          AttributeName: expired_at_unix_time
          Enabled: true
         ################ ↑追加 ################

これで、無事にデプロイ完了し、DynamoDBへの項目の登録、および有効期限による自動削除ができました。

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?