terraform 使用用户数据从实例创建 aws ami

terraform create aws ami from instance with userdata

我正在使用 terraform。我需要用用户数据创建 ec2 实例(安装几个包任何其他东西)。 从这个 ec2 我需要创建具有相同用户数据的 ami。 terraform 在创建 ami 之前是否“等待”,以便 ami 有用户数据?

我已经在安装用户数据的地方进行了测试docker,一切正常,但是,如果用户数据脚本太重或连接太慢会怎样?

这是我的代码

resource "aws_instance" "golden_docker" {
  ami = "ami-ID"
  disable_api_termination = false
  ebs_optimized = true
  instance_type = "t3.medium"
  root_block_device {
    volume_size = 8
  }
  user_data = <<EOF
${file("${path.module}/init_golden.sh")}
EOF
}



resource "aws_ami_from_instance" "golden_ami" {
  name               = "ami-docker"
  source_instance_id = aws_instance.golden_docker.id

}

编辑: 使用这样的 user_data:

cd /
sudo touch daniele
sudo chown ubuntu:ubuntu daniele
sudo echo $(date) > daniele
sudo echo "start" >> daniele
sleep 30
sudo touch "daniele-1"
sudo echo $(date) >> daniele
sleep 30
sudo touch "daniele-2"
sudo echo $(date) >> daniele
sleep 30
sudo touch "daniele-3"
sudo echo $(date) >> daniele
sleep 60
sudo touch "daniele-4"
sudo echo $(date) >> daniele

sudo touch "daniele-finito"

当 ami 开始构建时脚本停止执行。因此,当 ec2 状态检查“通过”时。 如果我的user_data太重,ami不会包含所有命令,user_data的执行就会停止。

谢谢

Terraform 中资源之间存在两种类型的依赖关系:

  1. 显式 - 使用depends_on [1]
  2. 隐式 - 使用创建资源后可用的属性 [2]

在这种情况下,第二个资源 aws_ami_from_instance 对第一个资源 隐式 依赖,即 aws_instance。你可以在这里看到:

source_instance_id = aws_instance.golden_docker.id

就 Terraform 而言,它不会开始创建任何新资源,直到按顺序完成第一个资源,然后是第二个等等。但是,您可以为 [=12= 设置一个 timeouts 块] [3] 以便告诉 Terraform 在该时间段后停止等待。默认为 40 分钟。有关 timeouts 块的更多信息,请参见此处 [4]。

编辑:如果连接在应用步骤中断,Terraform 将在状态文件 [5] 中将资源标记为已污染。这意味着当您 运行 terraform apply 它将重新创建资源。


[1] https://www.terraform.io/language/meta-arguments/depends_on

[2] https://www.terraform.io/language/resources/behavior#resource-dependencies

[3] https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ami_from_instance#timeouts

[4]https://www.terraform.io/language/resources/syntax#operation-timeouts

[5]https://www.terraform.io/cli/state/taint#the-tainted-status

aws_ami_from_instance等待相关EC2的完全启动,但不等待user_data的完全执行。 因此,我部署了 EC2 (aws_instance) 的创建,然后部署了 AMI (aws_ami_from_instance) 的创建。 现在我确定 AMI 已执行所有 user_data.