4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

terraform plan で JSON に発生した差分 `whitespace changes` の話

Posted at

EventBridge Scheduler で Lambda に渡すパラメーターを設定している時1に、terraform plan で JSON に差分が発生しました。

出た差分はこんな感じ。真ん中の方に whitespace changes って書いてあるやつです。

$ terraform plan
(省略)
Terraform will perform the following actions:
  
  # module.hoge.aws_scheduler_schedule.hoge_schedule will be updated in-place
  ~ resource "aws_scheduler_schedule" "hoge_schedule" {
        id                           = "default/hoge"
        name                         = "hoge"
        # (5 unchanged attributes hidden)

      ~ target {
          ~ input    = jsonencode( # whitespace changes
                {
                    scheduled_time   = "<aws.scheduler.scheduled-time>"
                }
            )
            # (2 unchanged attributes hidden)

            # (2 unchanged blocks hidden)
        }

        # (1 unchanged block hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

これを差分が出ないように修正した話です。

試したけどうまくいかなかったこと

whitespace changes なので、JSON に空白が多かったり少なかったりするのが問題かと思ったのですが、差分には具体的にどこがいけないか表示されていないので試行錯誤しました。

  • jsonencode で囲ってみたり、heredoc で書いてみたり
  • AWS Console で JSON にスペース入れたり消したり
    • terraform consolejsonencode した結果などを参考に元のJSONを変更
    • 結局 plan しても whitespace changes としか表示されなかったので断念
普通に定義
resource "aws_scheduler_schedule" "hoge_schedule" {
    (省略)
    input = {
      scheduled_time = "<aws.scheduler.scheduled-time>"
    }
  }
}
jsonencode使用
resource "aws_scheduler_schedule" "hoge_schedule" {
    (省略)
    input = jsonencode({
      scheduled_time = "<aws.scheduler.scheduled-time>"
    })
  }
}
heredoc
resource "aws_scheduler_schedule" "hoge_schedule" {
    (省略)
    input    = <<-JSON
      {
        "scheduled_time": "<aws.scheduler.scheduled-time>"
      }
    JSON
  }
}

最終的にどうやって解決したか

AWS CLI で取得した文字列と同じものを設定しました。
(terraform plan の差分は、terraform 内部で AWS の API を使って取得したものと比較したものなので、それをみると良い、というアドバイスをいただきました。)

$ aws scheduler get-schedule --name hoge_schedule
(省略)
"Input": "{\"scheduled_time\":\"<aws.scheduler.scheduled-time>\"}",

"{\"scheduled_time\":\"<aws.scheduler.scheduled-time>\"}" が出てきたので、それを指定する。

resource "aws_scheduler_schedule" "hoge_schedule" {
    (省略)
    input    = "{\"scheduled_time\":\"<aws.scheduler.scheduled-time>\"}"
  }
}

この状態で再び plan したら差分がなくなりました。

おわりに

Terraform 難しいですね、

まだ Terraform に入門したばかりなので、毎日いろいろなエラーに翻弄されています。
少しずつ対処方法を覚えて、いつか Terraform マスターになりたいです。

  1. 実際には tfmigrate を使って import するために tfmigrate plan したとき

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?