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

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

# 参考
- [DynamoDBでちょっとハマった話](http://knyacki.hatenablog.com/entry/2017/10/21/103513)- -