私が歌川です

@utgwkk が書いている

TerraformでDynamoDB localのテーブルを作成しようとするとタイムアウトする現象

2026/3/30 追記: 表題の現象を回避するためのプロキシを書きました。

blog.utgw.net

github.com


表題のことが以下のバージョンで発生している。

  • DynamoDB local 3.3.0
  • terraform-provider-aws 6.38.0

起こっていること

まっさらな状態のDynamoDB localに対してテーブルを作成する変更をapplyしようとすると、2分半ほど待たされてタイムアウトしてしまう。

% terraform apply -auto-approve

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_dynamodb_table.test will be created
  + resource "aws_dynamodb_table" "test" {
      + arn              = (known after apply)
      + billing_mode     = "PAY_PER_REQUEST"
      + hash_key         = "pk"
      + id               = (known after apply)
      + name             = "test"
      + range_key        = "sk"
      + read_capacity    = (known after apply)
      + region           = "ap-northeast-1"
      + stream_arn       = (known after apply)
      + stream_label     = (known after apply)
      + stream_view_type = (known after apply)
      + tags_all         = (known after apply)
      + write_capacity   = (known after apply)

      + attribute {
          + name = "pk"
          + type = "S"
        }
      + attribute {
          + name = "sk"
          + type = "S"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.
aws_dynamodb_table.test: Creating...
aws_dynamodb_table.test: Still creating... [10s elapsed]
aws_dynamodb_table.test: Still creating... [20s elapsed]
(中略)
aws_dynamodb_table.test: Still creating... [2m20s elapsed]
aws_dynamodb_table.test: Still creating... [2m30s elapsed]
╷
│ Error: waiting for update AWS DynamoDB Table (test): couldn't find resource (21 retries)
│ 
│   with aws_dynamodb_table.test,
│   on main.tf line 25, in resource "aws_dynamodb_table" "test":
│   25: resource "aws_dynamodb_table" "test" {
│ 
╵

原因

terraform-provider-aws v6.13.0でaws_dynamodb_tableリソースに対するWarmThroughputのサポートが入った。

github.com

この変更によって、DynamoDBのテーブルに対して DescribeTable APIを呼び出して得られたレスポンスの Tables.WarmThroughput フィールドの存在を確認が行われるようになった。

一方で、DynamoDB localはWarmThroughputをサポートしていない。実際に DescribeTable APIを呼び出してみると、Table.WarmThroughput フィールドがないことが分かる。

{
  "Table": {
    "AttributeDefinitions": [
      { "AttributeName": "sk", "AttributeType": "S" },
      { "AttributeName": "pk", "AttributeType": "S" }
    ],
    "TableName": "test",
    "KeySchema": [
      { "AttributeName": "pk", "KeyType": "HASH" },
      { "AttributeName": "sk", "KeyType": "RANGE" }
    ],
    "TableStatus": "ACTIVE",
    "CreationDateTime": 1774787505.241,
    "ProvisionedThroughput": {
      "LastIncreaseDateTime": 0.0,
      "LastDecreaseDateTime": 0.0,
      "NumberOfDecreasesToday": 0,
      "ReadCapacityUnits": 0,
      "WriteCapacityUnits": 0
    },
    "TableSizeBytes": 0,
    "ItemCount": 0,
    "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/test",
    "BillingModeSummary": {
      "BillingMode": "PAY_PER_REQUEST",
      "LastUpdateToPayPerRequestDateTime": 1774787505.241
    },
    "DeletionProtectionEnabled": false
  }
}

これらの組み合わせによって、terraform-provider-aws v6.13.0以降を使ってDynamoDB localのテーブルを作成しようとするとタイムアウトするようになったと考えられる。

対策

DynamoDB localの実装が修正されるのを待つのが最も素直だと思う。筆者のほうでAWSのサポートケースを起票したので、問題は認識してもらえているとは思う。

今すぐに不具合を回避したいなら、terraform-provider-aws v6.12.0にバージョンを固定するのが早い。DynamoDB localだけなら多少Terraform providerのバージョンが古くてもやっていけるかもしれない。ただし、マルチキーGSI*1など新しめの機能を使っている場合はダウングレードするのが難しい場合もありそう。

LocalStackを使うことでも問題を回避できるかもしれないが、筆者は検証していない。

検証

「原因」の節では、以下の組み合わせによってタイムアウトするようになった、という仮説を述べた。

  • 新しいterraform-provider-awsが WarmThroughput フィールドの存在確認を行うようになった
  • DynamoDB localはWarmThroughput機能をサポートしておらず、当該フィールドを DescribeTable APIで返さない

この仮説は正しいのか? つまり、DynamoDB Localが WarmThroughput フィールドを返すようになったら terraform apply が正常終了するようになるのだろうか。

……ということを以下のリポジトリで検証した。そしてどうやら仮説は正しそうである。

github.com

main.go はDynamoDB localに対するリクエストのプロキシとして機能する。DynamoDB localに対する DescribeTable APIの呼び出しが正常終了したとき、レスポンスボディの Table.WarmThroughput フィールドにダミーの値を詰めて返すようにしている。どのAPIを呼び出しているかは X-Amz-Target リクエストヘッダを見ると分かるので、この値によって分岐を入れている。バイブコーディングなしで手書きしまくっているし、デバッグの跡が残っているのでコードの見た目はあんまりよくない。

おわりに

TerraformでDynamoDB localのテーブルを作成しようとするとタイムアウトする現象と、その対策について述べた。原因と考えられる仮説 (DescribeTable APIのレスポンスボディのフィールドが足りないこと) に対して、実際に DescribeTable APIのレスポンスボディを変形させることで検証を行った。

Terraformを使って手元の開発環境のDynamoDB localのテーブルを管理できるようにすると、マイグレーションスクリプトなどが不要になって便利だろう、と考えて手を動かしているうちに、この記事に書いたような不具合を踏み抜いた。

この不具合の原因はClaude Opusが発見し、人間が検証を行うことで確定した。デバッグの泥沼にハマったら強いモデルを使うことで解決できるかもしれない、という体験になったのであった。よかったですね。

時間のないサイト運営者リング