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