【问题标题】:Can I have terraform keep the old versions of objects?我可以让 terraform 保留旧版本的对象吗?
【发布时间】:2018-04-30 00:38:18
【问题描述】:

刚接触 terraform,所以也许它不应该以这种方式工作。我想使用 aws_s3_bucket_object 将包上传到存储桶 - 这是应用程序部署的一部分。我将为每次部署更改包,我想保留旧版本。

resource "aws_s3_bucket_object" "object" {
    bucket = "mybucket-app-versions"
    key    = "version01.zip"
    source = "version01.zip"
}

但是在为将来的部署运行此程序后,我将要上传 version02,然后是 version03 等。Terraform 用新的预期行为替换旧 zip。

但是有没有办法让 terraform 不破坏旧版本?这是这里受支持的用例,还是我不应该使用 terraform?如果 terraform 没有官方支持做我在这里尝试做的事情,我不想用丑陋的 hack 来强迫它。

我当然可以只通过脚本调用 S3 api,但如果将此应用程序的其他 terraform 定义与此一起定义,那就太好了。

【问题讨论】:

    标签: amazon-web-services terraform terraform-template-file


    【解决方案1】:

    使用 Terraform 进行应用程序部署时,推荐的方法是将构建步骤与部署步骤分开,仅将 Terraform 用于后者。

    构建步骤(根据部署方法使用单独的工具实现)的职责是生成一些工件(存档、docker 容器、虚拟机映像等),然后发布它某处,然后将其位置或标识符传递给 Terraform 进行部署。

    构建和部署之间的这种分离允许更复杂的情况,例如,如果新版本出现问题,则回滚到旧的工件(而不重建它)。

    在简单的场景中,可以使用Input Variables 将工件位置传递给 Terraform。例如,在构建过程将 zip 文件写入 S3 的情况下,您可以定义如下变量:

    variable "archive_name" {
    }
    

    然后可以使用${var.archive_name} 插值语法将其传递给任何需要它的资源。要部署特定工件,请在命令行中使用 -var 传递其名称:

    $ terraform apply -var="archive_name=version01.zip"
    

    一些组织喜欢在某种数据存储中记录每个应用程序的“当前”版本,例如HashiCorp Consul,并使用data source 读取它。这种方法可以更容易地在自动构建管道中进行编排,因为它允许使用这个单独的数据存储在构建和部署步骤之间间接传递存档名称,而无需将任何不寻常的参数传递给 Terraform 本身。

    【讨论】:

      【解决方案2】:

      目前,您告诉 terraform 管理一个 aws_s3_bucket_object 并且 terraform 负责其整个生命周期,这意味着 terraform 也会在看到文件有任何更改时替换该文件。

      您可能正在寻找的是null_resource。您可以使用它来运行local-exec 配置程序,以通过脚本上传您需要的文件。这样,旧文件不会被删除,因为它不是由 terraform 直接管理的。您仍然会通过脚本调用 API,但上传到 s3 的整个过程仍将包含在您的 terraform apply 步骤中。

      这里是null_resource的概要:

      resource "null_resource" "upload_to_s3" {
        depends_on = ["<any resource that should already be created before upload>"]
        ...
      
        triggers = ["<A resource change that must have happened so terraform starts the upload>"]
      
        provisioner "local-exec" {
          command = "<command to upload local package to s3>"
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多