برنامه نویسی

رویداد هدایت شده با آمازون EventBridge

معماری‌های رویداد محور با سرویس‌هایی مشخص می‌شوند که به صورت ناهمزمان و جدا از هم از طریق رویدادها ارتباط برقرار می‌کنند.

سرویس‌ها رویدادهایی (تولیدکنندگان) را پخش خواهند کرد که توسط سایر سرویس‌ها (مصرف‌کنندگان) مصرف می‌شوند و به آنها عمل می‌کنند.

مشخصه‌ای که معماری رویداد درایو را مشخص می‌کند این است که: تولیدکنندگان و مصرف‌کنندگان کاملاً از هم جدا هستند، یک تولیدکننده نباید بداند یا اهمیتی بدهد که چه کسی رویدادهای او را مصرف می‌کند.

Amazon EventBridge چه خواهد بود؟

Amazon EventBridge سرویسی است که دسترسی هم‌زمان به تغییرات داده در سرویس‌های AWS، برنامه‌های کاربردی شما و برنامه‌های نرم‌افزار به‌عنوان سرویس (SaaS) را بدون نیاز به نوشتن کد فراهم می‌کند. برای شروع، می توانید منبع رویداد را در کنسول EventBridge انتخاب کنید. سپس می‌توانید از میان سرویس‌های AWS، از جمله AWS Lambda، Amazon Simple Notification Service (SNS) و Amazon Kinesis Data Firehose، یک هدف را انتخاب کنید. EventBridge به طور خودکار رویدادها را در زمان واقعی ارائه می دهد.

به طور خلاصه می توانید این رویدادها را دریافت کنید، فیلتر کنید، تبدیل کنید، مسیریابی کنید (از تولیدکنندگان) و به مصرف کنندگان تحویل دهید.

کار با آمازون EventBridge

برای مثال استفاده از Amazon EventBridge، اجازه دهید سناریوی زیر را ایجاد کنیم:

  • هر بار که یک نمونه RDS ایجاد می شود، می خواهیم یک Lambda اجرا شود. برای مثال ما Lambda یک برچسب اضافه می کند.

سپس از معماری زیر استفاده خواهیم کرد:

نمونه ای از معماری های رویداد محور

  1. مانند تهيه كننده از رویدادها استفاده خواهیم کرد CloudTrail.
  2. مانند دلال، که رویدادها را مدیریت می کند، از آن استفاده خواهیم کرد رویداد پل
  3. مانند مصرف كننده از این رویدادها استفاده خواهیم کرد AWS Lambda

مخزن rafaelonline/eventbridge-lambda Github دارای یک نمونه پیکربندی زیرساخت با استفاده از Terraform و اسکریپت پایتون مورد استفاده است.

مرحله 1

پیش نیاز: حساب باید دارای یک Trail پیکربندی شده در CloudTrail باشد، نحوه پیکربندی آن را در Creating a Trail بیاموزید.

CloudTrail رویدادها را در قالب JSON تولید می کند و دارای یکپارچگی بومی با EventBridge است. او تهیه کننده رویداد ما خواهد بود.

CloudTrail با ثبت اقدامات انجام شده در حساب شما، امکان مشاهده فعالیت های کاربر را فراهم می کند. CloudTrail اطلاعات مهمی را در مورد هر اقدام ثبت می کند، مانند اینکه چه کسی درخواست را انجام داده است، از چه خدماتی استفاده شده است، چه اقداماتی انجام شده است، چه پارامترهای عملکردی بوده است، و چه عناصر پاسخی توسط سرویس AWS برگردانده شده است.

گام 2

حال باید یک قانون در EventBridge Rules پیکربندی کنیم تا رویدادهای مورد نظر را نظارت کنیم.

در مورد ما، الگوی رویداد خود AWS خواهد بود که از Cloudtrail و رویدادهایی از rds.amazonaws.com با نام CreateDBInstance سرچشمه می‌گیرد.

مثال در کنسول AWS:

مثال در کنسول AWS

مثال کد Terraform برای ایجاد Rule:

###### 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

اکنون باید رویداد خود را به مصرف کننده (هدف) ارسال کنیم که یک لامبدا خواهد بود.

Target منبع یا نقطه پایانی است که EventBridge زمانی که رویداد با الگوی رویداد تعریف شده برای یک قانون مطابقت داشته باشد رویدادی را به آن ارسال می کند. قانون داده های رویداد را پردازش می کند و اطلاعات مربوطه را به هدف ارسال می کند

ما می‌توانیم همین رویداد را به حداکثر پنج (5) هدف ارسال کنیم، برای مثال ارسال یک SNS مبنی بر ایجاد یک RDS، علاوه بر اجرای Lambda.

حتی می‌توانیم رویداد را همان‌طور که ایجاد شده است ارسال کنیم، فقط بخشی از رویداد را ارسال کنیم، قبل از ارسال، رویداد را ویرایش کنیم، یک رویداد ثابت json ارسال کنیم.

مثال در کنسول AWS:

مثال در کنسول AWS

مثال کد 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

ما به مرحله نهایی یعنی داشتن مشتری خود رسیدیم، برای سناریوی خود از Lambda استفاده خواهیم کرد که یک Tag به نمونه RDS ایجاد شده اضافه می کند.

اسکریپت پایتون که تگ را ایجاد می کند

"""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)        
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمونه کد Terraform برای ایجاد Lambda:

###### 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
    }
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بیشتر بدانید

معماری رویداد محور در مقابل محاسبات مبتنی بر رویداد در برنامه‌های بدون سرور

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا