aws(学习笔记第三十二课) 深入使用cdk(API Gateway + event bridge)

文章目录

  • [aws(学习笔记第三十二课) 深入使用cdk](#aws(学习笔记第三十二课) 深入使用cdk)
  • 学习内容:
    • [1. 使用`aws API Gateway`+`lambda`](#1. 使用aws API Gateway+lambda)
      • [1.1. 以前的练习](#1.1. 以前的练习)
      • [1.2. 使用`cdk`创建`API Gateway` + `lambda`](#1.2. 使用cdk创建API Gateway + lambda)
      • [1.3. 确认`cdk`创建`API Gateway` + `lambda`](#1.3. 确认cdk创建API Gateway + lambda)
    • [2. 使用`event bridge`练习`producer`和`consumer`](#2. 使用event bridge练习producerconsumer)
      • [2.1. 代码链接](#2.1. 代码链接)
      • [2.2. 开始练习](#2.2. 开始练习)
      • [2.3. 代码部署的确认](#2.3. 代码部署的确认)
      • [2.4. 对部署进行测试](#2.4. 对部署进行测试)

aws(学习笔记第三十二课) 深入使用cdk

  • 使用cdk生成aws API Gateway+lambda以及eventbridge等等

学习内容:

  • 使用aws API Gateway+lambda
  • 使用event bridge练习producerconsumer

1. 使用aws API Gateway+lambda

1.1. 以前的练习

1.2. 使用cdk创建API Gateway + lambda

  • 整体架构
  • 代码解析
    • 创建lambda函数

      python 复制代码
      	   base_lambda = _lambda.Function(self, 'ApiCorsLambda',
      	   handler='lambda-handler.handler',
      	   runtime=_lambda.Runtime.PYTHON_3_12,
      	   code=_lambda.Code.from_asset('lambda'))

      注意,这里没有创建VPC,因为这里不需要显示的创建VPC

      • 创建API并且添加resource

        python 复制代码
                base_api = _apigw.RestApi(self, 'ApiGatewayWithCors',
                                          rest_api_name='ApiGatewayWithCors')
        
                example_entity = base_api.root.add_resource(
                    'example',
                default_cors_preflight_options=_apigw.CorsOptions(
                        allow_methods=['GET', 'OPTIONS'],
                        allow_origins=_apigw.Cors.ALL_ORIGINS)
      • 创建LambdaIntegrationAPIlambda进行绑定

        python 复制代码
              example_entity_lambda_integration = _apigw.LambdaIntegration(
                    base_lambda,
                    proxy=False,
                    integration_responses=[
                        _apigw.IntegrationResponse(
                            status_code="200",
                            response_parameters={
                                'method.response.header.Access-Control-Allow-Origin': "'*'"
                            }
                        )
                    ]
                )
      • API加入method

        python 复制代码
              example_entity.add_method(
                    'GET', example_entity_lambda_integration,
                    method_responses=[
                        _apigw.MethodResponse(
                            status_code="200",
                            response_parameters={
                                'method.response.header.Access-Control-Allow-Origin': True
                            }
                        )
                    ]
                )

1.3. 确认cdk创建API Gateway + lambda

  • 执行创建的cdk

    shell 复制代码
    	cdk --require-approval never deploy
  • 查看创建的结果

    • lambda创建结果

    • API创建结果

    • 确认API的调用URL

    • 访问API的调用URL

      之后不要忘记cdk destroy

2. 使用event bridge练习producerconsumer

2.1. 代码链接

api-eventbridge-lambda的代码链接

这里主要练习使用eventbridge,进行producerconsumer的练习。

2.2. 开始练习

  • 整体架构
  • 代码解析
    • 生成producer

      python 复制代码
      			        #
      			        # Producer Lambda
      			        #
      			        event_producer_lambda = _lambda.Function(self, "eventProducerLambda",
      			                                                 runtime=_lambda.Runtime.PYTHON_3_12,
      			                                                 handler="event_producer_lambda.lambda_handler",
      			                                                 code=_lambda.Code.from_asset("lambda")
      			                                                 )
      			
      			        event_policy = iam.PolicyStatement(effect=iam.Effect.ALLOW, resources=['*'], actions=['events:PutEvents'])
      			
      			        event_producer_lambda.add_to_role_policy(event_policy)

      这里,producer被赋予权限putEvents,因为之后要向eventbridge进行putEvents操作。

    • producer的处理代码

      python 复制代码
      	def lambda_handler(event, context):
      	    eventbridge_client = boto3.client('events')
      	    request_body = event["body"]
      	    if request_body is None:
      	        request_body = ""
      	    # Structure of EventBridge Event
      	    eventbridge_event = {
      	        'Time': datetime.datetime.now(),
      	        'Source': 'com.mycompany.myapp',
      	        'Detail': request_body,
      	        'DetailType': 'service_status'
      	    }
      	    logger.info(eventbridge_event)
      	
      	    # Send event to EventBridge
      	    response = eventbridge_client.put_events(
      	        Entries=[
      	            eventbridge_event
      	        ]
      	    )
      	
      	    logger.info(response)
      	
      	    # Returns success reponse to API Gateway
      	    return {
      	        "statusCode": 200,
      	        "body": json.dumps({
      	            "result": "from Producer"
      	        }),
      	    }

      这里,使用了boto3这个python package,AWS ‌Boto3‌ 是亚马逊云服务(AWS)官方提供的 Python SDK,主要用于通过代码与 AWS 服务进行交互和管理。这里使用boto3eventbridge进行putEvents

    • consumer1consumer2

      python 复制代码
      			        #
      			        # Approved Consumer1
      			        #
      			        event_consumer1_lambda = _lambda.Function(self, "eventConsumer1Lambda",
      			                                                  runtime=_lambda.Runtime.PYTHON_3_8,
      			                                                  handler="event_consumer_lambda.lambda_handler",
      			                                                  code=_lambda.Code.from_asset("lambda")
      			                                                  )
      			
      			        event_consumer1_rule = events.Rule(self, 'eventConsumer1LambdaRule',
      			                                           description='Approved Transactions',
      			                                           event_pattern=events.EventPattern(source=['com.mycompany.myapp']
      			                                                                             ))
      			
      			        event_consumer1_rule.add_target(targets.LambdaFunction(handler=event_consumer1_lambda))
      			
      			        #
      			        # Approved Consumer2
      			        #
      			        event_consumer2_lambda = _lambda.Function(self, "eventConsumer2Lambda",
      			                                                  runtime=_lambda.Runtime.PYTHON_3_8,
      			                                                  handler="event_consumer_lambda.lambda_handler",
      			                                                  code=_lambda.Code.from_asset("lambda")
      			                                                  )
      			
      			        event_consumer2_rule = events.Rule(self, 'eventConsumer2LambdaRule',
      			                                           description='Approved Transactions',
      			                                           event_pattern=events.EventPattern(source=['com.mycompany.myapp']
      			                                                                             ))
      			        event_consumer2_rule.add_target(targets.LambdaFunction(handler=event_consumer2_lambda))

      consumer1consumer2类似,就是接受到了eventbridgeevent之后,进行log输出。

      python 复制代码
      			def lambda_handler(event, context):
      			    logger.info(event)
      			
      			    return {
      			        "statusCode": 200,
      			        "body": json.dumps({
      			            "result": "testing..."
      			        }),
      			    }
    • consumer3使用kinesisfirehoseevent进行接受,并保存到S3 bucket

      python 复制代码
      	        #
      	        # Approved Consumer3
      	        #
      	
      	        # Create S3 bucket for KinesisFirehose destination
      	        ingest_bucket = s3.Bucket(self, 'test-ngest-bucket')
      	
      	        # Create a Role for KinesisFirehose
      	        firehose_role = iam.Role(
      	            self, 'myRole',
      	            assumed_by=iam.ServicePrincipal('firehose.amazonaws.com'))
      	
      	        # Create and attach policy that gives permissions to write in to the S3 bucket.
      	        iam.Policy(
      	            self, 's3_attr',
      	            policy_name='s3kinesis',
      	            statements=[iam.PolicyStatement(
      	                actions=['s3:*'],
      	                resources=['arn:aws:s3:::' + ingest_bucket.bucket_name + '/*'])],
      	                # resources=['*'])],
      	            roles=[firehose_role],
      	        )
      	
      	        event_consumer3_kinesisfirehose = _firehose.CfnDeliveryStream(self, "consumer3-firehose",
      	                                                                      s3_destination_configuration=_firehose.CfnDeliveryStream.S3DestinationConfigurationProperty(
      	                                                                          bucket_arn=ingest_bucket.bucket_arn,
      	                                                                          buffering_hints=_firehose.CfnDeliveryStream.BufferingHintsProperty(
      	                                                                              interval_in_seconds=60
      	                                                                          ),
      	                                                                          compression_format="UNCOMPRESSED",
      	                                                                          role_arn=firehose_role.role_arn
      	                                                                      ))
      	
      	        event_consumer3_rule = events.Rule(self, 'eventConsumer3KinesisRule',
      	                                           description='Approved Transactions',
      	                                           event_pattern=events.EventPattern(source=['com.mycompany.myapp']
      	                                                                             ))
      	        event_consumer3_rule.add_target(targets.KinesisFirehoseStream(stream=event_consumer3_kinesisfirehose))
    • producer通过API Gateway进行公开

      python 复制代码
      	        # defines an API Gateway REST API resource backed by our "atm_producer_lambda" function.
      	        api = api_gw.LambdaRestApi(self, 'SampleAPI-EventBridge-Multi-Consumer',
      	                             handler=event_producer_lambda,
      	                             proxy=False
      	                             )
      	        items = api.root.add_resource("items")
      	        items.add_method("POST")  # POST /items

2.3. 代码部署的确认

接下来进行cdk deploy来确认执行效果。

  • 一个producer与两个consumer,都是lambda
  • 第三个consumer,一个kinesisFireHose
  • APIproducer

2.4. 对部署进行测试

  • API进行测试调用
    返回了正常的结果。这里,需要对请求正文request body一定要设定参数这里设置如下。

    json 复制代码
    {"item1":"123","item2":"234"}

    使用API调用,之后启动producerlamdba,向eventbridge进行putEvents

  • consumer1consumer2进行确认

  • consumer3进行确认
    这里主要是对S3 bucket进行确认。可以看到,
    producer -> event -> eventbridge -> consumer3 -> kinesis firehose -> S3 bucket
    最后cdk destroy

相关推荐
孤寂大仙v1 分钟前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
ianozo4 分钟前
数据结构--【栈与队列】笔记
数据结构·笔记
极客BIM工作室1 小时前
机器学校的考试风波:误差分析、过拟合和欠拟合
笔记·机器学习
flashier1 小时前
C语言 进阶指针学习笔记
c语言·笔记·学习
大白的编程日记.2 小时前
【Linux学习笔记】Linux基本指令分析和权限的概念
linux·笔记·学习
螺旋式上升abc2 小时前
GO语言学习笔记
笔记·学习·golang
W起名有点难2 小时前
前端学习——CSS
前端·css·学习
Moonnnn.3 小时前
51单片机——汇编工程建立、仿真、调试全过程
汇编·笔记·嵌入式硬件·学习·51单片机
画个逗号给明天"3 小时前
TinyWebServer项目笔记——02 半同步半反应堆线程池
笔记
不会聊天真君6473 小时前
HTML5(Web前端开发笔记第一期)
笔记·html5