|
| 1 | +import uuid |
| 2 | + |
| 3 | +from aws_cdk import CfnParameter, CustomResource, Duration, Stack |
| 4 | +from aws_cdk.aws_iam import Effect, ManagedPolicy, PolicyStatement, Role, ServicePrincipal |
| 5 | +from aws_cdk.aws_lambda import Code, Function, LayerVersion, Runtime |
| 6 | +from aws_cdk.aws_logs import RetentionDays |
| 7 | +from aws_cdk.aws_ssm import StringParameter |
| 8 | +from aws_cdk.custom_resources import Provider |
| 9 | +from constructs import Construct |
| 10 | + |
| 11 | + |
| 12 | +class CanaryStack(Stack): |
| 13 | + def __init__( |
| 14 | + self, |
| 15 | + scope: Construct, |
| 16 | + construct_id: str, |
| 17 | + powertools_version: str, |
| 18 | + ssm_paramter_layer_arn: str, |
| 19 | + **kwargs, |
| 20 | + ) -> None: |
| 21 | + super().__init__(scope, construct_id, **kwargs) |
| 22 | + |
| 23 | + VERSION_TRACKING_EVENT_BUS_ARN: str = ( |
| 24 | + "arn:aws:events:eu-central-1:027876851704:event-bus/VersionTrackingEventBus" |
| 25 | + ) |
| 26 | + |
| 27 | + layer_arn = StringParameter.from_string_parameter_attributes( |
| 28 | + self, "LayerVersionArnParam", parameter_name=ssm_paramter_layer_arn |
| 29 | + ).string_value |
| 30 | + |
| 31 | + layer = LayerVersion.from_layer_version_arn(self, "PowertoolsLayer", layer_version_arn=layer_arn) |
| 32 | + deploy_stage = CfnParameter(self, "DeployStage", description="Deployment stage for canary").value_as_string |
| 33 | + |
| 34 | + execution_role = Role(self, "LambdaExecutionRole", assumed_by=ServicePrincipal("lambda.amazonaws.com")) |
| 35 | + |
| 36 | + execution_role.add_managed_policy( |
| 37 | + ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaBasicExecutionRole") |
| 38 | + ) |
| 39 | + |
| 40 | + execution_role.add_to_policy( |
| 41 | + PolicyStatement(effect=Effect.ALLOW, actions=["lambda:GetFunction"], resources=["*"]) |
| 42 | + ) |
| 43 | + |
| 44 | + canary_lambda = Function( |
| 45 | + self, |
| 46 | + "CanaryLambdaFunction", |
| 47 | + function_name="CanaryLambdaFunction", |
| 48 | + code=Code.from_asset("layer/canary"), |
| 49 | + handler="app.on_event", |
| 50 | + layers=[layer], |
| 51 | + memory_size=512, |
| 52 | + timeout=Duration.seconds(10), |
| 53 | + runtime=Runtime.PYTHON_3_9, |
| 54 | + log_retention=RetentionDays.ONE_MONTH, |
| 55 | + role=execution_role, |
| 56 | + environment={ |
| 57 | + "POWERTOOLS_VERSION": powertools_version, |
| 58 | + "POWERTOOLS_LAYER_ARN": layer_arn, |
| 59 | + "VERSION_TRACKING_EVENT_BUS_ARN": VERSION_TRACKING_EVENT_BUS_ARN, |
| 60 | + "LAYER_PIPELINE_STAGE": deploy_stage, |
| 61 | + }, |
| 62 | + ) |
| 63 | + |
| 64 | + canary_lambda.add_to_role_policy( |
| 65 | + PolicyStatement( |
| 66 | + effect=Effect.ALLOW, actions=["events:PutEvents"], resources=[VERSION_TRACKING_EVENT_BUS_ARN] |
| 67 | + ) |
| 68 | + ) |
| 69 | + |
| 70 | + # custom resource provider configuration |
| 71 | + provider = Provider( |
| 72 | + self, "CanaryCustomResource", on_event_handler=canary_lambda, log_retention=RetentionDays.ONE_MONTH |
| 73 | + ) |
| 74 | + # force to recreate resource on each deployment with randomized name |
| 75 | + CustomResource(self, f"CanaryTrigger-{str(uuid.uuid4())[0:7]}", service_token=provider.service_token) |
0 commit comments