繁体   English   中英

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 而言,它不会开始创建任何新资源,直到第一个资源按顺序完成,然后是第二个等。但是,您可以为aws_ami_from_instance [3] 设置一个timeouts块,以告诉 Terraform 在之后停止等待那个时期。 默认为 40 分钟。 更多关于timeouts块的信息可以在这里找到[4]。

编辑:如果在应用步骤期间连接中断,Terraform 将在 state 文件 [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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM