Terraform 地形信息输出

Terraform 地形信息输出,terraform,amazon-cloudformation,Terraform,Amazon Cloudformation,我有一个terraform部署,它从CloudFormation堆栈部署SNS主题。 我导出SNS主题的ARN,但我正在努力消耗TF中的输出 "Outputs" : { "ARN" : { "Description" : "Email SNS Topic ARN", "Value" : { "Ref" : "EmailSNS

我有一个terraform部署,它从CloudFormation堆栈部署SNS主题。 我导出SNS主题的ARN,但我正在努力消耗TF中的输出

      "Outputs" : {
    "ARN" : {
      "Description" : "Email SNS Topic ARN",
      "Value" : { "Ref" : "EmailSNSTopic" }
    }
  }
}
输出为ARN。 但是如何构造outputs.tf文件以允许我在进一步的tf文件中获取cf输出呢

cf堆栈名称命名为“TOPIC”,作为导出“ARN”的示例 阅读TF文档,他们有一个例子,但它失败了:

data "aws_cloudformation_export" "arn" {
  name = "myARN"
}

resource "aws_instance" "web" {
  ami           = "ami-abb07bcb"
  instance_type = "t2.micro"
  subnet_id     = data.aws_cloudformation_export.myarn.value
}
这是正确的吗

谢谢
尼克,TF模块看起来不对劲。试试这个

data "aws_cloudformation_export" "my_subnet_id" {
  name = "[NAME_OF_EXPORT]"
}

resource "aws_instance" "web" {
  ami           = "ami-abb07bcb"
  instance_type = "t2.micro"
  subnet_id     = data.aws_cloudformation_export.my_subnet_id.value
}
并确保name属性拼写为aws cloudformation list exports的输出,并且您位于同一区域


CF导出的值在每个帐户的给定区域中必须是唯一的,因此您不需要引用CF模板或堆栈名称。

TF模块看起来不正确。试试这个

data "aws_cloudformation_export" "my_subnet_id" {
  name = "[NAME_OF_EXPORT]"
}

resource "aws_instance" "web" {
  ami           = "ami-abb07bcb"
  instance_type = "t2.micro"
  subnet_id     = data.aws_cloudformation_export.my_subnet_id.value
}
并确保name属性拼写为aws cloudformation list exports的输出,并且您位于同一区域


CF导出的值在每个帐户的给定区域中必须是唯一的,因此您不需要引用CF模板或堆栈名称。

您的
Ref
输出值属性错误。尝试使用
SNSTopic
而不是
EmailSNSTopic

完整示例:

CloudFormation
模板/cf_aws\u sns\u email\u stack.json.tpl

{
 "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "SNSTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "TopicName": "${sns_topic_name}",
        "DisplayName": "${sns_display_name}",
        "Subscription": [
          ${alarms_recipients_emails}
        ]
      }
    }
  },
  "Outputs" : {
    "ARN" : {
      "Description" : "SNS Topic ARN",
      "Value" : { "Ref" : "SNSTopic" }
      }
    }
}
那么,如果你在地形中有这个:

data "template_file" "aws_cf_sns_stack" {
   template = file("${path.module}/templates/cf_aws_sns_email_stack.json.tpl")
   vars = {
     sns_topic_name        = "your_topic_name"
     sns_display_name      = "your_topic_display_name"
     alarms_recipients_emails = join(",", formatlist("{\"Endpoint\": \"%s\",\"Protocol\": \"%s\"}", var.alarms_recipients_emails, "email"))
   }
 }
 resource "aws_cloudformation_stack" "tf_sns_topic" {
   name = "your_cf_name"
   template_body = data.template_file.aws_cf_sns_stack.rendered
 }
在地形中,您可以将ARN输出与aws\u cloudformation\u stack.tf\u sns\u topic.outputs.ARN一起使用。假设您需要一个用于cloudwatch报警的资源,该报警使用上面创建的主题:

resource "aws_cloudwatch_metric_alarm" "foobar" {
  // ...
  alarm_actions       = [aws_cloudformation_stack.tf_sns_topic.outputs.ARN]
}

输出值的
Ref
属性错误。尝试使用
SNSTopic
而不是
EmailSNSTopic

完整示例:

CloudFormation
模板/cf_aws\u sns\u email\u stack.json.tpl

{
 "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "SNSTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "TopicName": "${sns_topic_name}",
        "DisplayName": "${sns_display_name}",
        "Subscription": [
          ${alarms_recipients_emails}
        ]
      }
    }
  },
  "Outputs" : {
    "ARN" : {
      "Description" : "SNS Topic ARN",
      "Value" : { "Ref" : "SNSTopic" }
      }
    }
}
那么,如果你在地形中有这个:

data "template_file" "aws_cf_sns_stack" {
   template = file("${path.module}/templates/cf_aws_sns_email_stack.json.tpl")
   vars = {
     sns_topic_name        = "your_topic_name"
     sns_display_name      = "your_topic_display_name"
     alarms_recipients_emails = join(",", formatlist("{\"Endpoint\": \"%s\",\"Protocol\": \"%s\"}", var.alarms_recipients_emails, "email"))
   }
 }
 resource "aws_cloudformation_stack" "tf_sns_topic" {
   name = "your_cf_name"
   template_body = data.template_file.aws_cf_sns_stack.rendered
 }
在地形中,您可以将ARN输出与aws\u cloudformation\u stack.tf\u sns\u topic.outputs.ARN一起使用。假设您需要一个用于cloudwatch报警的资源,该报警使用上面创建的主题:

resource "aws_cloudwatch_metric_alarm" "foobar" {
  // ...
  alarm_actions       = [aws_cloudformation_stack.tf_sns_topic.outputs.ARN]
}

您必须使用Cloudformation输出吗?您是否考虑过直接使用或使用在Terraform中创建SNS主题?你的例子有什么错误?看起来您正试图使用SNS主题ARN作为子网ID,我预计会失败,但我不确定您的示例是否不完整?您必须使用Cloudformation输出吗?您是否考虑过直接使用或使用在Terraform中创建SNS主题?你的例子有什么错误?看起来您正试图使用SNS主题ARN作为子网ID,我预计会失败,但我不确定您的示例是否不完整?