Skip to content

Commit 8382e99

Browse files
committed
feat(layers): add regular and arm64 flavours
1 parent ff8e270 commit 8382e99

File tree

5 files changed

+128
-23
lines changed

5 files changed

+128
-23
lines changed

layer/app.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
app = cdk.App()
99

1010
POWERTOOLS_VERSION: str = app.node.try_get_context("version")
11-
SSM_PARAM_LAYER_ARN: str = "/layers/powertools-layer-arn"
11+
SSM_PARAM_LAYER_ARN: str = "/layers/powertools-layer-v2-arn"
12+
SSM_PARAM_ARM64_LAYER_ARN: str = "/layers/powertools-layer-v2-arm64-arn"
1213

1314
if not POWERTOOLS_VERSION:
1415
raise ValueError(
@@ -21,13 +22,15 @@
2122
"LayerStack",
2223
powertools_version=POWERTOOLS_VERSION,
2324
ssm_paramter_layer_arn=SSM_PARAM_LAYER_ARN,
25+
ssm_parameter_arm64_layer_arn=SSM_PARAM_ARM64_LAYER_ARN,
2426
)
2527

2628
CanaryStack(
2729
app,
2830
"CanaryStack",
2931
powertools_version=POWERTOOLS_VERSION,
3032
ssm_paramter_layer_arn=SSM_PARAM_LAYER_ARN,
33+
ssm_parameter_arm64_layer_arn=SSM_PARAM_ARM64_LAYER_ARN,
3134
)
3235

3336
app.synth()

layer/layer/canary/app.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
import json
33
import os
4+
import platform
45
from importlib.metadata import version
56

67
import boto3
@@ -66,7 +67,7 @@ def verify_powertools_version() -> None:
6667
current_version = version("aws_lambda_powertools")
6768
if powertools_version != current_version:
6869
raise ValueError(
69-
f'Expected powertoosl version is "{powertools_version}", but layer contains version "{current_version}"'
70+
f'Expected powertools version is "{powertools_version}", but layer contains version "{current_version}"'
7071
)
7172
logger.info(f"Current Powertools version is: {current_version}")
7273

@@ -80,6 +81,8 @@ def send_notification():
8081
"Not sending notification to event bus, because this is not the PROD stage"
8182
)
8283
return
84+
85+
architecture = platform.uname()[4]
8386
event = {
8487
"Time": datetime.datetime.now(),
8588
"Source": "powertools.layer.canary",
@@ -90,6 +93,7 @@ def send_notification():
9093
"version": powertools_version,
9194
"region": os.environ["AWS_REGION"],
9295
"layerArn": layer_arn,
96+
"architecture": architecture,
9397
}
9498
),
9599
}

layer/layer/canary_stack.py

Lines changed: 69 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
from aws_cdk import CfnParameter, CustomResource, Duration, Stack
44
from aws_cdk.aws_iam import Effect, ManagedPolicy, PolicyStatement, Role, ServicePrincipal
5-
from aws_cdk.aws_lambda import Code, Function, LayerVersion, Runtime
5+
from aws_cdk.aws_lambda import Architecture, Code, Function, LayerVersion, Runtime
66
from aws_cdk.aws_logs import RetentionDays
77
from aws_cdk.aws_ssm import StringParameter
88
from aws_cdk.custom_resources import Provider
99
from constructs import Construct
1010

11+
VERSION_TRACKING_EVENT_BUS_ARN: str = (
12+
"arn:aws:events:eu-central-1:027876851704:event-bus/VersionTrackingEventBus"
13+
)
14+
1115

