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

news2025/3/10 8:04:59

文章目录

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

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

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

学习内容:

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

1. 使用aws API Gateway+lambda

1.1. 以前的练习

  • 以前的例子
    API Gateway + lambda这个例子中已经使用了手动创建,使用练习了aws API Gateway+lambda
  • 使用cdk来创建
    这里,采用cdk的方式来创建API Gateway + lambda
    代码链接 api-cors-lambda

1.2. 使用cdk创建API Gateway + lambda

  • 整体架构
    在这里插入图片描述
  • 代码解析
    • 创建lambda函数
      	   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

                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进行绑定

              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

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

      			        #
      			        # 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的处理代码

      	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

      			        #
      			        # 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输出。

      			def lambda_handler(event, context):
      			    logger.info(event)
      			
      			    return {
      			        "statusCode": 200,
      			        "body": json.dumps({
      			            "result": "testing..."
      			        }),
      			    }
      

      在这里插入图片描述

    • consumer3使用kinesisfirehoseevent进行接受,并保存到S3 bucket

      	        #
      	        # 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进行公开

      	        # 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一定要设定参数这里设置如下。
    {"item1":"123","item2":"234"}
    
    使用API调用,之后启动producerlamdba,向eventbridge进行putEvents
    在这里插入图片描述
  • consumer1consumer2进行确认
    在这里插入图片描述
  • consumer3进行确认
    这里主要是对S3 bucket进行确认。可以看到,
    producer -> event -> eventbridge -> consumer3 -> kinesis firehose -> S3 bucket
    最后cdk destroy

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机视觉算法实战——老虎个体识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域,旨在通过分析老虎的独特条纹图案,自动识别和区…

Qt添加MySql数据库驱动

文章目录 一. 安装MySql二.编译mysql动态链接库 Qt版本:5.14.2 MySql版本:8.0.41 一. 安装MySql 参考这里进行安装:https://blog.csdn.net/qq_30150579/article/details/146042922 将mysql安装目录里的bin,include和lib拷贝出来…

蓝桥杯备考:图论初解

1:图的定义 我们学了线性表和树的结构,那什么是图呢? 线性表是一个串一个是一对一的结构 树是一对多的,每个结点可以有多个孩子,但只能有一个父亲 而我们今天学的图!就是多对多的结构了 V表示的是图的顶点集…

【每日学点HarmonyOS Next知识】输入框自动获取焦点、JS桥实现方式、Popup设置全屏蒙版、鼠标事件适配、Web跨域

1、HarmonyOS TextInput或TextArea如何自动获取焦点? 可以使用 focusControl.requestFocus 对需要获取焦点的组件设置焦点,具体可以参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attribut…

网络空间安全(19)CSRF攻防

一、简介 跨站请求伪造(Cross-Site Request Forgery,简称CSRF)是一种网络攻击方式。攻击者通过诱导受害者访问恶意页面,利用受害者在被攻击网站已经获取的注册凭证(如Cookie),绕过后台的用户验证…

DEV C++安装

点击----我接受 点击--下一步 选择安装路径: D盘安装选择路径: 点击----安装等待安装完成点击---完成即可 一路下一步即可

ESP32驱动OV3660摄像头实现物体轮廓识别(摄像头支持红外夜视、边缘AI计算)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 ESP32-S3 AI智能摄像头模块是一款专为智能家居和物联网应用打造的高性能边缘AI开发模组。它集成了摄像头、麦克风、音频功放、环境光传感器和夜视补光灯,无需依赖云端即可实现本地化AI推理。 凭借TensorFlow Lite、YOLO和O…

深入探讨 Docker 层次结构及其备份策略20250309

深入探讨 Docker 层次结构及其备份策略 本文将深入探讨 Docker 层次结构 以及在 不同场景下应选择哪种备份方式。通过本文的介绍,您将对如何高效地管理和迁移 Docker 容器有更深的理解。 📌 什么是 Docker 层次结构? Docker 镜像采用了 分…

