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

Is it possible to execute a CloudFormation file in Terraform?

一个团队已经将 cloudformation 模板编写为 .yml 文件,用于提供一堆资源。

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

我是 Terraform 的新手,刚刚开始。

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

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

我想在我的 terraform 配置中包含这个命令的等价物。

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

谢谢!

我可以确认 template_body 对 cloudformation 模板的文件引用有效。我认为 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")}"
}

The aws_cloudformation_stack resource serves as a bridge from Terraform into CloudFormation, which can be used either as an aid for migration from CloudFormation to Terraform (as you're apparently doing here) or to make use of some of CloudFormation's features that Terraform doesn't currently handle, such as rolling deployments of new instances into an 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"],
  ]
}

如果您有一个 不是 由 Terraform 管理的预先存在的 CloudFormation 堆栈,您仍然可以使用它的输出 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,无论是作为迁移时的临时措施还是在需要混合解决方案的情况下永久使用。