1216
class CanaryStack(Stack):
1317
def __init__(
@@ -16,29 +20,70 @@ def __init__(
1620
construct_id: str,
1721
powertools_version: str,
1822
ssm_paramter_layer_arn: str,
23+
ssm_parameter_arm64_layer_arn: str,
1924
**kwargs,
2025
) -> None:
2126
super().__init__(scope, construct_id, **kwargs)
2227

23-
VERSION_TRACKING_EVENT_BUS_ARN: str = (
24-
"arn:aws:events:eu-central-1:027876851704:event-bus/VersionTrackingEventBus"
25-
)
26-
2728
layer_arn = StringParameter.from_string_parameter_attributes(
2829
self, "LayerVersionArnParam", parameter_name=ssm_paramter_layer_arn
2930
).string_value
31+
Canary(
32+
self,
33+
"Canary-x86-64",
34+
layer_arn=layer_arn,
35+
powertools_version=powertools_version,
36+
architecture=Architecture.X86_64(),
37+
)
3038

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
39+
layer_arm64_arn = StringParameter.from_string_parameter_attributes(
40+
self,
41+
"LayerArm64VersionArnParam",
42+
parameter_name=ssm_parameter_arm64_layer_arn,
43+
).string_value
44+
Canary(
45+
self,
46+
"Canary-arm64",
47+
layer_arn=layer_arm64_arn,
48+
powertools_version=powertools_version,
49+
architecture=Architecture.ARM_64(),
50+
)
3351

34-
execution_role = Role(self, "LambdaExecutionRole", assumed_by=ServicePrincipal("lambda.amazonaws.com"))
52+
53+
class Canary(Construct):
54+
def __init__(
55+
self,
56+
scope: Construct,
57+
construct_id: str,
58+
layer_arn: str,
59+
powertools_version: str,
60+
architecture: Architecture,
61+
):
62+
super().__init__(scope, construct_id)
63+
64+
layer = LayerVersion.from_layer_version_arn(
65+
self, "PowertoolsLayer", layer_version_arn=layer_arn
66+
)
67+
deploy_stage = CfnParameter(
68+
self, "DeployStage", description="Deployment stage for canary"
69+
).value_as_string
70+
71+
execution_role = Role(
72+
self,
73+
"LambdaExecutionRole",
74+
assumed_by=ServicePrincipal("lambda.amazonaws.com"),
75+
)
3576

3677
execution_role.add_managed_policy(
37-
ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaBasicExecutionRole")
78+
ManagedPolicy.from_aws_managed_policy_name(
79+
"service-role/AWSLambdaBasicExecutionRole"
80+
)
3881
)
3982

4083
execution_role.add_to_policy(
41-
PolicyStatement(effect=Effect.ALLOW, actions=["lambda:GetFunction"], resources=["*"])
84+
PolicyStatement(
85+
effect=Effect.ALLOW, actions=["lambda:GetFunction"], resources=["*"]
86+
)
4287
)
4388

4489
canary_lambda = Function(
@@ -49,7 +94,8 @@ def __init__(
4994
layers=[layer],
5095
memory_size=512,
5196
timeout=Duration.seconds(10),
52-
runtime=Runtime.PYTHON_3_9,
97+
runtime=Runtime.PYTHON_3_9(),
98+
architecture=architecture,
5399
log_retention=RetentionDays.ONE_MONTH,
54100
role=execution_role,
55101
environment={
@@ -62,13 +108,22 @@ def __init__(
62108

63109
canary_lambda.add_to_role_policy(
64110
PolicyStatement(
65-
effect=Effect.ALLOW, actions=["events:PutEvents"], resources=[VERSION_TRACKING_EVENT_BUS_ARN]
111+
effect=Effect.ALLOW,
112+
actions=["events:PutEvents"],
113+
resources=[VERSION_TRACKING_EVENT_BUS_ARN],
66114
)
67115
)
68116

69117
# custom resource provider configuration
70118
provider = Provider(
71-
self, "CanaryCustomResource", on_event_handler=canary_lambda, log_retention=RetentionDays.ONE_MONTH
119+
self,
120+
"CanaryCustomResource",
121+
on_event_handler=canary_lambda,
122+
log_retention=RetentionDays.ONE_MONTH,
72123
)
73124
# force to recreate resource on each deployment with randomized name
74-
CustomResource(self, f"CanaryTrigger-{str(uuid.uuid4())[0:7]}", service_token=provider.service_token)
125+
CustomResource(
126+
self,
127+
f"CanaryTrigger-{str(uuid.uuid4())[0:7]}",
128+
service_token=provider.service_token,
129+
)

layer/layer/layer_stack.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,38 @@
11
from aws_cdk import CfnOutput, RemovalPolicy, Stack
2-
from aws_cdk.aws_lambda import CfnLayerVersionPermission
2+
from aws_cdk.aws_lambda import Architecture, CfnLayerVersionPermission
33
from aws_cdk.aws_ssm import StringParameter
44
from cdk_lambda_powertools_python_layer import LambdaPowertoolsLayer
55
from constructs import Construct
66

77

88
class LayerStack(Stack):
99
def __init__(
10-
self, scope: Construct, construct_id: str, powertools_version: str, ssm_paramter_layer_arn: str, **kwargs
10+
self,
11+
scope: Construct,
12+
construct_id: str,
13+
powertools_version: str,
14+
ssm_paramter_layer_arn: str,
15+
ssm_parameter_arm64_layer_arn: str,
16+
**kwargs
1117
) -> None:
1218
super().__init__(scope, construct_id, **kwargs)
1319

1420
layer = LambdaPowertoolsLayer(
15-
self, "Layer", layer_version_name="AWSLambdaPowertoolsPython", version=powertools_version
21+
self,
22+
"Layer",
23+
layer_version_name="AWSLambdaPowertoolsPythonV2",
24+
version=powertools_version,
25+
include_extras=True,
26+
compatible_architectures=[Architecture.X86_64()],
27+
)
28+
29+
layer_arm64 = LambdaPowertoolsLayer(
30+
self,
31+
"Layer-ARM64",
32+
layer_version_name="AWSLambdaPowertoolsPythonV2-Arm64",
33+
version=powertools_version,
34+
include_extras=True,
35+
compatible_architectures=[Architecture.ARM_64()],
1636
)
1737

1838
layer_permission = CfnLayerVersionPermission(
@@ -23,9 +43,32 @@ def __init__(
2343
principal="*",
2444
)
2545

46+
layer_permission_arm64 = CfnLayerVersionPermission(
47+
self,
48+
"PublicLayerAccessArm64",
49+
action="lambda:GetLayerVersion",
50+
layer_version_arn=layer_arm64.layer_version_arn,
51+
principal="*",
52+
)
53+
2654
layer_permission.apply_removal_policy(RemovalPolicy.RETAIN)
55+
layer_permission_arm64.apply_removal_policy(RemovalPolicy.RETAIN)
56+
2757
layer.apply_removal_policy(RemovalPolicy.RETAIN)
58+
layer_arm64.apply_removal_policy(RemovalPolicy.RETAIN)
2859

29-
StringParameter(self, "VersionArn", parameter_name=ssm_paramter_layer_arn, string_value=layer.layer_version_arn)
60+
StringParameter(
61+
self,
62+
"VersionArn",
63+
parameter_name=ssm_paramter_layer_arn,
64+
string_value=layer.layer_version_arn,
65+
)
66+
StringParameter(
67+
self,
68+
"Arm64VersionArn",
69+
parameter_name=ssm_parameter_arm64_layer_arn,
70+
string_value=layer_arm64.layer_version_arn,
71+
)
3072

3173
CfnOutput(self, "LatestLayerArn", value=layer.layer_version_arn)
74+
CfnOutput(self, "LatestArm64LayerArn", value=layer_arm64.layer_version_arn)

layer/pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
[tool.poetry]
22
name = "aws-lambda-powertools-python-layer"
3-
version = "0.1.0"
3+
version = "1.1.0"
44
description = "AWS Lambda Powertools for Python Lambda Layers"
55
authors = ["DevAx <aws-devax-open-source@amazon.com>"]
66
license = "MIT"
77

88
[tool.poetry.dependencies]
99
python = "^3.9"
10-
cdk-lambda-powertools-python-layer = "^2.0.49"
11-
aws-cdk-lib = "^2.35.0"
10+
cdk-lambda-powertools-python-layer = "^3.0.0"
11+
aws-cdk-lib = "^2.42.0"
1212

1313
[tool.poetry.dev-dependencies]
1414
pytest = "^7.1.2"

0 commit comments

Comments
 (0)