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

时间:2017-04-06 22:03:51

标签: amazon-web-services amazon-cloudformation 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配置中包含相当于此命令的内容。

如果有可能,你可以给我一个例子,我真的很感激。

谢谢!

2 个答案:

答案 0 :(得分:18)

The aws_cloudformation_stack resource充当从Terraform到CloudFormation的桥梁,可用作从CloudFormation迁移到Terraform的辅助工具(正如您在此处所做的那样)或利用CloudFormation的一些功能Terraform目前无法处理,例如将新实例部署到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堆栈的结果进行双向集成:

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,无论是在迁移时作为临时措施还是在需要混合解决方案的情况下永久性地进行。

答案 1 :(得分: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")}"
}