以亚马逊Eventbridge为导向的活动
#aws #python #eventdriven #terraform

事件驱动的体系结构的特征是以惊人和不敏感的事件形式传达的串行。

将传输服务(生产者),这些服务将由其他​​(消费者)服务消费和反应。

标记事件驱动器架构的特征是:生产者和消费者完全解散,生产者不应知道或关心那些正在消费活动的人。

Event-Driven Architectures Draw

亚马逊Eventbridge是什么?

Amazon EventBridge是一项服务,可提供对AWS服务中数据更改的真实时间访问,其应用程序和软件应用程序作为服务(SaaS)需要编写一种方式。首先,您可以在EventBridge控制台上选择事件来源。然后,您可以在AWS服务之间选择一个目的地,包括AWS Lambda,Amazon Simple Notification Service(NHS)和Amazon Kinesis Data Firehose。 EventBridge将几乎自动实时提供活动。

简而言之,您可以接收,过滤,转换,路线(从生产者)并将这些事件交付给消费者。

与Amazon Eventbridge合作

为了体现Amazon Eventbridge的使用,我们将创建以下场景:

  • 每次创建RDS实例时,我们都希望执行lambda。对于我们的示例,lambda将添加一个标签。

我们将使用以下架构:

Event-Driven Architectures exemple

  1. 作为事件的生产者,我们将使用 CloudTrail
  2. 喜欢经纪人,它将处理事件,我们将使用 eventbridge
  3. 作为这些事件的消费者,我们将使用 aws lambda

github rafaelonline/eventbridge-lambda的存储库具有使用Terraform和使用Python脚本的基础架构配置的示例。

步骤1

先决条件:我需要帐户在CloudTrail中配置一条小径,了解如何在Creating a trail

中配置

CloudTrail以JSON格式生成事件,并与EventBridge具有本机集成。他将成为我们的活动制作人。

CloudTrail通过注册在您的帐户上执行的操作来提供对用户活动的可见性。 CloudTrail记录有关每个动作的重要信息,例如提出请求的人,使用了哪些服务,执行了哪些操作,哪些是parano仪表,以及答案的元素由AWS Service返回

第2步

我们现在必须在EventBridge Rules上配置规则以监视所需的事件。

在我们的情况下,event pattern将是源自CloudTrail的散文AWS和rds.amazonaws.com的事件,名为CreateBinstence。

示例da aws:

Exemplo no console da AWS

规则创建的代码Terraform的示例:

###### EVENTBRIDGE RULE - CREATED RDS INSTANCE ######
resource "aws_cloudwatch_event_rule" "rds_event_rule" {
  name          = "rule-rds-created"
  description   = "Triggers Lambda when new RDS instance are created"
  is_enabled    = true
  event_pattern = <<EOF
    {
    "source": ["aws.rds"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail": {
        "eventSource" : ["rds.amazonaws.com"],
        "eventName": ["CreateDBInstance"]
    }
    }
  EOF
}

步骤3

现在我们需要将活动发送给消费者(目标),这将是lambda。

Target是事件Bridge发送事件的事件或事件对应于规则的事件标准设置时的事件。规则处理事件数据并将相关信息发送到目标

我们可以将同一事件发送给ATO©五(5)个目标,例如发送NHS,并告知创建RDS,此外还执行Lambda。

我们甚至可以最初作为生成事件发送,仅发送活动的一部分,在发送之前在活动中制作某些版本,发送固定的事件JSON。

示例da aws:

Exemplo no console da AWS

Terget Terraform手工艺的示例:

###### EVENTBRIDGE TARGET - CREATED RDS INSTANCE ######
resource "aws_cloudwatch_event_target" "lambda_rule_rds" {
  depends_on = [aws_lambda_function.autotag]
  rule       = aws_cloudwatch_event_rule.rds_event_rule.name
  target_id  = "SendToLambda"
  arn        = aws_lambda_function.autotag.arn
}

步骤4

我们已经达到了我们拥有消费者的结局,对于我们的场景,我们将使用一个将标签添加到创建的RDS实例的lambda。

创建标签的Python脚本

"""Add tags on RDS and Aurora."""
import logging
import os
import boto3
from botocore.exceptions import ClientError

# Config Logging.
log = logging.getLogger()
log.setLevel(logging.INFO)

def lambda_handler(event, context):
    """Add tags on RDS and Aurora"""

    # Define the tags to add to the RDS instance
    tag_key = os.environ.get('TAG_KEY')
    tag_value = os.environ.get('TAG_VALUE')
    tags = [
        {
            'Key': tag_key,
            'Value': tag_value
        }
    ]

    # Connect to RDS service
    rds = boto3.client('rds')
    event_name = event.get("detail").get("eventName")

    if event_name == "CreateDBCluster":
        aurora_arn = event.get("detail").get("responseElements").get("dBClusterArn")
    # Add tags to the Regional Cluster
        try:
            rds.add_tags_to_resource(
                ResourceName=aurora_arn,
                Tags=tags
            )
            log.info('Tag adicionda com sucesso ao Cluster Aurora: %s', aurora_arn)
        except ClientError as error:
            log.exception(error)

    else:
    # Add tags to the RDS instance
        rds_arn = event.get("detail").get("responseElements").get("dBInstanceArn")
        try:
            rds.add_tags_to_resource(
                ResourceName=rds_arn,
                Tags=tags
            )
            log.info('Tag adicionda com sucesso ao RDS: %s', rds_arn)
        except ClientError as error:
            log.exception(error)        

lambda创建的代码Terraform的示例:

###### GENERATE PACKAGE LAMBDA ###### 
data "archive_file" "lambda_autotag" {
  type        = "zip"
  source_dir  = "${path.module}/code/src"
  output_path = "${path.module}/code/lambda_package.zip"
}

###### LAMBDA FUNCTION ######
resource "aws_lambda_function" "autotag" {
  function_name    = var.autotag_function_name
  role             = aws_iam_role.lambda_exec_role.arn
  filename         = data.archive_file.lambda_autotag.output_path
  source_code_hash = data.archive_file.lambda_autotag.output_base64sha256
  description      = var.autotag_description
  publish          = true

  runtime       = "python3.8"
  handler       = "main.lambda_handler"
  timeout       = 300
  memory_size   = 128
  architectures = ["arm64"]

  environment {
    variables = {
      TAG_KEY   = var.lambda_tag_key
      TAG_VALUE = var.lambda_tag_value
    }
  }
}

知道更多

Event-Driven Architectures vs. Event-Based Compute in Serverless Applications