terraform使用userdata从实例创建aws-ami



我使用的是地形。我需要用用户数据创建ec2实例(安装几个软件包或其他任何东西(。从这个ec2,我需要创建具有相同用户数据的ami。是否将"地形";等待";在创建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
}

编辑:用户数据如下:

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状态检查是"0"时;通过";。如果我的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而言,在顺序中的第一个资源完成,然后第二个资源完成之前,它不会开始创建任何新的资源。但是,您可以为aws_ami_from_instance[3]设置一个timeouts块,以便告诉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-依赖

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

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

[5]https://www.terraform.io/cli/state/taint#the-受污染状态

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

最新更新