terraform - 如何在“terraform”中创建带有时间戳的文件?
问题描述
我使用下面的配置来生成一个文件名,timestamp
该文件名将在许多不同的地方使用。
variable "s3-key" {
default = "deploy-${timestamp()}.zip"
}
但有Error: Function calls not allowed
错误。如何使用timestamp
变量?
解决方案
变量默认值尤其是常量值,但局部值允许从变量派生的任意表达式:
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 更适合用于选择由其他工具构建的现有工件的过程,而不是用于创建这些工件本身。
推荐阅读
- jquery - Bootstrap:展开时折叠其他人
- sql - SQLZoo 诺贝尔测验 #3 — 这些语句之间有什么区别?
- javascript - 如何使用 JSDoc 记录返回具有公共方法的对象的工厂函数?
- python - 对 Pandas 系列中的时间序列数据进行反累积
- wordpress - 简码导致白屏死机并破坏了我的 wordpress 网站
- java - StringIndexer NumberFormatException 值在列中不可见
- c# - AspNet Core WebApi 在启动时失败并出现错误 System.Collections.Generic.KeyNotFoundException
- react-native - 无法下载任何源列表!(node.js v10.7.0 | yarn 1.7.0 | react-native: 0.56.0 | Windows 10)
- azure - App Insights Workbooks - 是否可以更改堆叠列的顺序?
- google-chrome - 使用表格页眉和页脚时,为什么在 Chrome 中打印具有列数的内容会被替换?