Skip to content

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を実行する。コマンドラインでも同じだろう。