首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在“`terraform`”中创建带有时间戳的文件?

如何在“`terraform`”中创建带有时间戳的文件?
EN

Stack Overflow用户
提问于 2019-07-22 11:15:35
回答 1查看 2.4K关注 0票数 1

我使用下面的配置生成带有timestamp的文件名,它将在许多不同的地方使用。

代码语言:javascript
运行
复制
variable "s3-key" {
  default = "deploy-${timestamp()}.zip"
}

但得到了Error: Function calls not allowed错误。如何将timestamp用于变量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-22 17:27:27

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

代码语言:javascript
运行
复制
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配置,以实现“部署”步骤:

代码语言:javascript
运行
复制
variable "artifact_version" {}

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

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

HashiCorp指南基于AWS Lambda和API网关的无服务器应用程序中有关于这个模型的更多细节。您并没有说这里的.zip文件是指定给Lambda的,但是有一个类似的原则适用于任何版本的工件。这类似于其他部署模型的工作流,例如为每个版本构建单独的Docker映像或AMI;在每种情况下,Terraform更好地用于选择由其他工具构建的现有工件的过程,而不是创建这些工件本身。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57144892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档