terraform 中是不是有任何特定的资源标签可以在 eventbridge 中创建规则

Posted

技术标签:

【中文标题】terraform 中是不是有任何特定的资源标签可以在 eventbridge 中创建规则【英文标题】:Is there any specific resource tag in terraform to create a rule in eventbridgeterraform 中是否有任何特定的资源标签可以在 eventbridge 中创建规则 【发布时间】:2020-10-10 14:48:14 【问题描述】:

例如我们在 cloudwatch 中有一个用于事件规则的资源标签 aws_cloudwatch_event_rule

【问题讨论】:

【参考方案1】:

您需要结合使用 aws_cloudwatch_event_rule 来匹配您要使用 EventBridge 处理的事件,并使用 aws_cloudwatch_event_target 来转发到另一个 EventBridge 事件总线或到可以直接处理事件的 Lambda 之类的东西,或者到可以由消费者处理事件的 SQS 队列。

这是一个完全通用的模块:

main.tf:

# ------------------------------------------------------------------------------
# CREATE CLOUDWATCH RULES FOR EACH LOGICAL ROUTE TO MATCH EVENTS OF INTEREST
# ------------------------------------------------------------------------------

resource "aws_cloudwatch_event_rule" "captures" 
  for_each = var.event_routes

  name        = replace(replace(each.key, "[^\\.\\-_A-Za-z0-9]+", "-"), "_", "-")
  description = each.value.description

  event_pattern = jsonencode(
    "detail-type" = each.value.event_names
  )


# ------------------------------------------------------------------------------
# CONFIGURE EACH RULE TO FORWARD MATCHING EVENTS TO THE CORRESPONDING TARGET ARN
# ------------------------------------------------------------------------------

resource "aws_cloudwatch_event_target" "route" 
  for_each = var.event_routes

  target_id = each.key
  rule      = aws_cloudwatch_event_rule.captures[each.key].name
  arn       = each.value.target_arn

变量.tf:

variable "event_routes" 
  description = "A map from a meaningful operator shorthand to the target ARN and list of the event names that CloudWatch should forward to them."
  type = map(object(
    description = string
    event_names = list(string)
    target_arn  = string
  ))

  /*
  event_routes = 
    forward_to_kpi_tracker = 
      description = "Forward events to KPI tracker"
      event_names = [
        "UserSignedUp",
        "UserWatchedLessonVideo",
      ]
      target_arn = "arn:aws:events:ca-central-1:000000000000:event-bus/default"
    
  
  */

输出.tf:

output "event_rule_name" 
  value =  for route_shorthand, route_details in var.event_routes :
    route_shorthand => aws_cloudwatch_event_rule.captures[route_shorthand].name
  


output "event_rule_arn" 
  value =  for route_shorthand, route_details in var.event_routes :
    route_shorthand => aws_cloudwatch_event_rule.captures[route_shorthand].arn
  

目标可以是以下任何一种:

EC2 实例 SSM 运行命令 SSM 自动化 AWS Lambda 函数 Amazon Kinesis Data Streams 中的数据流 Amazon Kinesis Data Firehose 中的数据传输流 Amazon ECS 任务 AWS Step Functions 状态机 AWS 批处理作业 AWS CodeBuild 项目 AWS CodePipeline 中的管道 Amazon Inspector 评估模板 Amazon SNS 主题 Amazon SQS 队列,包括 FIFO 队列 另一个 AWS 账户的默认事件总线

来自PutTargets API actions docs。

【讨论】:

你确定 terraform 支持“另一个 AWS 账户的默认事件总线”作为目标。因为从他们的文档来看,似乎并非如此,registry.terraform.io/providers/hashicorp/aws/latest/docs/… @vishal 我非常肯定。我们有四个帐户配置为将匹配事件路由到其他帐户的默认事件总线,并在生产中依赖它。 aws_cloudwatch_event_target 资源的 arn 参数可以是另一个 AWS 账户的默认事件总线的 ARN(这是我们在生产中所做的)。 registry.terraform.io/providers/hashicorp/aws/latest/docs/… 如果我想设置cloudwatch事件规则来触发StepFunction状态机,是否需要在aws_cloudwatch_event_ruleaws_cloudwatch_event_target之后设置权限配置?

以上是关于terraform 中是不是有任何特定的资源标签可以在 eventbridge 中创建规则的主要内容,如果未能解决你的问题,请参考以下文章

使用模块和计数时如何在 terraform 中包含标签

Terraform/lambda/IAM 根据标签停止 ec2

使用 terraform 删除特定资源,即 vm、nic、nsg

Terraform 使用带有标签的 count.index

使用 terraform 获取和更新特定字段

在 Terraform 上的 aws_iam_policy 资源上包含标签