【问题标题】:How to deploy aws EventBridge with CDK - Python example如何使用 CDK 部署 aws EventBridge - Python 示例
【发布时间】:2020-04-25 03:41:54
【问题描述】:

我需要一些 aws EventBridge CDK 部署 - Python 示例?

有人有代码吗?

【问题讨论】:

    标签: python amazon-web-services aws-cdk


    【解决方案1】:

    以下示例是一个运行良好的 Python CDK 代码。

    该示例演示了如何使用 AWS CDK(云部署工具包)部署同时触发 Step Function 和 Lambda Function 的 AWS EventBridge。

    由 yl.

    先决条件:

    • Python 3.7

    • AWS CDK

    步骤:

    1) 部署一个 lambda 函数

    2) 准备资源:EventBus、EventPattern(后面会解释一个EventBridge过滤器)

    3) 创建一个 Step 函数 StateMachine

    4) 使用资源创建规则:EventBus、EventPattern、目标:Lambda 和 State-Machine

    from aws_cdk import aws_events as events
    from aws_cdk import aws_events_targets as targets
    from aws_cdk import (
        aws_lambda as _lambda,
        aws_stepfunctions as sfn,
        aws_stepfunctions_tasks as sfn_tasks
    )
    from aws_cdk import core
    import typing
    
    class CdkEventBridgeStack(core.Stack):
    
        def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
            super().__init__(scope, id, **kwargs)
    
            # 1) deploy lambda function
            base_lambda = CdkEventBridgeStack.lambdaDeploy(self)
    
            # 2) prepare resources EventBus, EventPattern, Rule-Target
            eventBus, eventPattern, lambdaTarget1 = CdkEventBridgeStack.creEventBusAndEventPatternAndLambdaTarget(self, base_lambda)
    
            # 3) create step functions StateMachine
            stateMachineTarget = CdkEventBridgeStack.createStateMachine(self, base_lambda)
    
            # 4) create rule using resources: EventBus, EventPattern, Rule-Targets: Lambda and State-Machine
            CdkEventBridgeStack.createRule(self, [lambdaTarget1, stateMachineTarget], eventBus, eventPattern)
    
        # -----------------------------------------------------------------------------------
        @staticmethod
        def lambdaDeploy(this) -> None:
            base_lambda = _lambda.Function(this, 'MyLambda',
                                           function_name='MyLambda1',
                                           handler='testTargtetLambda.lambda_handler',
                                           runtime=_lambda.Runtime.PYTHON_3_7,
                                           code=_lambda.Code.asset('cdk_event_bridge/functions'),
                                           )
            return base_lambda
        # -----------------------------------------------------------------------------------
        @staticmethod
        def creEventBusAndEventPatternAndLambdaTarget(this, base_lambda: _lambda.IFunction):
            eventBus      = events.EventBus(scope=this, id="orders1", event_bus_name="orders2")
            eventPattern  = events.EventPattern(source=['XXX'])
            lambdaTarget1 = targets.LambdaFunction(handler=base_lambda)
    
            return eventBus, eventPattern, lambdaTarget1
        # -----------------------------------------------------------------------------------
        @staticmethod
        def createRule(this, targetsList : typing.Optional[typing.List["IRuleTarget"]] = None, eventBus: typing.Optional["IEventBus"]=None, eventPattern: typing.Optional["EventPattern"]=None):
            events.Rule(scope=this,
                        id="x123",
                        rule_name="routeToLambda",
                        targets=targetsList,
                        description="cdk Test Rule navigates to Lambda",
                        event_bus=eventBus,
                        event_pattern=eventPattern,
                        )
        # -----------------------------------------------------------------------------------
        @staticmethod
        def createStateMachine(this, lambda_function: _lambda.IFunction):
            submit_job_activity = sfn.Activity(
                this, "SubmitJob"
            )
            check_job_activity = sfn.Activity(
                this, "CheckJob"
            )
    
            submit_job = sfn.Task(
                this, "Submit Job",
                # task=sfn_tasks.InvokeActivity(submit_job_activity),
                task=sfn_tasks.InvokeFunction(lambda_function),
                result_path="$.guid",
            )
    
            get_status = sfn.Task(
                this, "Get Job Status",
                # task=sfn_tasks.InvokeActivity(check_job_activity),
                task=sfn_tasks.InvokeFunction(lambda_function),
                input_path="$.guid",
                result_path="$.status",
            )
    
            finalStatus =  sfn.Succeed(
                this, 'Final Job Status'
            )
    
            # definition = submit_job.next(get_status).end_states(sfn.Succeed())
            definition = submit_job\
                         .next(get_status) ##.next(finalStatus)
    
            machineHandler = sfn.StateMachine(
                this, "StateMachine222",
                definition=definition,
                state_machine_name="CdkTestStateMachine",
                timeout=core.Duration.seconds(30),
            )
            #  machine: aws_cdk.aws_stepfunctions.IStateMachine
            stateMachineTarget = targets.SfnStateMachine(machine=machineHandler)
            return  stateMachineTarget
    
        # ----------------------------------------------------------------------------------- 
    

    注意:

    code=_lambda.Code.asset('cdk_event_bridge/functions'),
    

    关于 Lambda 函数部署

    base_lambda = _lambda.Function(this, 'MyLambda',
                                   function_name='MyLambda1',
                                   handler='testTargtetLambda.lambda_handler',
                                   runtime=_lambda.Runtime.PYTHON_3_7,
                                   code=_lambda.Code.asset('cdk_event_bridge/functions'),
                                   )
    

    _lambda.Code.asset 指向 lambda 代码所在的“functions”文件夹 当文件夹层次结构为:

    /cdk_event_bridge+
                     +-cdk_event_bridge_stack.py  <= this cdk deployment script
                     +-/functions/+    <= a folder
                                  +-testTargtetLambda.py  <= Lambda code
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2022-07-21
      • 2021-04-08
      • 2020-05-03
      • 2020-08-15
      • 2021-12-29
      • 2020-06-28
      • 2020-05-08
      • 2019-11-12
      相关资源
      最近更新 更多