はじめに
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だけ編集すればロードするデータをお手軽に変更することができるようになる!