11import datetime
22import json
33import os
4+ import platform
45from importlib .metadata import version
56
67import boto3
8+ from pydantic import EmailStr
79
810from aws_lambda_powertools import Logger , Metrics , Tracer
11+ from aws_lambda_powertools .utilities .parser import BaseModel , envelopes , event_parser
12+ from aws_lambda_powertools .utilities .typing import LambdaContext
13+ from aws_lambda_powertools .utilities .validation import validator
914
1015logger = Logger (service = "version-track" )
11- tracer = Tracer ()
16+ tracer = Tracer () # this checks for aws-xray-sdk presence
1217metrics = Metrics (namespace = "powertools-layer-canary" , service = "PowertoolsLayerCanary" )
1318
1419layer_arn = os .getenv ("POWERTOOLS_LAYER_ARN" )
1722event_bus_arn = os .getenv ("VERSION_TRACKING_EVENT_BUS_ARN" )
1823
1924
25+ # Model to check parser imports correctly, tests for pydantic and email-validator
26+ class OrderItem (BaseModel ):
27+ order_id : int
28+ quantity : int
29+ description : str
30+ email : EmailStr
31+
32+
33+ # Tests for jmespath presence
34+ @event_parser (model = OrderItem , envelope = envelopes .EventBridgeEnvelope )
35+ def envelope_handler (event : OrderItem , context : LambdaContext ):
36+ assert event .order_id != 1
37+
38+
39+ # Tests for fastjsonschema presence
40+ @validator (inbound_schema = {}, envelope = "detail" )
41+ def validator_handler (event , context : LambdaContext ):
42+ pass
43+
44+
2045def handler (event ):
2146 logger .info ("Running checks" )
2247 check_envs ()
@@ -42,9 +67,7 @@ def on_create(event):
4267
4368
4469def check_envs ():
45- logger .info (
46- 'Checking required envs ["POWERTOOLS_LAYER_ARN", "AWS_REGION", "STAGE"]'
47- )
70+ logger .info ('Checking required envs ["POWERTOOLS_LAYER_ARN", "AWS_REGION", "STAGE"]' )
4871 if not layer_arn :
4972 raise ValueError ("POWERTOOLS_LAYER_ARN is not set. Aborting..." )
5073 if not powertools_version :
@@ -66,20 +89,19 @@ def verify_powertools_version() -> None:
6689 current_version = version ("aws_lambda_powertools" )
6790 if powertools_version != current_version :
6891 raise ValueError (
69- f'Expected powertoosl version is "{ powertools_version } ", but layer contains version "{ current_version } "'
92+ f'Expected Powertools version is "{ powertools_version } ", but layer contains version "{ current_version } "'
7093 )
71- logger .info (f"Current Powertools version is: { current_version } " )
94+ logger .info (f"Current Powertools version is: { current_version } [ { _get_architecture () } ] " )
7295
7396
7497def send_notification ():
7598 """
7699 sends an event to version tracking event bridge
77100 """
78101 if stage != "PROD" :
79- logger .info (
80- "Not sending notification to event bus, because this is not the PROD stage"
81- )
102+ logger .info ("Not sending notification to event bus, because this is not the PROD stage" )
82103 return
104+
83105 event = {
84106 "Time" : datetime .datetime .now (),
85107 "Source" : "powertools.layer.canary" ,
@@ -90,6 +112,7 @@ def send_notification():
90112 "version" : powertools_version ,
91113 "region" : os .environ ["AWS_REGION" ],
92114 "layerArn" : layer_arn ,
115+ "architecture" : _get_architecture (),
93116 }
94117 ),
95118 }
@@ -102,3 +125,8 @@ def send_notification():
102125 if resp ["FailedEntryCount" ] != 0 :
103126 logger .error (resp )
104127 raise ValueError ("Failed to send deployment notification to version tracking" )
128+
129+
130+ def _get_architecture () -> str :
131+ """Returns aarch64, x86_64"""
132+ return platform .uname ()[4 ]
0 commit comments