游戏引擎学习第145天

仓库:https://gitee.com/mrxiao_com/2d_game_3 今天的计划 目前,我们正在完成遗留的工作。当时我们已经将声音混合器(sound mixer)集成到了 SIMD 中,但由于一个小插曲,没有及时完成循环内部的部分。这个小插曲主要是…

如何在el-input搜索框组件的最后面,添加图标按钮?

1、问题描述 2、解决步骤 在el-input组件标签内,添加一个element-plus的自定义插槽, 在插槽里放一个图标按钮即可。 3、效果展示 结语 以上就是在搜索框组件的末尾添加搜索按钮的过程。 喜欢本篇文章的话,请关注本博主~~

NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发

一、软件介绍 文末提供程序和源码下载 NoteGen 是一款专注于记录和写作的跨平台 AI 笔记应用,基于 Tauri 开发。NoteGen 的核心理念是将记录、写作和 AI 结合使用,三者相辅相成。记录功能可以帮助用户快速捕捉和整理碎片化知识。整理功能是连接记录和写…

第五次CCF-CSP认证(含C++源码)

第五次CCF-CSP认证 第一道(easy)思路及AC代码 第二道(easy)思路及AC代码solution 1solution 2 第三道(mid)思路及AC代码(mid) 第一道(easy) 题目链接 思路及…

个人学习编程(3-06) 搜索

树的高度&#xff1a; 题目&#xff1a; PS G:\vscodetest> .\ab.exe 5 5 1 2 1 4 1 5 2 3 3 #include <stdio.h> #include <vector> #include <queue> using namespace std; int main() {int n,m;scanf("%d %d",&n,&m);vector<vec…

springcloud sentinel教程

‌QPS&#xff08;Queries Per Second&#xff09;即每秒查询率 TPS&#xff0c;每秒处理的事务数目 PV&#xff08;page view&#xff09;即页面浏览量 UV 访问数&#xff08;Unique Visitor&#xff09;指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十一) 实现服务端和客户端socketio 连接

1.后端部分 socketIO文档参考Socket.IO 首先在lib下新建socket.js文件 参考服务器API | Socket.IO import {Server} from socket.io; import http from http import express from "express"const app express() const server http.createServer(app) const io …

【GoTeams】-3:构建api、重构错误码

本文目录 1. 构建api梳理调用关系api包的作用路由梳理注册Register代码语法 2. 重构错误码 1. 构建api 首先复制project-user&#xff0c;改名为project-api&#xff0c;放在总的路径下&#xff0c;然后在工作区中进行导入。 运行命令go work use .\project-api\新建工作区之…

《苍穹外卖》SpringBoot后端开发项目重点知识整理(DAY1 to DAY3)

目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功&#xff1a; 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具&#xff1a;Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…

BLUEM2引擎源码2025最新版

BLUE 引擎解析&#xff1a;传奇私服圈中的热门引擎 一、BLUE 引擎简介 BLUE 引擎是传奇私服圈子中较为知名的一款游戏引擎&#xff0c;它在传统的传奇引擎基础上进行了优化和扩展&#xff0c;使得私服开发者可以更加方便地搭建和管理服务器。相比于早期的 GEE、LEG、Hero 等引…

【RAG】检索后排序 提高回答精度

问题: RAG中&#xff0c;有时&#xff0c;最合适的答案不一定排在检索的最前面 user_query "how safe is llama 2" search_results vector_db.search(user_query, 5)for doc in search_results[documents][0]:print(doc"\n")response bot.chat(user_qu…

采用内存局部性分配有什么好处?

内存分配时的局部性分配&#xff08;Locality of Allocation&#xff09;是指将相关的内存对象分配在相邻或相近的内存区域中。这种分配策略在现代计算机系统中具有显著的好处&#xff0c;主要体现在以下几个方面&#xff1a; 1. 提高缓存命中率 现代计算机系统依赖于多级缓存…