terraform provider graylog で alert condition と stream rule の import を実装しました。
- https://github.com/suzuki-shunsuke/go-graylog/pull/59
- https://github.com/suzuki-shunsuke/go-graylog/pull/60
そこで import を実装する方法を紹介したいと思います。
terraform でリソースをimportするにはリソースがimportをサポートしている必要があります。 schema.Resource の Importer フィールドですね。リソースがIDだけでGet出来る場合、schema.ImportStatePassthroughを使えば終わりです。 一方、Graylogのalert condition や stream rule はIDだけでなく、stream id も必要になります。 terraform import コマンドは1つの引数しか取らないため、サポートできないのでは?と以前まで思っていました。 そういった場合、次のようにStateFuncを実装すればサポートできます。
# "/" で区切って stream id と ID を渡す
$ terraform import graylog_alarm_callback.test 5bb1b4b5c9e77bbbbbbbbbbb/5c4acaefc9e77bbbbbbbbbbb
区切り文字は何でも良いのでしょうが、公式のprovider が "/" で区切っていたのでそれに従うことにしました。
https://www.terraform.io/docs/providers/google/r/spanner_database.html#import
https://godoc.org/github.com/hashicorp/terraform/helper/schema#ImportStatePassthrough の実装を見てみれば分かりますが、
StateFunc の中では GET API を叩いてリソースを取得したりはしません。
terraform import
コマンドの標準出力を見ると分かりますが refresh を実行しているのでそこでGETしているようです。
StateFunc は *schema.ResourceData の配列を返しますが、これは1度のGETで複数のリソースを取得するようなAPIをサポートするためのようです。
以上、terraform import の実装方法について紹介しました。