首页 > 解决方案 > 如何在没有 UTF-8 编码的 Terraform 中将文本文件称为用户数据?

问题描述

地形版本: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
}

我正在寻找一种方法,即使我不使用带有 UTF-8 的 .txt 或 .sh 文件,我的部署也可以完成而没有任何错误。让我知道这是否可行。

标签: terraformterraform-provider-awsuser-data

解决方案


因为模板文件是用 Terraform 语言的模板语法编写的,所以模板本身必须始终采用 UTF-8 编码才能成为有效的语法,但原则上您可以编写一个包含表达式的模板,该表达式将生成 base64 数据,然后分配该结果到user_data_base64. 话虽如此,我很难想象一个用例是什么,而你没有分享一个,所以我不能举一个真实的例子。

如果您的预期结果仍然是文本,但使用 UTF-8 以外的其他字符编码,那么另一种方法是让模板和模板结果都为 UTF-8,然后将生成的字符串转换为其他字符编码。

这是一个示例,我还用data "template_file"现代templatefile功能替换了您对已弃用的使用:

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 对其进行任何模板处理,您可以filebase64直接在user_data_base64参数中使用:

  user_data = filebase64("${path.module}/test-user-data.txt")

推荐阅读