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

Posted

技术标签:

【中文标题】如何将旧 S3 存储桶中的 Terraform 状态移动到新的 S3 存储桶?【英文标题】:How can I move Terraform state in an old S3 bucket to a new S3 bucket? 【发布时间】:2021-12-12 13:16:59 【问题描述】:

我们有一些 terraform 配置,我们使用 s3 作为后端。我们有多个 AWS 账户,每个环境都有一个。

在所有环境和多个区域中,我们使用了不同的 s3 存储桶和 dynamodb_table 名称,到目前为止,这些名称不遵循有效的约定,因此很难从名称中识别存储桶的用途。我们现在要为所有 s3 terraform 状态存储桶遵循基于约定的命名。为此,我需要将现有 terraform 资源的状态迁移到新的 s3 存储桶。

我不确定在不必在旧状态存储桶上运行销毁并应用到新存储桶上的最佳方法是什么。

我能想到的几个选项如下,但我不确定它们是否正确。

    重命名 s3 存储桶:我知道这是不可能的(或者是吗?) 移动 s3 存储桶:重命名的解决方案如 here 所述。不确定这种方法是否会干扰我们的设置。 状态迁移:terraform 源代码由 Git 控制,但 .terraform 不是。因此,我可以使用新存储桶对源代码进行更改,提交它并从该提交中创建一个新的 git 标签。现在,当实际进行迁移时,我会签出在我的环境中使用的旧 git 标签,运行terraform init,签出新的 git 标签并再次运行terraform init,理想情况下会问我是否要进行迁移并执行需要的。这个过程类似于 terraform 建议的 here,但我不确定的是,这种方法是否能以我期望的方式发挥作用。

PS:我假设重命名 DynamoDB 表或仅使用新表而不是旧表会开箱即用,因为我会确保在进行状态迁移时,我没有任何正在进行的实时 terraform 运行。

【问题讨论】:

【参考方案1】:

您是否尝试将 StateFile 从旧存储桶复制到新存储桶,然后在 terraform 后端配置中更改 S3 存储桶

【讨论】:

这是我的第二个选项,我想知道这是否可以,如果有人可以确认它 远程State是本地状态的实现,TF状态文件可以编辑、复制等。我们在生产中多次传输,也恢复状态表备份没有问题。只需验证在您传输旧状态时没有其他人正在运行它。【参考方案2】:

将 Terraform 状态文件移动到新的 S3 存储桶,然后将 S3 后端配置中的 bucket 参数更改为指向存储桶。

如果您只想移动状态文件的位置,则无需执行任何其他操作 - 这就像更改应用程序的位置,然后将快捷方式指向新位置。

【讨论】:

以上是关于如何将旧 S3 存储桶中的 Terraform 状态移动到新的 S3 存储桶?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 terraform 语句中启用 s3 复制存储桶权限

为啥 terraform 会在 s3 存储桶中创建一个空目录?

S3 存储桶中文件的生命周期规则

如何获取使用 Cloudfront 上传的 S3 存储桶中的文件?

如何使用 Java 列出存储桶中的所有 AWS S3 对象

如何重命名 Amazon S3 存储桶中的文件? [复制]