首页 > 解决方案 > 如何在“terraform”中创建带有时间戳的文件?

问题描述

我使用下面的配置来生成一个文件名,timestamp该文件名将在许多不同的地方使用。

variable "s3-key" {
  default = "deploy-${timestamp()}.zip"
}

但有Error: Function calls not allowed错误。如何使用timestamp变量?

标签: terraform

解决方案


变量默认值尤其是常量值,但局部值允许从变量派生的任意表达式:

variable "override_s3_key" {
  default = ""
}

locals {
  s3_key = var.override_s3_key != "" ? var.override_s3_key : "deploy-${timestamp()}.zip"
}

然后,您可以使用local.s3_key配置中的其他位置来访问此派生值。


话虽如此,Terraform 旨在创建长期运行的基础设施对象,因此包括时间戳通常(但不总是!)表示设计问题。在这种特殊情况下,看起来像是使用 Terraform 来创建用于部署的应用程序工件,这是 Terraform可以做到的,但 Terraform 通常不是此类工作的最佳工具。

相反,请考虑将您的构建和部署拆分为两个单独的步骤,其中使用您选择的任何单独工具(甚至可能只是一个 shell 脚本)来实现构建步骤,并在 S3 中生成一个版本化(或时间戳)工件。然后,您可以使用该版本或时间戳参数化您的 Terraform 配置以实现“部署”步骤:

variable "artifact_version" {}

locals {
  artifact_s3_key = "deploy-${var.artifact_version}.zip"
}

这种分离的一个优点是,通过将版本化工件与长期存在的 Terraform 对象分离,您将默认保留历史工件,因此如果您部署并发现问题,您可以选择切换回已知良好的现有工件只需使用较旧的工件版本重新运行部署步骤 (Terraform)。如果您改为直接使用 Terraform 管理工件,Terraform 将在创建新工件之前删除您的旧工件,因为这是 Terraform 的预期使用模型。

在 HashiCorp 指南Serverless Applications with AWS Lambda and API Gateway中有关于这个模型的更多细节。您没有说.zip这里的文件是针对 Lambda 的,但是类似的原则适用于任何版本化的工件。这类似于其他部署模型的工作流程,例如为每个版本构建单独的 Docker 映像或 AMI;在每种情况下,Terraform 更适合用于选择由其他工具构建的现有工件的过程,而不是用于创建这些工件本身。


推荐阅读