amazon-web-services - 基于传入的 AWS 命名空间的 Terraform 条件输出?
问题描述
$ terraform -v
Terraform v0.14.6
我有一个创建不同 CloudWatch 警报的计划,像这样
module "rds_high_cpu_alarm" {
source = "../modules/cw_alarm"
namespace = "AWS/RDS"
statistic = "Average"
// Other parameters
...
}
module "ecs_task_count_alarm" {
source = "../modules/cw_alarm"
namespace = "AWS/ECS"
statistic = "SampleCount"
// Other parameters
...
}
module "other_aws_alarm" {
source = "../modules/cw_alarm"
namespace = "AWS/OtherNamespace"
statistic = "OtherStatistic"
}
如您所见,警报共享同一个模块../modules/cw_alarm
,根据aws_cloudwatch_metric_alarm ,如下所示
# I want to use this for RDS DB instance high CPU alarm
resource "aws_cloudwatch_metric_alarm" "rds_aws_alarm" {
count = var.namespace == "AWS/RDS" ? 1 : 0
alarm_name = var.alarm_name
namespace = var.namespace
statistic = "Average"
...
dimensions = {
DBInstanceIdentifier = var.db_instance_id
}
}
# I want to use this for ECS task count < 1 alarm
resource "aws_cloudwatch_metric_alarm" "ecs_aws_alarm" {
count = var.namespace == "AWS/ECS" ? 1 : 0
alarm_name = var.alarm_name
namespace = var.namespace
statistic = "SampleCount"
...
dimensions = {
ServiceName = var.servicename
}
}
# Other alarm resources
resource "aws_cloudwatch_metric_alarm" "other_aws_alarm" {
...
}
如何设置通用输出以使用上述资源之一来输出警报的 ARN?
# In pseudo-code
output "aws_alarm_arn" {
switch var.namespace {
case "AWS/RDS":
value = aws_cloudwatch_metric_alarm.rds_aws_alarm.arm
break
case "AWS/ECS":
value = aws_cloudwatch_metric_alarm.ecs_aws_alarm.arm
break
default:
value = aws_cloudwatch_metric_alarm.other_aws_alarm.arm
}
}
也就是说,如何根据创建的告警资源输出告警ARN?请记住,我可以添加比我展示的 3 个更多的警报。
我知道我可以为每个警报命名空间创建不同的源模块(这可能是一个很好的解决方案),但请幽默我的怪癖。
解决方案
您可以使用条件表达式:
output "aws_alarm_arn" {
value = (var.namespace == "AWS/RDS"
? aws_cloudwatch_metric_alarm.rds_aws_alarm.arm
: (var.namespace == "AWS/ECS"
? aws_cloudwatch_metric_alarm.ecs_aws_alarm.arm
: aws_cloudwatch_metric_alarm.other_aws_alarm.arm
)
)
}
如果您的警报是互斥的,您可以简单地使用上面的try:
output "aws_alarm_arn" {
value = try(
aws_cloudwatch_metric_alarm.rds_aws_alarm[0].arn,
aws_cloudwatch_metric_alarm.ecs_aws_alarm[0].arn,
aws_cloudwatch_metric_alarm.other_aws_alarm[0].arn)
}
推荐阅读
- list - Flutter:我如何在列表中实现列表?错误:在 initializers.dart(implicit_this_reference_in_initializer) 中只能访问静态成员
- r - 闪亮:在空/未选择的radioButtions()的情况下,actionButton()可以返回错误吗?
- c# - 如何检查 JsonPath 中的多个键
- python - Scrapy - 一次运行多个蜘蛛 - CrawlerProcess - 文件结构
- docker - docker容器中的xcodebuild
- javascript - 在执行下一个操作之前等待循环完成
- java - 在 Firebase 实时数据库中,我如何遍历每个产品并在回收站视图中显示它们的详细信息
- gcloud - 将目录文件同步到 Google Cloud Composer dags/ 文件夹
- linux - 在覆盖 go 的默认信号处理程序时如何避免竞争?
- python - Python根据上个月创建文件夹结构