如何调用文本文件作为用户数据在Terraform没有UTF-8编码?



Terraform version: v1.0.4

我正在为EC2实例试验user_data属性。下面是我正在使用的。txt文件的内容,

#cloud-config
aws_image: true

以下是我测试过的场景

  1. 使用"当地人"。没问题。

  2. 将文件转换为UTF-8编码,然后使用模板,工作良好。

  3. 使用没有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编码。

或者,如果您的目标只是将文件逐字发送到EC2,而不需要Terraform对其进行任何模板处理,则可以在user_data_base64参数中直接使用filebase64:
user_data = filebase64("${path.module}/test-user-data.txt")

相关内容

  • 没有找到相关文章

最新更新