web-dev-qa-db-ja.com

Terraformでモジュールの依存関係を定義する

最初のモジュール「frontend_1」が残りの前に実行されることをどのように確認できますか?

module "frontend_1" {
  source = "/modules/frontend-app"
}
module "frontend_2" {
  source = "/modules/frontend-app"
}
module "frontend_3" {
  source = "/modules/frontend-app"
}

また、この問題に関するGitissuesがいくつか記録されていますが、それらのいずれにも適切な回避策は提示されていません。はじめに-これをチェックして、私の質問の本質を理解できるようにします- https://github.com/hashicorp/terraform/issues/10462

そして、モジュールが実行される前にモジュールリソースの外部を作成する方法-そのような外部リソースから計算される値に依存する場合、「カウント」を計算できるようにするには?たとえば、そのVPC内に複数のAWSセキュリティグループを作成するモジュールの「カウント」で新しく作成されたVPCのIDを使用する必要がある場合

8
Xtigyro

質問で述べたように、depends on変数を使用して回避策を作成できました。

ここを参照してください: https://www.terraform.io/intro/getting-started/dependencies.html

2つのモジュールがあり、1つはvpcとサブネットを定義し、2つ目はインフラストラクチャで使用されるさまざまな範囲のセキュリティグループを定義すると仮定します。

VPCモジュールでvpcが正常に作成された後にのみすべてのセキュリティグループが作成されるように依存関係があるため、次の戦略で満たすことができます。

variable "vpc_arn" {
   description = "The ARN of the VPC which is created in the VPC module"
}

resource "null_resource" "vpc_found" {
  triggers = {
    vpc_name = "${var.vpc_arn}"
  }
}

resource "aws_security_group" "allow_all" {

  depends_on = ["null_resource.vpc_found"]

  name        = "allow_all"
  description = "Allow all inbound traffic"
  vpc_id      = "${var.vpc_arn}"
  ......
}

Nullリソース: https://www.terraform.io/docs/provisioners/null_resource.html

9
kisHoR

モジュールは、すべてが単一のユニットとして作成または破棄されるリソースのバンドルではないため、あるモジュールが別のモジュールの前または後に実行される意味はありません。 terraform graph の出力を見ると、モジュール内の個々のリソースが、実行グラフが同時に通過するプラングラフのノードとして表示されていることがわかります。これは、計画グラフにサイクルが含まれていない限り、2つのモジュール間で双方向の依存関係を持つことが完全に可能であることを意味します(モジュールAはモジュールB出力から入力を受け取り、モジュールB入力に使用される出力も提供します)。

Terraformで観察すべき1つのことは、depends_on(モジュールでは利用できない)を使用して明示的に宣言された依存関係と組み合わせて、補間により他のリソース属性、変数、入力出力などに依存することによって、プラングラフが構築されることです)。上記の例のこの結果は、あるモジュールの出力から別のモジュールの入力に値をリンクする補間参照がない場合、リソース間の依存関係を示すパスがプラングラフに構築されないことです。