Skip to content

Commit 613b7de

Browse files
authored
feat: Set compatible runtime and architecture of layers (#130)
This should help avoid accidental uses of the layer with the wrong Lambda. It will also make the layer easier to spot in the UI.
1 parent fe85b71 commit 613b7de

File tree

3 files changed

+389
-106
lines changed

3 files changed

+389
-106
lines changed

src/base.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,15 @@ export class BaseDependencyPackager extends Construct implements iam.IGrantable,
130130
private readonly provider: lambda.Function;
131131
private readonly targetDirectory: string;
132132
private readonly type: DependencyPackagerType;
133+
private readonly runtime: lambda.Runtime;
133134
private readonly architecture: lambda.Architecture;
134135

135136
constructor(scope: Construct, id: string, readonly internalProps: InternalBaseDependencyPackagerProps) {
136137
super(scope, id);
137138

138-
const runtime = internalProps.props?.runtime ?? internalProps.defaultRuntime;
139-
if (runtime.family != internalProps.runtimeFamily) {
140-
throw new Error(`PythonDependencyPackager requires python runtime, got ${runtime.family}`);
139+
this.runtime = internalProps.props?.runtime ?? internalProps.defaultRuntime;
140+
if (this.runtime.family != internalProps.runtimeFamily) {
141+
throw new Error(`PythonDependencyPackager requires python runtime, got ${this.runtime.family}`);
141142
}
142143

143144
this.packagesBucket = new s3.Bucket(this, 'Bucket', {
@@ -163,7 +164,7 @@ export class BaseDependencyPackager extends Construct implements iam.IGrantable,
163164
);
164165

165166
this.project = new codebuild.Project(this, 'Packager', {
166-
description: `Lambda dependency packager for ${runtime} in ${Stack.of(this).stackName}`,
167+
description: `Lambda dependency packager for ${this.runtime} in ${Stack.of(this).stackName}`,
167168
vpc: internalProps.props?.vpc,
168169
subnetSelection: internalProps.props?.subnetSelection,
169170
environment: {
@@ -192,7 +193,7 @@ export class BaseDependencyPackager extends Construct implements iam.IGrantable,
192193
this.grantPrincipal = this.project.grantPrincipal;
193194

194195
this.provider = new PackageCodebuildFunction(this, 'Package Handler', {
195-
description: `Turbo layer packager for ${runtime} using CodeBuild`,
196+
description: `Turbo layer packager for ${this.runtime} using CodeBuild`,
196197
initialPolicy: [
197198
new iam.PolicyStatement({
198199
actions: ['codebuild:StartBuild'],
@@ -206,8 +207,8 @@ export class BaseDependencyPackager extends Construct implements iam.IGrantable,
206207
this.packagesBucket.grantDelete(this.provider);
207208
} else if (this.type == DependencyPackagerType.LAMBDA) {
208209
const lambdaProps = {
209-
description: `Turbo layer packager for ${runtime}`,
210-
runtime: runtime,
210+
description: `Turbo layer packager for ${this.runtime}`,
211+
runtime: this.runtime,
211212
timeout: Duration.minutes(15),
212213
memorySize: 1024,
213214
ephemeralStorageSize: Size.gibibytes(10),
@@ -218,19 +219,19 @@ export class BaseDependencyPackager extends Construct implements iam.IGrantable,
218219
// TODO for CodeArtifact login -- layers: [new lambda_layer_awscli.AwsCliLayer(this, 'AWS CLI Layer')],
219220
};
220221

221-
if (runtime.family == lambda.RuntimeFamily.PYTHON) {
222+
if (this.runtime.family == lambda.RuntimeFamily.PYTHON) {
222223
this.provider = new PackagePythonFunction(this, 'Packager', lambdaProps);
223-
} else if (runtime.family == lambda.RuntimeFamily.NODEJS) {
224+
} else if (this.runtime.family == lambda.RuntimeFamily.NODEJS) {
224225
this.provider = new PackageNodejsFunction(this, 'Packager', lambdaProps);
225226
// we can't set the runtime from here, so we have to manually override it.
226227
// projen puts `...props` before its own `runtime` setting and so its default `runtime` always wins.
227228
// https://github.com/projen/projen/blob/564341a55309e06939c86248bc76cabc590fd835/src/awscdk/lambda-function.ts#L253-L256
228229
const func = this.provider.node.defaultChild as lambda.CfnFunction;
229-
func.runtime = runtime.name;
230-
} else if (runtime.family == lambda.RuntimeFamily.RUBY) {
230+
func.runtime = this.runtime.name;
231+
} else if (this.runtime.family == lambda.RuntimeFamily.RUBY) {
231232
this.provider = new PackageRubyFunction(this, 'Packager', lambdaProps);
232233
} else {
233-
throw new Error(`Runtime doesn't support Lambda packager: ${runtime}`);
234+
throw new Error(`Runtime doesn't support Lambda packager: ${this.runtime}`);
234235
}
235236
this.connections = internalProps.props?.vpc ? this.provider.connections : new ec2.Connections();
236237
this.grantPrincipal = this.provider.grantPrincipal;
@@ -270,6 +271,8 @@ export class BaseDependencyPackager extends Construct implements iam.IGrantable,
270271
codeBuildRuntimeInstallCommands: this.internalProps.codeBuildRuntimeInstallCommands,
271272
commands: commands,
272273
targetDirectory: this.targetDirectory,
274+
runtime: this.runtime,
275+
architecture: this.architecture,
273276
}).layer;
274277
}
275278

@@ -306,6 +309,8 @@ interface LambdaDependencyLayerProps {
306309
readonly preinstallCommands: string[];
307310
readonly commands: string[];
308311
readonly targetDirectory: string;
312+
readonly runtime: lambda.Runtime;
313+
readonly architecture: lambda.Architecture;
309314
}
310315

311316
class LambdaDependencyLayer extends Construct {
@@ -353,6 +358,8 @@ class LambdaDependencyLayer extends Construct {
353358
this.layer = new lambda.LayerVersion(this, 'Layer', {
354359
description: `Automatically generated by turbo layers for ${asset}`,
355360
code: lambda.Code.fromBucket(props.packagesBucket, cr.ref),
361+
compatibleRuntimes: [props.runtime],
362+
compatibleArchitectures: [props.architecture],
356363
});
357364
}
358365
}

test/default.integ.snapshot/Turbo-Layer-Test.assets.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,15 +235,15 @@
235235
}
236236
}
237237
},
238-
"7c43bb9edc548982711188852801fa895f32e6b62602fad42b583535e3ca78df": {
238+
"8b844d42061b7dd7e46eb3b329d857158ab25ebb42fba2f7e08c7c0e539b618c": {
239239
"source": {
240240
"path": "Turbo-Layer-Test.template.json",
241241
"packaging": "file"
242242
},
243243
"destinations": {
244244
"current_account-current_region": {
245245
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
246-
"objectKey": "7c43bb9edc548982711188852801fa895f32e6b62602fad42b583535e3ca78df.json",
246+
"objectKey": "8b844d42061b7dd7e46eb3b329d857158ab25ebb42fba2f7e08c7c0e539b618c.json",
247247
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
248248
}
249249
}

0 commit comments

Comments
 (0)