Terraformはリソースの依存関係を自動的に解決してくれますが、明示的な指定が必要なケースがあります。
シナリオ
次のシナリオを考えます。
- リソース
- S3バケット (バケット)
- セキュリティグループ
- EC2インスタンス (インスタンス)
- 依存関係
- インスタンスにセキュリティグループをアタッチする
- インスタンスはバケットに依存する(起動時にバケットからアプリケーションをダウンロードする)
リソースへの依存を明示する
インスタンスのセキュリティグループへの依存はTerraformが解決してくれますが、バケットへの依存はTerraformは検知できません(知りようがありません)。
このようなケースではaws_instance.ec2
のdepends_on
でバケットへの依存を指定します。
resource "aws_s3_bucket" "this" { ... } resource "aws_security_group" "this" { ... } resource "aws_instance" "ec2" { ... depends_on = [aws_s3_bucket.this] }
リソースをmodule化する
では、インスタンスに必要なリソースをmodule化したい場合は、どうすればいいのでしょうか。
こんなケースです。
module "bucket" { source = "../modules/storage/s3/private_bucket" .... } module "sg" { source = "../modules/network/security_group" .... } resource "aws_instance" "ec2" { ... }
検証
depends_on = [module.bucket]
でmoduleへの依存を明示できそうな気がします。検証してみました。
depends_onなし
terraform graph | dot -Tpng > graph.png
で依存関係を可視化すると、aws_instance_ec2はmodule.bucketに依存していないことがわかります。
サイズが大きいので、関係する箇所だけ貼ります。
depends_onあり
既出のコードにdepends_onを追加します。
resource "aws_instance" "ec2" { ... depends_on = [module.bucket] }
applyして依存関係を出力すると、aws_instance_ec2にmodule.bucketへの依存が設定されています。
後で確認したら、リファレンスにちゃんと書いてありました。
Version note: Module support for depends_on was added in Terraform 0.13, and previous versions can only use it with resources.
depends_onのmoduleサポートはver.0.13のアップデートで入っていました。