是否可以在 Terraform 中执行 CloudFormation 文件?

Posted

技术标签:

【中文标题】是否可以在 Terraform 中执行 CloudFormation 文件?【英文标题】:Is it possible to execute a CloudFormation file in Terraform? 【发布时间】:2017-09-02 03:39:48 【问题描述】:

一个团队已经编写了一个 cloudformation 模板作为 .yml 文件,该文件提供了一堆资源。

是否可以通过在 Terraform 中执行该文件来利用它?还是必须重写?

我是 terraform 新手,刚刚开始。

如果我使用 AWS CLI,我会执行这样的命令,

aws cloudformation create-stack --stack-name my-new-stack --template-body file://mystack.yml --parameters ParameterKey=AmiId

我想在我的 terraform 配置中包含与此命令等效的命令。

如果可能并且您可以举个例子,我将不胜感激。

谢谢!

【问题讨论】:

恐怕你得重写,我觉得你问的不太可能。 terraform.io/docs/providers/aws/r/… 如果您在读取 ​​yml 文件时遇到问题,请尝试升级您的 terraform 版本。我今天看到它在 .7.7 中不起作用,但可以确认它在 .9.3 中起作用 【参考方案1】:

The aws_cloudformation_stack resource 充当从 Terraform 到 CloudFormation 的桥梁,它既可以用作从 CloudFormation 迁移到 Terraform 的辅助工具(正如您在此处所做的那样),也可以利用 Terraform 没有的 CloudFormation 的一些功能'当前不能处理,例如将新实例滚动部署到ASG。

resource "aws_cloudformation_stack" "example" 
  name = "example"
  parameters = 
    VpcId = var.vpc_id
  
  template_body = file("$path.module/example.yml")

parameters 参数允许将数据从 Terraform 传递到 Cloudformation 堆栈。也可以使用 outputs 属性来利用 Terraform 中其他地方的 CloudFormation 堆栈的 results,实现双向集成:

resource "aws_route_53_record" "example" 
  name = "service.example.com"
  type = "CNAME"
  ttl  = 300

  records = [
    aws_cloudformation_stack.example.outputs["ElbHostname"],
  ]


如果您有一个预先存在的 CloudFormation 堆栈由 Terraform 管理,您仍然可以通过 the aws_cloudformation_stack data source 使用它的输出:

data "aws_cloudformation_stack" "example" 
  name = "example"


resource "aws_route_53_record" "example" 
  name = "service.example.com"
  type = "CNAME"
  ttl  = 300

  records = [
    data.aws_cloudformation_stack.example.outputs["ElbHostname"],
  ]


这些功能让您可以在单个系统中以不同的组合有效地混合 CloudFormation 和 Terraform,无论是作为迁移时的临时措施还是在需要混合解决方案的情况下永久使用。

【讨论】:

我们是否也在这里定义堆栈策略?【参考方案2】:

我可以确认带有对 cloudformation 模板的文件引用的 template_body 有效。我认为 template_url 也会很好用。 示例

resource "aws_cloudformation_stack" "my-new-stack" 
  name = "my-new-stack"
  parameters 
    Name="my-new-stack"
    Port="22"
    VpcId = "$var.vpc_id"
  
  template_body = "$file("$path.module/mystack.yml")"

【讨论】:

以上是关于是否可以在 Terraform 中执行 CloudFormation 文件?的主要内容,如果未能解决你的问题,请参考以下文章

通过 terraform 在 cloud init 中传递 python 脚本

在使用 terraform cloud [aws-provider] 启动 ec2 实例时,既不能执行 user_data 脚本,也不能使用连接块执行 remote-exec

terraform如何创建数据盘

Terraform:Cloud Run 服务上的 Cloud Endpoints?

带有 Terraform 的 Google Cloud 凭据

如何通过 terraform 使用服务帐户创建 google cloud pubsub pull 订阅?