文章目錄
- 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
練習producer
和consumer
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)
-
創建
LambdaIntegration
將API
和lambda
進行綁定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
練習producer
和consumer
2.1. 代碼鏈接
api-eventbridge-lambda的代碼鏈接
這里主要練習使用eventbridge
,進行producer
和consumer
的練習。
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 Eventeventbridge_event = {'Time': datetime.datetime.now(),'Source': 'com.mycompany.myapp','Detail': request_body,'DetailType': 'service_status'}logger.info(eventbridge_event)# Send event to EventBridgeresponse = eventbridge_client.put_events(Entries=[eventbridge_event])logger.info(response)# Returns success reponse to API Gatewayreturn {"statusCode": 200,"body": json.dumps({"result": "from Producer"}),}
這里,使用了
boto3
這個python package
,AWS ?Boto3? 是亞馬遜云服務(AWS
)官方提供的Python SDK
,主要用于通過代碼與AWS
服務進行交互和管理。這里使用boto3
向eventbridge
進行putEvents
。 -
consumer1
和consumer2
## 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))
consumer1
和consumer2
類似,就是接受到了eventbridge
的event
之后,進行log
輸出。def lambda_handler(event, context):logger.info(event)return {"statusCode": 200,"body": json.dumps({"result": "testing..."}),}
-
consumer3
使用kinesisfirehose
對event
進行接受,并保存到S3 bucket
上## Approved Consumer3## Create S3 bucket for KinesisFirehose destinationingest_bucket = s3.Bucket(self, 'test-ngest-bucket')# Create a Role for KinesisFirehosefirehose_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
API
的producer
2.4. 對部署進行測試
- 對
API
進行測試調用
返回了正常的結果。這里,需要對請求正文request body
一定要設定參數這里設置如下。
使用{"item1":"123","item2":"234"}
API
調用,之后啟動producer
的lamdba
,向eventbridge
進行putEvents
。
- 對
consumer1
和consumer2
進行確認
- 對
consumer3
進行確認
這里主要是對S3 bucket
進行確認。可以看到,
producer
->event
->eventbridge
->consumer3
->kinesis firehose
->S3 bucket
最后cdk destroy
。