Terraformでimportブロックを使ったインポート方法
以前はリソースをインポートする場合、コマンドラインでリソースのIDを指定して取り込みを行っていたが、これに替わる方法としてTerraform v1.5から import ブロックが導入された。
簡単な使い方は以下の通り。
resource "aws_route53_record" "delegation" {}
import { # Route 53のIDは特殊で、[Zone_ID]_[Domain]_[Type]となる id = "Z123456_example.com_NS" to = aws_route53_record.delegation}上記ではRoute 53のレコードを取り込みしている例を書いている。delegation リソースは import 実行時に生成されるので最初は空白で良い。またRoute 53のIDは特殊な形式となっていて、id はいくつかの値をアンダースコアで区切ったものが使われる。このルールはaws_route53_recordのImportセクションに書いてある。to は文字列ではなくリソース定義そのものを渡す。
Terraform 1.12からは、上記のIDは文字列ではなく identity ブロックとしても記述できるようになった。こちらの形式であれば順番も間違えづらいし、それぞれの意味も分かりやすいので、基本的にはこちらを使うほうが望ましい。
import { identity = { zone_id = data.aws_route53_zone.hatena_gigaviewer_com.zone_id name = local.mirage_domain type = "NS" } to = aws_route53_record.delegation}最後に全部入りの例を示す。import するリソースがデフォルトではないプロバイダで定義されている場合は import ブロックに provider を使って明記すればいい。
locals { domain_name = "authz.example.com"}
resource "aws_route53_zone" "authz" { name = local.domain_name}
data "aws_route53_zone" "authz_example_com" { provider = aws.hatena
name = "example.com."}
resource "aws_route53_record" "delegation" { provider = aws.hatena
zone_id = data.aws_route53_zone.authz_example_com.zone_id name = local.domain_name ttl = 172800 type = "NS" records = aws_route53_zone.authz.name_servers}
import { provider = aws.hatena identity = { zone_id = data.aws_route53_zone.authz_example_com.zone_id name = local.domain_name type = "NS" } to = aws_route53_record.delegation}定義が終わったらTerraform CloudならApplyを実行する。コマンドラインでも同じだろう。