强制 Terraform 每次都应用新的状态文件 - S3 文件上传场景

Posted

技术标签:

【中文标题】强制 Terraform 每次都应用新的状态文件 - S3 文件上传场景【英文标题】:Enforce Terraform to apply new state file every time - S3 File Upload scenario 【发布时间】:2021-12-06 20:14:21 【问题描述】:

如果问题违反了 Terraform 通常执行的协议,请原谅我。

我想出了一个实用程序,可以使用 Terraform 在 S3 存储桶中上传文件。它在上传文件时工作正常。

当我尝试再次上传一个新文件时,问题就出现了,而前一个文件被删除了。 Terraform 计划会比较现有的内容和正在应用的内容,并删除之前上传的文件。

有没有办法在 Terraform 中使用状态管理来解决这个问题?

这是我创建的用于将文件/对象上传到存储桶的简单资源

resource "aws_s3_bucket_object" "s3_automation_upload1" 
          bucket = ""
          key = ""
          source = ""
          kms_key_id = ""
  

第 1 步

  resource "aws_s3_bucket_object" "s3_automation_upload1" 
          bucket = "bucket1"
          key = "folder1/"
          source = "File1.txt"
          kms_key_id = ""
  

file1.txt 上传到 bucket1 下的“folder1”

第 2 步 - 再次应用 Terraform

resource "aws_s3_bucket_object" "s3_automation_upload1" 
          bucket = "bucket1"
          key = "folder1/"
          source = "File2.txt"
          kms_key_id = ""
  

现在 File2.txt 已上传,但由于有新的状态变化,Terraform 删除了 File1.txt。

应该怎么做才能保留File1.txt,只添加File2.txt

【问题讨论】:

抱歉,不清楚你想达到什么目的。你覆盖TF上传的文件,然后TF用旧版本替换文件? 是的 Terraform 好像要替换文件。让我详细更新问题本身的场景 使用 Terraform 上传文件的实用程序不是一个好主意。这不是 Terraform 的设计目的,因此您会看到问题。 AWS CLI 工具和所有 AWS 开发工具包已经存在。为什么需要使用 Terraform 执行此操作? @MarkB 我们无法直接控制使用 AWS GUI 添加。因此采取了 Terraform 路线。作为具有在组织中的 S3 中上传/下载/删除对象的角色的用户,我们没有独占权限 我在评论中列出的更好的东西都没有利用 AWS GUI。 Terraform 是一个很棒的工具,但它用于配置云资源,其中一小部分能够在配置资源时将一些文件复制到 S3。它不是像您一样构建 S3 文件复制实用程序的正确工具。 AWS CLI 或 AWS 开发工具包之一更合适。 【参考方案1】:

同意 cmets 的观点,即 Terraform 可能不是这项工作的理想工具(像 aws s3 sync ... 这样的工具会是一个更好的起点),但要从表面上回答你的问题......

我认为您的问题是 key 规范。这应该是存储对象的键。您当前的解决方案是管理文件夹,而不是其中包含的文件,因此每次更改源时内容都会被替换。试试这个:

resource "aws_s3_bucket_object" "s3_automation_upload1" 
          bucket = "bucket1"
          key = "folder1/File1.txt"
          source = "File1.txt"
          kms_key_id = ""


resource "aws_s3_bucket_object" "s3_automation_upload2" 
          bucket = "bucket1"
          key = "folder1/File2.txt"
          source = "File2.txt"
          kms_key_id = ""

请记住,Terraform 旨在管理单个、离散的资源,因此使用这种方法,上传到 S3 的每个文件都需要自己的 Terraform 资源。

【讨论】:

以上是关于强制 Terraform 每次都应用新的状态文件 - S3 文件上传场景的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 从空状态刷新?

为啥需要远程保存 terraform 状态文件?

如何将旧 S3 存储桶中的 Terraform 状态移动到新的 S3 存储桶?

Terraform不断强制重新创建资源(先删除再创建)]]

Terraform 和 AWS:修改现有策略

Terraform 后端到 azure blob 存储错误