祝 terraform v0.12.0 リリース！ upgrade やっていき！

# 祝 terraform v0.12.0

待望ってゆうか、予定から遅れに遅れてようやくリリースとなった v0.12 なので、手元のアップグレードをちまちま試しながら記事にしていこうと思います。

* https://www.hashicorp.com/blog/announcing-terraform-0-12
* https://github.com/hashicorp/terraform/releases
* https://www.terraform.io/upgrade-guides/0-12.html
    * やることはこれ↑

# 手順メモ

## バージョンアップ前

* tf が破壊される（元に戻せない変更が入る）のでバックアップ等必須
* ステートもダメージを受ける可能性があるのでバックアップ等必須（S3のバージョニング便利）
* 0.12upgrade でファイル末尾空行が出るっぽいので確認のためにも terraform fmt しておいたほうがいいかも
* v0.11.14 の 0.12checklist も試したいので先に v0.11.14 にして apply しておくといいかも（常にplan運用してれば問題ないはず）
* 結果的に Looks Good って言われるだけだった

## バージョンアップ直前

* この時点で v0.11.14 である
* plan で差分はない
* fmt 済
* 0.12checklist 済

## バージョンアップ

* terraform は go なのでアーカイブ落としてきてバージョン別に置いておいてシンボリックリンクで切り替えると楽
* docker 使うのもありだけどさすがにシンボリックリンクでの切り替えスピードには勝てないｗ
* そういえばTw見ててtfenvってのもあったねって

## バージョンアップ後準備

* v0.12.0 にしたらドキュメントのとおり init 
* terraform 0.12upgrade を実行
    * terraform のバージョンを指定する provider が追加される
    * tfファイルの変更がたくさんでる
* plan で差分がないことを確認
    * 差分の前にエラーになっちゃうところがあって詰まってる


# 発生した差分検証

```
# dataリソースからのoutputもoutputsに押し込まれた
-  name                 = "${data.terraform_remote_state.global.project_code}-admin"
+  name                 = "${data.terraform_remote_state.global.outputs.project_code}-admin"


# 変数の皮むき
-  assume_role_policy   = "${data.aws_iam_policy_document.admin.json}"
+  assume_role_policy   = data.aws_iam_policy_document.admin.json

# （要検証）皮むきと outputs は同一行に処理されない？
-  log_group_name = "${module.cloudtrail.cloudwatch_log_group_name}"
+
+  log_group_name = module.cloudtrail.cloudwatch_log_group_name


# 一番多い末尾改行（ファイル末尾に空の行が追加される）
 }
+


# variable の type 表記変更
-  type = "list"
+  type = list(string)




# block argument も = でつなぐ
-  config {
+  config = {

  
# （要検証）皮むきするとfmtが崩れるかも？
-  alarm_name  = "${aws_cloudwatch_log_metric_filter.trail-console-login-failure.name}"
-  metric_name = "${aws_cloudwatch_log_metric_filter.trail-console-login-failure.name}"
-  namespace   = "LogMetrics"
+  alarm_name = aws_cloudwatch_log_metric_filter.trail-console-login-failure.name
+  metric_name = aws_cloudwatch_log_metric_filter.trail-console-login-failure.name
+  namespace = "LogMetrics"


# upgrade 以外のことしないでーｗ
-  topic = "cloudtrail-${replace(data.terraform_remote_state.global.project_domain, "." , "-")}"
+  topic = "cloudtrail-${replace(
+    data.terraform_remote_state.global.outputs.project_domain,
+    ".",
+    "-",
+  )}"

# コメント消し去らないで。。。ｗ（たぶん配列を整理した過程で落ちたね
   config_policy_attachment = [
-    // Config が管理できるリソースを参照する権限
     "arn:aws:iam::aws:policy/service-role/AWSConfigRole",
-
-    // S3 に記録を残すためにputできる権限（bucketやコンディションで縛るの大変なので）
     "arn:aws:iam::aws:policy/AmazonS3FullAccess",
   ]

# インデントも消すんかい（末尾改行辺りとコンフリクトしてるっぽい）
 output "config_iam_role_arn" {
-  value = "${aws_iam_role.config.arn}"
+value = aws_iam_role.config.arn
 }
+


# {} の開き
-data "aws_region" "current" {}
+data "aws_region" "current" {
+}


# 場合によって閉じるの？！
-  depends_on = [
-    "aws_vpc_peering_connection.util",
-  ]
+  depends_on = [aws_vpc_peering_connection.util]




```

# 細かい変更？

## Argument をくくっちゃダメになった

そもそもこの自作モジュール（DataDogとつないでるとこ）のこの部分だけなんでダブルクオーテーションでくくっていたのか自分でもわからないのだけれどｗ

```
Error: Invalid argument name

  on ../../../modules/datadog_aws_integration/aws_iam.tf line 5, in data "aws_iam_policy_document" "trust_datadog":
   5:   "statement" {

Argument names must not be quoted.
```



# slack に投げたメモ

ここは後で整理して消す予定。

## block に = が必要になった

```
terraform plan

Error: Unsupported block type

  on state.tf line 4, in data "terraform_remote_state" "global":
   4:   config {

Blocks of type "config" are not expected here. Did you mean to define argument
"config"? If so, use the equals sign to assign it a value.

# 差分
@@ -1,9 +1,10 @@
 data "terraform_remote_state" "global" {
   backend = "s3"

-  config {
+  config = {

```

## 0.12upgrade でファイル末尾空行

fmt ではなくて 0.12upgrade コマンドで付与されてしまうみたい

## versions.tf

バージョン固定していなかったので勝手にファイルができる

```
cat versions.tf
terraform {
  required_version = ">= 0.12"
}
```

## null?

tfファイルでは aws_iam_role にタグをつけてなかったんだけど、upgrade 後の plan を見ると null に変更しようとする

```
     - tags                  = {} -> null
```


時間切れで検証は今のところここまで。

plan してエラーが発生するのは確認済なので、そうやすやすとはアップグレードできないかもなーという感想。
明日再度がんばります。