رویداد هدایت شده با آمازون 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 یک برچسب اضافه می کند.
سپس از معماری زیر استفاده خواهیم کرد:
- مانند تهيه كننده از رویدادها استفاده خواهیم کرد CloudTrail.
- مانند دلال، که رویدادها را مدیریت می کند، از آن استفاده خواهیم کرد رویداد پل
- مانند مصرف كننده از این رویدادها استفاده خواهیم کرد 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:
مثال کد 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:
مثال کد 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
}
}
}
بیشتر بدانید
معماری رویداد محور در مقابل محاسبات مبتنی بر رویداد در برنامههای بدون سرور