LoginSignup
1
0

More than 3 years have passed since last update.

【Tips】TerraformでDynamoDBにそこそこの量のアイテムを初期構築でputしておく方法

Last updated at Posted at 2020-09-10

はじめに

DynamoDBとLambdaで色々試してると、ふと検証のために大量データを予め入れておきたくなったりするよね。
それ、Terraformで簡単に実現できるんです。

※そんなのPythonでboto3使ってbatch_writer()で書けば5分で済むだろ、とかそういうツッコミは一旦抜きにして。

どうやってIaCで書くのか

countを使う。以上。

だと終わってしまうので、もう少し解説。

resource "aws_dynamodb_table_item" "batch_items" {
  count = 100

  table_name = aws_dynamodb_table.test.name
  hash_key   = aws_dynamodb_table.test.hash_key
  range_key  = aws_dynamodb_table.test.range_key

  item = <<ITEM
{
  "id": {"S": "${format("%03d", count.index + 1)}"},
  "name": {"S": "テストデータ${count.index + 1}"}
}
ITEM
}

ハッシュキーがかぶってしまうと、当然同じアイテム扱いになってしまう。
単純に連番にしたいのであれば、${count.index}で今のループ回数にアクセスできる。
0オリジンなので注意が必要。

さらに、001, 002, 003…… と形式が決まっているときは、format関数を使う。

これで「queryやscanで取ってくる件数が変わった時にどれくらい性能差があるの?」と聞かれても焦ることなくデータが作れるようになるぞ!

ループではなくてもっと自由にデータを編集してロードしたい人向け

大量データではないものの、もっと簡単にデータを敷き込みたい!という要望を受けたので考えた。
Terraform の csvdecode を使おう。

resource "aws_dynamodb_table_item" "batch_items" {
  for_each = { for record in local.dataset : record.id => record }

  table_name = aws_dynamodb_table.test.name
  hash_key   = aws_dynamodb_table.test.hash_key
  range_key  = aws_dynamodb_table.test.range_key

  item = <<ITEM
{
  "id": {"S": "${each.value.id}"},
  "name": {"S": "${each.value.name}"}
}
ITEM
}

locals {
  csv_data = file("${path.module}/test.csv")

  dataset = csvdecode(local.csv_data)
}
test.csv
id,name
001,Taro
002,Jiro
003,Saburo
004,Shiro
005,Goro

これで、CSVだけ編集すればロードするデータをお手軽に変更することができるようになる!

1
0
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
1
0