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への項目の登録、および有効期限による自動削除ができました。