批量替换Terraform中的文件内容

Dmy*_*rov 3 automation amazon-s3 amazon-web-services terraform devops

我在某个根目录下有多个文件,让\xe2\x80\x99s将其称为module/data/。\n我需要将此目录上传到相应的S3存储桶。所有这一切都按预期工作:

\n\n
resource "aws_s3_bucket_object" "k8s-state" {\n  for_each = fileset("${path.module}/data", "**/*")\n  bucket = aws_s3_bucket.kops.bucket\n  key    = each.value\n  source = "${path.module}/data/${each.value}"\n  etag   = filemd5("${path.module}/data/${each.value}")\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

剩下的唯一一件事是我需要递归地循环所有文件,并!S3!用 terraform\xe2\x80\x99s 模块的变量值替换标记(例如 )。\n与此类似,但跨目录/子目录中的所有文件:

\n\n
replace(file("${path.module}/launchconfigs/file"), \xe2\x80\x9c#S3\xe2\x80\x9d, aws_s3_bucket.kops.bucket)\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以一句话的问题是:如何循环文件并用 terraform 中的变量替换其中的一部分?

\n

Hel*_*eda 6

一个选项可以是使用模板,代码如下所示:

provider "aws" {
  region = "us-west-1"
}

resource "aws_s3_bucket" "sample_bucket2222" {
  bucket = "my-tf-test-bucket2222"
  acl    = "private"
}

resource "aws_s3_bucket_object" "k8s-state" {
  for_each = fileset("${path.module}/data", "**/*")
  bucket   = aws_s3_bucket.sample_bucket2222.bucket
  key      = each.value
  content  = data.template_file.data[each.value].rendered
  etag     = filemd5("${path.module}/data/${each.value}")
}

data "template_file" "data" {
  for_each = fileset("${path.module}/data", "**/*")
  template = "${file("${path.module}/data/${each.value}")}"
  vars = {
    bucket_id  = aws_s3_bucket.sample_bucket2222.id
    bucket_arn = aws_s3_bucket.sample_bucket2222.arn
  }
}
Run Code Online (Sandbox Code Playgroud)

source可以看到我正在使用contenttemplate_file,这是该资源与你的资源的唯一区别


在您的文件上,变量可以像这样使用:

Hello ${bucket_id}
Run Code Online (Sandbox Code Playgroud)

我的所有测试代码都在这里:
https ://github.com/heldersepu/hs-scripts/tree/master/TerraForm/regional