”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 处理新 EventBridge 架构发现的自动 Jira 票证

处理新 EventBridge 架构发现的自动 Jira 票证

发布于2024-11-08
浏览:780

让我从头开始。我在之前的一个客户中担任 AWS 云工程师,使用了一种事件驱动架构,其中第三方通过 EventBridge 不断向我们的 AWS 环境发送许多事件。对于每个第三方,我们提供了一个包含各种 EventBridge 规则的事件总线。

这里的挑战是跟踪活动结构——它是如何组织的。事件经常更新,导致召开许多会议来澄清事情。

2019 年底,我们的很大一部分问题得到了 EventBridge Schema Discovery 的解决。通过在事件总线上启用此功能,可以根据接收到的事件自动生成模式。这使我们能够从这些模式生成代码绑定,这对我们的面向对象环境有很大帮助。

下面您可以看到一个非常基本的第三方示例事件。

{
  "version": "0",
  "id": "ef21d5fc-a5ba-e2c6-fc4b-a8807455c64d",
  "detail-type": "orderType",
  "source": "com.company.A",
  "account": "xxx",
  "time": "2024-08-22T08:04:26Z",
  "region": "eu-west-1",
  "resources": [],
  "detail": {
    "orderId": 123456789,
    "customer": {
      "customerId": "C001",
      "name": "John Doe"
    },
    "orderDate": "2024-08-22"
  }
}

AWS 发现了这些类型事件的模式:

Handling Automated Jira Tickets for New EventBridge Schema Discoveries

通过使用 AWS Toolkit for Visual Studio Code,我们可以轻松地将事件表示为代码中的强类型对象。

Handling Automated Jira Tickets for New EventBridge Schema Discoveries

下面是一个关于我们如何使用代码绑定的非常基本的示例。

Handling Automated Jira Tickets for New EventBridge Schema Discoveries

输出:

123456789
C001


这改善了我们的工作方式,但我们仍然遇到了问题。有时,第三方会为其活动添加新属性。 EventBridge 会发现这些更改,但开发人员经常忘记更新新架构的代码绑定。尽管我们的实现足够强大,可以防止添加新属性时出现损坏,但它会产生我们没有利用的新数据。我们必须依靠开发人员记住偶尔更新他们的代码绑定,并且没有明确的流程来管理此操作。

有时,代码绑定几个月都没有更新,有时,两个开发人员会同时更新它,从而导致冲突或重复工作。

为了更好地处理这个问题,我们决定构建一个解决方案,每当第三方更新其事件并发现新架构时,该解决方案都会自动创建 Jira 票证。

该解决方案可在我的 GitHub 上的 CloudFormation 中找到。检查自述文件。

第一步是在我们的默认总线上创建一个 EventBridge 规则,每当发现新架构或架构版本更新时就会触发该规则。然后,该事件被发送到 SQS 队列,作为 EventBridge Pipe 的输入。在这里,我们可以添加额外的过滤(在本例中是可选的)并使用 Lambda 函数丰富我们的事件。

Handling Automated Jira Tickets for New EventBridge Schema Discoveries

为了丰富,我们使用 boto3 来描述_schema。

data = event[0]["input"]["detail"]

try:
    response = client.describe_schema(
        RegistryName=data["RegistryName"],
        SchemaName=data["SchemaName"],
        SchemaVersion=data["Version"],
    )
except ClientError as e:
    raise e

return_data = {
    "SchemaName": response["SchemaName"],
    "SchemaVersion": response["SchemaVersion"],
    "SchemaArn": response["SchemaArn"],
    "Content": json.loads(response["Content"]),
}

丰富数据后,我们将其发送到 Step Function 工作流程。此工作流程又触发了 AWS 提供的 AWS-CreateJiraIssue SSM 自动化,该自动化会自动创建 Jira 票证。

Handling Automated Jira Tickets for New EventBridge Schema Discoveries

该票证包含架构名称、新架构版本和架构的 ARN 等详细信息。 (如果需要,还可以添加活动的其他内容。)

 ----------------        --------        -------------------------        ----------------        ------------------------- 
