Terraform version: v1.0.4
我正在为EC2实例试验user_data属性。下面是我正在使用的。txt文件的内容,
#cloud-config
aws_image: true
以下是我测试过的场景
使用"当地人"。没问题。
将文件转换为UTF-8编码,然后使用模板,工作良好。
使用没有UTF-8编码的.txt文件,这是有问题的场景,定义的EC2实例的用户数据部分显示为空。我已经测试了几个排列,
3.1。
data "template_file" "user_data_test"{
template = filebase64("/Users/home/Desktop/centos_ec2_aws/test-user-data.txt")
}
resource "aws_instance" "my_aws_Linux_vm" {
.
.
user_data_base64 = data.template_file.user_data_test.template
}
3.2。
data "template_file" "user_data_test{
template = filebase64("/Users/home/Desktop/centos_ec2_aws/test-user-data.txt")
}
resource "aws_instance" "my_aws_Linux_vm" {
.
.
user_data = data.template_file.user_data_test.template
}
我正在寻找一种方法,即使我不使用。txt或。sh文件与UTF-8,我的部署完成没有任何错误。让我知道这是否可行。
因为模板文件是用Terraform语言的模板语法编写的,所以模板本身必须始终是UTF-8编码,以便成为有效的语法,但是原则上您可以编写包含将产生base64数据的表达式的模板,然后将结果赋值给user_data_base64
。话虽如此,我很难想象它的用例是什么,你没有分享一个,所以我不能给出一个真实的例子。
如果你想要的结果仍然是text,但是使用一些其他的字符编码而不是UTF-8,那么另一种方法是让模板和模板结果都是UTF-8,但是之后将结果字符串转换为其他字符编码。
这里有一个例子,我也用现代的templatefile
函数取代了你使用的已弃用的data "template_file"
:
locals {
user_data = templatefile("${path.module}/test-user-data.txt", {})
}
resource "aws_instance" "my_aws_Linux_vm" {
# ...
user_data_base64 = textencodebase64(local.user_data, "UTF-16LE")
}
以上使用textencodebase64
从UTF-8编码转换为UTF-16LE编码。
user_data_base64
参数中直接使用filebase64
:
user_data = filebase64("${path.module}/test-user-data.txt")