Terraform 地形信息输出
我有一个terraform部署,它从CloudFormation堆栈部署SNS主题。 我导出SNS主题的ARN,但我正在努力消耗TF中的输出Terraform 地形信息输出,terraform,amazon-cloudformation,Terraform,Amazon Cloudformation,我有一个terraform部署,它从CloudFormation堆栈部署SNS主题。 我导出SNS主题的ARN,但我正在努力消耗TF中的输出 "Outputs" : { "ARN" : { "Description" : "Email SNS Topic ARN", "Value" : { "Ref" : "EmailSNS
"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,我预计会失败,但我不确定您的示例是否不完整?