| EventBridge    | ---> | SQS    | ---> | EventBridge Pipe        | ---> | Step Function  | ---> | SSM Automation Document |
| Rule           |      |        |      | (Filtering & Enrichment)|      |                |      |                         |
 ----------------        --------        -------------------------        ----------------        ------------------------- 

让我们演示一下这个解决方案。在这里您可以看到基于原始事件的更新事件。属性状态为新。

{
  "version": "0",
  "id": "dffbd38b-9258-d028-21f3-da0ba3c9e314",
  "detail-type": "orderType",
  "source": "com.company.A",
  "account": "xxx",
  "time": "2024-08-22T08:04:26Z",
  "region": "eu-west-1",
  "resources": [],
  "detail": {
    "orderId": 123456789,
    "status": "Completed",
    "customer": {
      "customerId": "C001",
      "name": "John Doe"
    },
    "orderDate": "2024-08-22"
  }
}

将会发现一个新的模式。这将触发整个解决方案。 Lambda 丰富了我们的事件后,更新后的事件将用作我们 Step Function 的输入。

我们的Step Function的输入事件更加丰富了,看起来像这样。

[
  {
    "statusCode": 200,
    "data": {
      "SchemaName": "com.company.A@OrderType",
      "SchemaVersion": "2",
      "SchemaArn": "arn:aws:schemas:eu-west-1:xxx:schema/discovered-schemas/com.company.A@OrderType",
      "Content": {
        "openapi": "3.0.0",
        "info": {
          "version": "1.0.0",
          "title": "OrderType"
        },
        "paths": {},
        "components": {
          "schemas": {
            "AWSEvent": {
              "type": "object",
              "required": [
                "detail-type",
                "resources",
                "detail",
                "id",
                "source",
                "time",
                "region",
                "version",
                "account"
              ],
              "x-amazon-events-detail-type": "orderType",
              "x-amazon-events-source": "com.company.A",
              "properties": {
                "detail": {
                  "$ref": "#/components/schemas/OrderType"
                },
                "account": {
                  "type": "string"
                },
                "detail-type": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "region": {
                  "type": "string"
                },
                "resources": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                },
                "source": {
                  "type": "string"
                },
                "time": {
                  "type": "string",
                  "format": "date-time"
                },
                "version": {
                  "type": "string"
                }
              }
            },
            "OrderType": {
              "type": "object",
              "required": [
                "orderId",
                "orderDate",
                "customer",
                "status"
              ],
              "properties": {
                "customer": {
                  "$ref": "#/components/schemas/Customer"
                },
                "orderDate": {
                  "type": "string",
                  "format": "date"
                },
                "orderId": {
                  "type": "number"
                },
                "status": {
                  "type": "string"
                }
              }
            },
            "Customer": {
              "type": "object",
              "required": [
                "customerId",
                "name"
              ],
              "properties": {
                "customerId": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
]

Handling Automated Jira Tickets for New EventBridge Schema Discoveries

Step Function 工作流程将依次触发 SSM 自动化并创建 Jira Ticket。

Handling Automated Jira Tickets for New EventBridge Schema Discoveries

为了方便起见,我将票证内容保持简短。但是,由于内容也作为输入发送到 Step Function,因此它也可以包含在票证中。这样,您就可以直接在工单中提及新属性或架构更改。

当发现全新事件时,也会触发此解决方案,因为它将创建新事件的版本 1,从而引发 EventBridge 规则。

通过这种方式,我们获悉了更新并可以将它们安排到我们的冲刺中。这导致我们的开发周期加速。

我知道这是一个非常具体的案例,但可以通过设置 EventBridge 规则来触发所需的事件来构建类似的解决方案,然后将丰富和 Step Functions 与 SSM 结合使用来创建进一步的自动化。

版本声明 本文转载于:https://dev.to/aws-builders/handling-automated-jira-tickets-for-new-eventbridge-schema-discoveries-3i9n?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-07-20
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    [ appengine静态文件mime type override ,静态文件处理程序偶尔可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for File [使用[File]。 application/application/octet-stream ....
    编程 发布于2025-07-20
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withco...
    编程 发布于2025-07-20
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-07-20
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-07-20
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-07-20
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-07-20
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-07-20
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-07-20
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-07-20
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-07-20
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-07-20
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当需要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考...
    编程 发布于2025-07-20
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-07-20
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-07-20

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3