依存関係 - Terraform: 他のモジュールの前に null_resource (local-exec) を呼び出します

okwaves2024-01-25  6

Terraform で作成している AWS EC2 インスタンスごとにカスタムの Cloud-init スクリプトを生成する Python スクリプトがあります。しかし、現時点では、cloud-init のファイルが存在しないため、terraform apply を 1 回も呼び出すことができず、エラーが発生します。したがって、今のところは、 terraform apply -target=null_resource.pynit_lite を実行してファイルを生成し、次に terraform apply でインフラストラクチャを作成します。

私が望むのは、null_resource を最初に実行し、次に残りを実行して、ec2 リソースの作成時にcloud-init ファイルが存在するようにして、terraform apply を 1 回呼び出すことができるようにすることです。

何らかの「depends_on」を実装する必要があると思います。そのため、EC2 モジュールは null_resource が完了するまで待機しますが、これは特別なことではありませんTerraform 内にあります。

私のコードは次のようになります:

provider "aws" {
  region = var.region
  profile = var.profile
}

resource "null_resource" "pynit_lite" {
  provisioner "local-exec" {
    command = "python3 pynit_lite.py"
  }
}

data "aws_vpc" "devvpc" {
  id = var.vpc_id
}

data "aws_subnet_ids" "devsubs" {
  vpc_id = var.vpc_id
}

module "EC2" {
  source = "../../../Modules/EC2"

  name = var.instanceNames
  DSKsize = var.DSKsize
  root_volume_size = var.root_volume_size
  ami = var.ami
  instance_count = length(var.instanceNames)
  instance_type = var.instance_type
  key_name = var.key_name
  ec2_security_group_ids = var.ec2_security_group_ids
  script = var.scripts

  subnet = var.subnet
  vpc = var.vpc_id
}

output "EIP-public" {
  value = module.EC2.EIPAddress
}
output "EIP-internal" {
  value = module.EC2.InternalIps
}

この質問を確認しましたが、次の解決策は提供されていません: Terraform モジュールをリソースに依存させることができません

これはブロックではありませんが、確かに迷惑なため、助けていただければ幸いです。

ありがとうございます。



------------------------

つい最近 (terraform 13) から、モジュールはリソースがすでに使用できる depend_on 機能もサポートしています。このような構造をどのように実現できるかを説明した非常に素晴らしい記事が Medium にあります。あなたの場合、これは次のようになります:

resource "null_resource" "pynit_lite" {
  provisioner "local-exec" {
    command = "python3 pynit_lite.py"
  }
}

module "EC2" {
  # ...
   depends_on = [null_resource.pynit_lite]
}

別の、あまり実現可能性の低いアプローチは、be を利用することです。テラフォームの周りの薄いラッパーであるテラグラントを使用したフォアフック。この before フックでは、コマンドを実行することもできます。詳細については、こちらをご覧ください。例:

terraform {
  before_hook "before_hook" {
    commands     = ["apply", "plan"]
    execute      = ["python3", "pynit_lite.py"]
  }
}

2

ありがとう。ぜひ試してみます。 👍🏻

– クリスチャン・ロドリゲス

2020 年 9 月 8 日 22:55

それはどういう意味ですか正確には?

– クラウドコレクティブ

2021 年 7 月 27 日 18:06

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。