MENU

リソースの作成順序、実はTerraformが自動で決めていた

.gitignore、ゼロから書かなくていい理由を説明する画像

おはようございます、YASUです。

これまでリソースを作る順番について、あまり意識せずにコードを書いてきましたが、実はTerraformには「どのリソースを先に作るか」を管理する仕組みがあります。今日はdepends_onと、それを可視化するterraform graphについて整理します。

目次

結論

Terraformは基本的に、コードに書かれた参照関係(このリソースがあのリソースのIDを使っている、など)から、自動的に作成順序を判断してくれます。ただし、参照関係だけでは順序が伝わらないケースがあり、そこで明示的に順番を指定するのがdepends_onでした。

そもそも、順番はどう決まっているのか

以前扱ったルートテーブルの例を思い出してみます。

resource "aws_route_table" "public" {
  route {
    gateway_id = aws_internet_gateway.main.id
  }
}

ここでaws_internet_gateway.main.idという書き方をしているだけで、Terraformは「このルートテーブルを作る前に、まずインターネットゲートウェイを作らなければならない」と自動的に判断してくれます。コードの中で.idのような形で他のリソースを参照している場合、Terraformはその参照関係を追いかけて、勝手に正しい順番で作成してくれる、という仕組みでした。

参照関係だけでは順番が伝わらないケース

ところが、実務では「直接コードの中で値を参照していないけれど、順番だけは守ってほしい」という場面があるようです。例えば、IAMロールに特定のポリシーがアタッチされた後でないと、正しく動かないEC2インスタンスがある場合などです。

resource "aws_iam_role_policy_attachment" "example" {
  role       = aws_iam_role.example.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
}

resource "aws_instance" "web" {
  # IAMロールのIDなどを直接参照していない
  iam_instance_profile = aws_iam_instance_profile.example.name

  depends_on = [aws_iam_role_policy_attachment.example]
}

depends_onに、先に完了させておきたいリソースを明示的に書いておくことで、コードの中で直接値を参照していなくても、「このリソースが先に完了してから、こちらを作成してください」とTerraformに伝えられます。

terraform graphで、依存関係を目で見る

コードを読むだけでは、リソース同士の依存関係が複雑になるほど把握しづらくなります。そこで使うのがterraform graphです。

terraform graph

これを実行すると、DOT言語という形式で、リソース同士の関係が矢印付きのテキストとして出力されます。そのままだと読みにくいのですが、Graphvizという可視化ツールと組み合わせることで、実際の図として見ることができます。

terraform graph | dot -Tpng > graph.png

これで、どのリソースがどのリソースに依存しているか、矢印で結ばれた図として一目で確認できるようになります。リソースの数が増えてきたプロジェクトほど、この可視化のありがたみが増しそうです。

なぜこの仕組みが重要なのか

以前紹介したterraform destroyを思い出すと、リソースを削除する時は、作成時と逆の順番で処理される必要があります。例えば、サブネットの中にEC2インスタンスがある場合、先にインスタンスを削除してからでないと、サブネット自体を削除できません。この順序の管理を、Terraformが依存関係グラフをもとに自動でやってくれている、というのが裏側の仕組みでした。

もし依存関係がうまく伝わっていないと、本来は先に完了しているべき処理が終わる前に、次の処理が始まってしまい、エラーになったり、意図しない中途半端な状態でリソースが作られてしまったりする可能性があります。

depends_onを使う時の注意点

公式ドキュメントでも、depends_onは「本当に必要な場合にのみ使う」ことが推奨されています。理由は、できる限りコードの中の自然な参照関係(.id.arnなどを使う書き方)で順序を表現した方が、コードを読むだけで依存関係が分かりやすく、保守もしやすいからです。depends_onを多用すると、なぜその順番が必要なのかが、コードの見た目からは読み取りにくくなってしまいます。

まとめ

  • Terraformは基本的に、コード内の参照関係(.idなど)から自動的に作成順序を判断する
  • 参照関係だけでは順番が伝わらない場合、depends_onで明示的に依存関係を指定できる
  • terraform graphで、リソース同士の依存関係を図として可視化できる
  • depends_onは便利だが多用は避け、できる限り自然な参照関係で順序を表現するのが推奨される

これまで意識せず書いていたコードの裏側で、Terraformがこれだけ緻密に順序を管理してくれていたのだと分かり、今後は依存関係も意識してコードを読むようになりそうです。それでは、また明日!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次