Terraform 次要 AWS user_data更改"forces replacement" - 最佳分辨率是多少?



我对我的AWS EC2 user_data引导bash脚本做了一个小的修改(仅作注释)。Terraform已经检测到这一点,现在想用一个新的EC2来替换它。但这是一个实时服务,我不想把它关掉,备份所有的数据,建立一个新的服务器,然后恢复数据——只是为了让terraform高兴!

是否有一种更简单的方法来解决这个问题,通过某种方式将代码/状态文件/法律放在一起,以便我可以使用tertransform对环境进行其他更改,但不必担心吹走这个服务器?

我甚至尝试从AWS控制台编辑用户数据,试图将其与我认为应该更改的内容内联,但这没有奏效。

现在我使用-target进行特定的更改,但从长远来看,这可能是不可持续的。

您可以使用lifecycle元参数指示提供者忽略对该资源的user_data参数的更改:

resource "aws_instance" "this" {
# ...
lifecycle {
ignore_changes = [user_data]
}
}

根据此问题https://github.com/hashicorp/terraform-provider-aws/issues/23315行为现在取决于https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#user_data_replace_on_change默认为false,因此它不会强制替换。

我有一个问题,然而,我希望user_data脚本在Terraform应用程序上执行,所以我创建了一个脚本,将在更新该字段时执行此操作。

请注意,这期望在以下环境中运行:1)AWS_PROFILE设置了执行会话管理器命令的权限,2)安装了会话管理器插件,以及3)目标实例必须安装了SSM Agent(参见此链接)

在地形中:

resource "null_resource" "update-user-data" {
depends_on = [aws_instance.this]
triggers = {
user_data_base64 = base64encode(data.template_file.user_data.rendered)
}
provisioner "local-exec" {
command     = file("${path.module}/run-remote-shell-script.sh")
interpreter = ["bash", "-c"]
environment = {
INSTANCE_NAME = var.name
}
}
}

run-remote-shell-script.sh:

#!/usr/bin/env bash
test -n "$INSTANCE_NAME" || (echo missing INSTANCE_NAME; exit 1)
test -n "$AWS_PROFILE" || (echo missing AWS_PROFILE; exit 1)
INSTANCE_ID=$(aws ec2 describe-instances 
--filters Name=tag:Name,Values=$INSTANCE_NAME 
--query 'Reservations[].Instances[].InstanceId' --output text)
echo $INSTANCE_ID
aws ec2 wait instance-running --instance-ids $INSTANCE_ID;
aws ssm send-command --instance-ids $INSTANCE_ID 
--document-name AWS-RunShellScript --parameters '{"commands": ["sudo bash /var/lib/cloud/instance/user-data.txt"]}'
sleep 1
exit 0

最新更新