@jaypie/constructs 1.1.41 → 1.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,8 +38,8 @@ export interface JaypieLambdaProps {
38
38
  paramsAndSecretsOptions?: {
39
39
  cacheSize?: number;
40
40
  logLevel?: lambda.ParamsAndSecretsLogLevel;
41
- parameterStoreTtl?: number;
42
- secretsManagerTtl?: number;
41
+ parameterStoreTtl?: Duration;
42
+ secretsManagerTtl?: Duration;
43
43
  };
44
44
  profiling?: boolean;
45
45
  profilingGroup?: import("aws-cdk-lib/aws-codeguruprofiler").IProfilingGroup;
@@ -2,4 +2,4 @@ import * as lambda from "aws-cdk-lib/aws-lambda";
2
2
  export interface AddDatadogLayerOptions {
3
3
  datadogApiKeyArn?: string;
4
4
  }
5
- export declare function addDatadogLayer(lambdaFunction: lambda.Function, options?: AddDatadogLayerOptions): boolean;
5
+ export declare function addDatadogLayers(lambdaFunction: lambda.Function, options?: AddDatadogLayerOptions): boolean;
@@ -1,4 +1,4 @@
1
- export declare function envHostname({ component, domain, env, subdomain, }: {
1
+ export declare function envHostname({ component, domain, env, subdomain, }?: {
2
2
  component?: string;
3
3
  domain?: string;
4
4
  env?: string;
@@ -1,9 +1,10 @@
1
- export { addDatadogLayer } from "./addDatadogLayer";
2
- export { addParamsAndSecrets } from "./addParamsAndSecrets";
1
+ export { addDatadogLayers } from "./addDatadogLayers";
3
2
  export { constructEnvName } from "./constructEnvName";
4
3
  export { constructStackName } from "./constructStackName";
5
4
  export { constructTagger } from "./constructTagger";
6
5
  export { envHostname } from "./envHostname";
7
6
  export { isEnv, isProductionEnv, isSandboxEnv } from "./isEnv";
8
7
  export { jaypieLambdaEnv } from "./jaypieLambdaEnv";
8
+ export { resolveDatadogLayers } from "./resolveDatadogLayers";
9
9
  export { resolveHostedZone } from "./resolveHostedZone";
10
+ export { resolveParamsAndSecrets } from "./resolveParamsAndSecrets";
@@ -0,0 +1,7 @@
1
+ import * as lambda from "aws-cdk-lib/aws-lambda";
2
+ import { Construct } from "constructs";
3
+ export interface ResolveDatadogLayerOptions {
4
+ datadogApiKeyArn?: string;
5
+ uniqueId?: string;
6
+ }
7
+ export declare function resolveDatadogLayers(scope: Construct, options?: ResolveDatadogLayerOptions): lambda.ILayerVersion[] | undefined;
@@ -1,6 +1,6 @@
1
1
  import { Construct } from "constructs";
2
2
  import * as route53 from "aws-cdk-lib/aws-route53";
3
- export declare function resolveHostedZone(scope: Construct, { name, zone, }: {
3
+ export declare function resolveHostedZone(scope: Construct, { name, zone, }?: {
4
4
  name?: string;
5
5
  zone?: string | route53.IHostedZone;
6
6
  }): route53.IHostedZone;
@@ -0,0 +1,10 @@
1
+ import { Duration } from "aws-cdk-lib";
2
+ import * as lambda from "aws-cdk-lib/aws-lambda";
3
+ export interface ResolveParamsAndSecretsOptions {
4
+ cacheSize?: number;
5
+ logLevel?: lambda.ParamsAndSecretsLogLevel;
6
+ parameterStoreTtl?: Duration;
7
+ secretsManagerTtl?: Duration;
8
+ }
9
+ export declare const resolveParamsAndSecrets: (paramsAndSecretsOptions?: lambda.ParamsAndSecretsLayerVersion | boolean | ResolveParamsAndSecretsOptions) => lambda.ParamsAndSecretsLayerVersion | undefined;
10
+ export default resolveParamsAndSecrets;
package/dist/esm/index.js CHANGED
@@ -1,14 +1,15 @@
1
1
  import { Construct } from 'constructs';
2
2
  import * as cdk from 'aws-cdk-lib';
3
- import { Stack, Tags, Duration, RemovalPolicy, Fn, CfnOutput, SecretValue } from 'aws-cdk-lib';
3
+ import { Tags, Stack, Duration, RemovalPolicy, Fn, CfnOutput, SecretValue } from 'aws-cdk-lib';
4
4
  import * as acm from 'aws-cdk-lib/aws-certificatemanager';
5
5
  import * as apiGateway from 'aws-cdk-lib/aws-apigateway';
6
6
  import * as route53 from 'aws-cdk-lib/aws-route53';
7
7
  import { HostedZone } from 'aws-cdk-lib/aws-route53';
8
8
  import * as route53Targets from 'aws-cdk-lib/aws-route53-targets';
9
9
  import { CDK as CDK$2, ConfigurationError, mergeDomain, isValidSubdomain, isValidHostname } from '@jaypie/cdk';
10
- import * as lambda from 'aws-cdk-lib/aws-lambda';
11
10
  import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager';
11
+ import { DatadogLambda } from 'datadog-cdk-constructs-v2';
12
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
12
13
  import * as s3 from 'aws-cdk-lib/aws-s3';
13
14
  import * as s3n from 'aws-cdk-lib/aws-s3-notifications';
14
15
  import * as sqs from 'aws-cdk-lib/aws-sqs';
@@ -19,23 +20,14 @@ import * as sso from 'aws-cdk-lib/aws-sso';
19
20
  import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
20
21
  import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
21
22
 
22
- function addDatadogLayer(lambdaFunction, options = {}) {
23
- const { datadogApiKeyArn } = options;
24
- // Resolve the Datadog API key ARN from multiple sources
23
+ function addDatadogLayers(lambdaFunction, options = {}) {
24
+ const datadogApiKeyArn = options?.datadogApiKeyArn;
25
25
  const resolvedDatadogApiKeyArn = datadogApiKeyArn ||
26
26
  process.env.DATADOG_API_KEY_ARN ||
27
27
  process.env.CDK_ENV_DATADOG_API_KEY_ARN;
28
- // Return false if no API key is found
29
28
  if (!resolvedDatadogApiKeyArn) {
30
29
  return false;
31
30
  }
32
- const stack = Stack.of(lambdaFunction);
33
- // Create Datadog Node.js layer
34
- const datadogNodeLayer = lambda.LayerVersion.fromLayerVersionArn(stack, `DatadogNodeLayer-${lambdaFunction.node.id}`, `arn:aws:lambda:${stack.region}:464622532012:layer:Datadog-Node20-x:${CDK$2.DATADOG.LAYER.NODE}`);
35
- // Create Datadog Extension layer
36
- const datadogExtensionLayer = lambda.LayerVersion.fromLayerVersionArn(stack, `DatadogExtensionLayer-${lambdaFunction.node.id}`, `arn:aws:lambda:${stack.region}:464622532012:layer:Datadog-Extension:${CDK$2.DATADOG.LAYER.EXTENSION}`);
37
- // Add layers to the lambda function
38
- lambdaFunction.addLayers(datadogNodeLayer, datadogExtensionLayer);
39
31
  // Define Datadog environment variables
40
32
  const datadogEnvVars = {
41
33
  DD_API_KEY_SECRET_ARN: resolvedDatadogApiKeyArn,
@@ -50,68 +42,21 @@ function addDatadogLayer(lambdaFunction, options = {}) {
50
42
  };
51
43
  // Add environment variables only if they don't already exist
52
44
  Object.entries(datadogEnvVars).forEach(([key, value]) => {
53
- if (lambdaFunction.environment[key] === undefined) {
54
- lambdaFunction.addEnvironment(key, value);
55
- }
45
+ lambdaFunction.addEnvironment(key, value);
56
46
  });
57
- // Grant Datadog API key read permission
58
- const datadogApiKey = secretsmanager.Secret.fromSecretCompleteArn(stack, `DatadogApiKeyGrant-${lambdaFunction.node.id}`, resolvedDatadogApiKeyArn);
59
- datadogApiKey.grantRead(lambdaFunction);
47
+ const datadogApiKeySecret = secretsmanager.Secret.fromSecretNameV2(lambdaFunction.stack, "DatadogApiKey", resolvedDatadogApiKeyArn);
48
+ const datadogLambda = new DatadogLambda(lambdaFunction.stack, "DatadogLambda", {
49
+ apiKeySecret: datadogApiKeySecret, // apiKeySecret auto-grants secret access to the added lambdas
50
+ nodeLayerVersion: CDK$2.DATADOG.LAYER.NODE,
51
+ extensionLayerVersion: CDK$2.DATADOG.LAYER.EXTENSION,
52
+ env: process.env.PROJECT_ENV,
53
+ service: process.env.PROJECT_SERVICE,
54
+ version: process.env.PROJECT_VERSION,
55
+ });
56
+ datadogLambda.addLambdaFunctions([lambdaFunction]);
60
57
  return true;
61
58
  }
62
59
 
63
- function addParamsAndSecrets(lambdaFunction, options = {}) {
64
- const { paramsAndSecrets, paramsAndSecretsOptions } = options;
65
- // Return false if explicitly disabled
66
- if (paramsAndSecrets === false) {
67
- return false;
68
- }
69
- const stack = Stack.of(lambdaFunction);
70
- let resolvedLayer = undefined;
71
- if (paramsAndSecrets instanceof lambda.ParamsAndSecretsLayerVersion) {
72
- // For custom ParamsAndSecretsLayerVersion, we need to extract the ARN
73
- // This is a workaround since ParamsAndSecretsLayerVersion doesn't implement ILayerVersion
74
- const layerArn = `arn:aws:lambda:${stack.region}:017000801446:layer:AWSLambdaParametersAndSecrets:${lambda.ParamsAndSecretsVersions.V1_0_103}`;
75
- resolvedLayer = lambda.LayerVersion.fromLayerVersionArn(stack, `ParamsAndSecretsLayer-${lambdaFunction.node.id}`, layerArn);
76
- // Set environment variables for configuration
77
- if (paramsAndSecretsOptions?.cacheSize) {
78
- lambdaFunction.addEnvironment("PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE", paramsAndSecretsOptions.cacheSize.toString());
79
- }
80
- if (paramsAndSecretsOptions?.logLevel) {
81
- lambdaFunction.addEnvironment("PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL", paramsAndSecretsOptions.logLevel);
82
- }
83
- if (paramsAndSecretsOptions?.parameterStoreTtl) {
84
- lambdaFunction.addEnvironment("PARAMETERS_SECRETS_EXTENSION_PARAMETER_STORE_TTL", paramsAndSecretsOptions.parameterStoreTtl.toString());
85
- }
86
- if (paramsAndSecretsOptions?.secretsManagerTtl) {
87
- lambdaFunction.addEnvironment("PARAMETERS_SECRETS_EXTENSION_SECRETS_MANAGER_TTL", paramsAndSecretsOptions.secretsManagerTtl.toString());
88
- }
89
- }
90
- else {
91
- // Create default ParamsAndSecrets layer using LayerVersion.fromLayerVersionArn
92
- const layerArn = `arn:aws:lambda:${stack.region}:017000801446:layer:AWSLambdaParametersAndSecrets:${lambda.ParamsAndSecretsVersions.V1_0_103}`;
93
- resolvedLayer = lambda.LayerVersion.fromLayerVersionArn(stack, `ParamsAndSecretsLayer-${lambdaFunction.node.id}`, layerArn);
94
- // Set default environment variables
95
- if (paramsAndSecretsOptions?.cacheSize) {
96
- lambdaFunction.addEnvironment("PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE", paramsAndSecretsOptions.cacheSize.toString());
97
- }
98
- const logLevel = paramsAndSecretsOptions?.logLevel || lambda.ParamsAndSecretsLogLevel.WARN;
99
- lambdaFunction.addEnvironment("PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL", logLevel);
100
- if (paramsAndSecretsOptions?.parameterStoreTtl) {
101
- lambdaFunction.addEnvironment("PARAMETERS_SECRETS_EXTENSION_PARAMETER_STORE_TTL", paramsAndSecretsOptions.parameterStoreTtl.toString());
102
- }
103
- if (paramsAndSecretsOptions?.secretsManagerTtl) {
104
- lambdaFunction.addEnvironment("PARAMETERS_SECRETS_EXTENSION_SECRETS_MANAGER_TTL", paramsAndSecretsOptions.secretsManagerTtl.toString());
105
- }
106
- }
107
- // Add the layer to the lambda function
108
- if (resolvedLayer) {
109
- lambdaFunction.addLayers(resolvedLayer);
110
- return true;
111
- }
112
- return false;
113
- }
114
-
115
60
  function constructEnvName(name, opts) {
116
61
  const env = opts?.env ?? process.env.PROJECT_ENV ?? "build";
117
62
  const key = opts?.key ?? process.env.PROJECT_KEY ?? "project";
@@ -180,7 +125,7 @@ function constructTagger(construct, { name } = {}) {
180
125
  return true;
181
126
  }
182
127
 
183
- function envHostname({ component, domain, env, subdomain, }) {
128
+ function envHostname({ component, domain, env, subdomain, } = {}) {
184
129
  const resolvedDomain = domain || process.env.CDK_ENV_DOMAIN || process.env.CDK_ENV_HOSTED_ZONE;
185
130
  if (!resolvedDomain) {
186
131
  throw new ConfigurationError("No hostname `domain` provided. Set CDK_ENV_DOMAIN or CDK_ENV_HOSTED_ZONE to use environment domain");
@@ -270,7 +215,26 @@ function jaypieLambdaEnv(options = {}) {
270
215
  return environment;
271
216
  }
272
217
 
273
- function resolveHostedZone(scope, { name = "HostedZone", zone = process.env.CDK_ENV_HOSTED_ZONE, }) {
218
+ function resolveDatadogLayers(scope, options = {}) {
219
+ const { datadogApiKeyArn, uniqueId } = options;
220
+ let resolvedRegion = Stack.of(scope).region || "us-east-1";
221
+ // Resolve the Datadog API key ARN from multiple sources
222
+ const resolvedDatadogApiKeyArn = datadogApiKeyArn ||
223
+ process.env.DATADOG_API_KEY_ARN ||
224
+ process.env.CDK_ENV_DATADOG_API_KEY_ARN;
225
+ // Return null if no API key is found
226
+ if (!resolvedDatadogApiKeyArn) {
227
+ return undefined;
228
+ }
229
+ const layerIdSuffix = uniqueId || process.env.PROJECT_NONCE || Date.now().toString();
230
+ // Create Datadog Node.js layer
231
+ const datadogNodeLayer = lambda.LayerVersion.fromLayerVersionArn(scope, `DatadogNodeLayer-${layerIdSuffix}`, `arn:aws:lambda:${resolvedRegion}:464622532012:layer:Datadog-Node20-x:${CDK$2.DATADOG.LAYER.NODE}`);
232
+ // Create Datadog Extension layer
233
+ const datadogExtensionLayer = lambda.LayerVersion.fromLayerVersionArn(scope, `DatadogExtensionLayer-${layerIdSuffix}`, `arn:aws:lambda:${resolvedRegion}:464622532012:layer:Datadog-Extension:${CDK$2.DATADOG.LAYER.EXTENSION}`);
234
+ return [datadogNodeLayer, datadogExtensionLayer];
235
+ }
236
+
237
+ function resolveHostedZone(scope, { name = "HostedZone", zone = process.env.CDK_ENV_HOSTED_ZONE, } = {}) {
274
238
  if (!zone) {
275
239
  throw new ConfigurationError("No `zone` provided. Set CDK_ENV_HOSTED_ZONE to use environment zone");
276
240
  }
@@ -282,6 +246,30 @@ function resolveHostedZone(scope, { name = "HostedZone", zone = process.env.CDK_
282
246
  return zone;
283
247
  }
284
248
 
249
+ const resolveParamsAndSecrets = (paramsAndSecretsOptions) => {
250
+ if (paramsAndSecretsOptions === false) {
251
+ return;
252
+ }
253
+ let resolvedParamsAndSecrets;
254
+ if (paramsAndSecretsOptions instanceof lambda.ParamsAndSecretsLayerVersion) {
255
+ resolvedParamsAndSecrets = paramsAndSecretsOptions;
256
+ }
257
+ else {
258
+ if (paramsAndSecretsOptions === true ||
259
+ paramsAndSecretsOptions === undefined) {
260
+ paramsAndSecretsOptions = {};
261
+ }
262
+ resolvedParamsAndSecrets = lambda.ParamsAndSecretsLayerVersion.fromVersion(lambda.ParamsAndSecretsVersions.V1_0_103, {
263
+ cacheSize: paramsAndSecretsOptions?.cacheSize,
264
+ logLevel: paramsAndSecretsOptions?.logLevel ||
265
+ lambda.ParamsAndSecretsLogLevel.WARN,
266
+ parameterStoreTtl: paramsAndSecretsOptions?.parameterStoreTtl,
267
+ secretsManagerTtl: paramsAndSecretsOptions?.secretsManagerTtl,
268
+ });
269
+ }
270
+ return resolvedParamsAndSecrets;
271
+ };
272
+
285
273
  class JaypieApiGateway extends Construct {
286
274
  constructor(scope, id, props) {
287
275
  super(scope, id);
@@ -479,6 +467,10 @@ class JaypieLambda extends Construct {
479
467
  }
480
468
  return acc;
481
469
  }, {});
470
+ // Add ParamsAndSecrets layer if configured
471
+ const resolvedParamsAndSecrets = paramsAndSecrets
472
+ ? resolveParamsAndSecrets(paramsAndSecretsOptions)
473
+ : undefined;
482
474
  // Create Lambda Function
483
475
  this._lambda = new lambda.Function(this, "Function", {
484
476
  allowAllOutbound,
@@ -506,6 +498,7 @@ class JaypieLambda extends Construct {
506
498
  logRetentionRetryOptions,
507
499
  maxEventAge,
508
500
  memorySize,
501
+ paramsAndSecrets: resolvedParamsAndSecrets,
509
502
  profiling,
510
503
  profilingGroup,
511
504
  reservedConcurrentExecutions,
@@ -526,13 +519,7 @@ class JaypieLambda extends Construct {
526
519
  }
527
520
  : undefined,
528
521
  });
529
- // Add ParamsAndSecrets layer if configured
530
- addParamsAndSecrets(this._lambda, {
531
- paramsAndSecrets,
532
- paramsAndSecretsOptions,
533
- });
534
- // Add Datadog layers and environment variables if configured
535
- addDatadogLayer(this._lambda, { datadogApiKeyArn });
522
+ addDatadogLayers(this._lambda, { datadogApiKeyArn });
536
523
  // Grant secret read permissions
537
524
  Object.values(envSecrets).forEach((secret) => {
538
525
  secret.grantRead(this._lambda);
@@ -1834,5 +1821,5 @@ class JaypieWebDeploymentBucket extends Construct {
1834
1821
  }
1835
1822
  }
1836
1823
 
1837
- export { JaypieApiGateway, JaypieAppStack, JaypieBucketQueuedLambda, JaypieDatadogSecret, JaypieEnvSecret, JaypieExpressLambda, JaypieHostedZone, JaypieInfrastructureStack, JaypieLambda, JaypieMongoDbSecret, JaypieOpenAiSecret, JaypieQueuedLambda, JaypieSsoGroups, JaypieStack, JaypieTraceSigningKeySecret, JaypieWebDeploymentBucket, PermissionSetType, addDatadogLayer, addParamsAndSecrets, constructEnvName, constructStackName, constructTagger, envHostname, isEnv, isProductionEnv, isSandboxEnv, jaypieLambdaEnv, resolveHostedZone };
1824
+ export { JaypieApiGateway, JaypieAppStack, JaypieBucketQueuedLambda, JaypieDatadogSecret, JaypieEnvSecret, JaypieExpressLambda, JaypieHostedZone, JaypieInfrastructureStack, JaypieLambda, JaypieMongoDbSecret, JaypieOpenAiSecret, JaypieQueuedLambda, JaypieSsoGroups, JaypieStack, JaypieTraceSigningKeySecret, JaypieWebDeploymentBucket, PermissionSetType, addDatadogLayers, constructEnvName, constructStackName, constructTagger, envHostname, isEnv, isProductionEnv, isSandboxEnv, jaypieLambdaEnv, resolveDatadogLayers, resolveHostedZone, resolveParamsAndSecrets };
1838
1825
  //# sourceMappingURL=index.js.map