Obsah

  • Řešení a zjednodušený diagram architektury
  • AWS CDK skript (TypeScript)
  • Lambda funkce (Python)

Řešení

Toto řešení demonstruje, jak vybudovat systém pro asynchronní zpracování webhooků pomocí služeb AWS. Systém využívá AWS API Gateway pro příjem webhook požadavků, AWS Lambda pro zpracování a validaci požadavků, Amazon S3 pro ukládání, Amazon DynamoDB pro sledování a AWS Step Functions pro orchestraci workflows.

Popis případu užití

Toto řešení je ideální pro scénáře, kde webhook požadavky potřebují být zpracovány asynchronně kvůli dlouho běžícím operacím nebo potřebě spolehlivého, škálovatelného zpracování vysokého objemu příchozích požadavků. Příklady zahrnují výpočetně náročné ML/simulace, zpracování plateb, obsluhu zpětných volání API třetích stran a správu datových ingestion pipeline.

Průmyslové domény

Toto řešení je vhodné pro všechny průmyslové domény, kde jsou vyžadovány dlouho běžící asynchronní úlohy. Např. zdravotnictví, biochemie, energetika, finance.

Zjednodušený diagram architektury

Diagram architektury

Architektura se skládá z:

  1. API Gateway: Přijímá příchozí webhook požadavky.
  2. AWS Lambda: Zpracovává a validuje požadavky.
  3. Amazon S3: Ukládá validovaná data požadavků.
  4. Amazon DynamoDB: Ukládá metadata a klíče S3 objektů.
  5. AWS Step Functions: Spravuje workflow spuštěný webhook požadavkem.

AWS CDK skript (TypeScript)

import * as cdk from 'aws-cdk-lib';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import * as stepfunctions from 'aws-cdk-lib/aws-stepfunctions';
import * as stepfunctions_tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';

export class WebhookStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'WebhookBucket');

    const table = new dynamodb.Table(this, 'WebhookTable', {
      partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
    });

    const webhookFunction = new lambda.Function(this, 'WebhookFunction', {
      runtime: lambda.Runtime.PYTHON_3_8,
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda'),
      environment: {
        BUCKET_NAME: bucket.bucketName,
        TABLE_NAME: table.tableName,
      },
    });

    bucket.grantPut(webhookFunction);
    table.grantReadWriteData(webhookFunction);

    const api = new apigateway.RestApi(this, 'WebhookApi', {
      restApiName: 'Webhook Service',
    });

    const webhookIntegration = new apigateway.LambdaIntegration(webhookFunction);
    api.root.addMethod('POST', webhookIntegration);

    const stepFunctionDefinition = new stepfunctions.Pass(this, 'StartState');

    const stepFunction = new stepfunctions.StateMachine(this, 'WebhookStateMachine', {
      definition: stepFunctionDefinition,
    });
  }
}

Lambda funkce (Python)

import json
import boto3
import os
from uuid import uuid4

s3_client = boto3.client('s3')
dynamodb_client = boto3.client('dynamodb')

def handler(event, context):
    bucket_name = os.environ['BUCKET_NAME']
    table_name = os.environ['TABLE_NAME']

    # Validace a zpracování požadavku
    body = json.loads(event['body'])
    if 'data' not in body:
        return {
            'statusCode': 400,
            'body': json.dumps({'message': 'Neplatný požadavek'})
        }

    # Uložení dat do S3
    object_key = str(uuid4())
    s3_client.put_object(Bucket=bucket_name, Key=object_key, Body=json.dumps(body['data']))

    # Uložení metadat do DynamoDB
    dynamodb_client.put_item(
        TableName=table_name,
        Item={
            'id': {'S': object_key},
            'data': {'S': json.dumps(body['data'])}
        }
    )

    # Předání požadavku do Step Functions workflow (zjednodušeno pro ukázku)
    # V reálném scénáři byste spustili workflow s více detaily

    return {
        'statusCode': 200,
        'body': json.dumps({'message': 'Požadavek byl úspěšně zpracován'})
    }

Copyright © 2024. All rights reserved.