@gradientedge/cdk-utils 8.83.0 → 8.85.0
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.
- package/dist/src/lib/construct/api-to-eventbridge-target/main.d.ts +1 -0
- package/dist/src/lib/construct/api-to-eventbridge-target/main.js +8 -5
- package/dist/src/lib/construct/index.d.ts +1 -0
- package/dist/src/lib/construct/index.js +1 -0
- package/dist/src/lib/construct/lambda-with-iam-access/index.d.ts +2 -0
- package/dist/src/lib/construct/lambda-with-iam-access/index.js +18 -0
- package/dist/src/lib/construct/lambda-with-iam-access/main.d.ts +78 -0
- package/dist/src/lib/construct/lambda-with-iam-access/main.js +160 -0
- package/dist/src/lib/construct/lambda-with-iam-access/types.d.ts +15 -0
- package/dist/src/lib/construct/lambda-with-iam-access/types.js +2 -0
- package/dist/src/lib/helper/api-to-eventbridge-target-rest-api.d.ts +2 -0
- package/dist/src/lib/helper/api-to-eventbridge-target-rest-api.js +1 -0
- package/dist/src/lib/types/aws/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/lib/construct/api-to-eventbridge-target/main.ts +13 -6
- package/src/lib/construct/index.ts +1 -0
- package/src/lib/construct/lambda-with-iam-access/index.ts +2 -0
- package/src/lib/construct/lambda-with-iam-access/main.ts +166 -0
- package/src/lib/construct/lambda-with-iam-access/types.ts +16 -0
- package/src/lib/helper/api-to-eventbridge-target-rest-api.ts +2 -0
- package/src/lib/types/aws/index.ts +1 -0
|
@@ -105,6 +105,7 @@ export declare class ApiToEventBridgeTarget extends CommonConstruct {
|
|
|
105
105
|
* @protected
|
|
106
106
|
*/
|
|
107
107
|
protected createApiToEventBridgeTargetMethodErrorResponse(): void;
|
|
108
|
+
protected createApiToEventBridgeTargetRestApiLogGroup(): void;
|
|
108
109
|
/**
|
|
109
110
|
* @summary Method to create rest restApi for Api
|
|
110
111
|
* @protected
|
|
@@ -90,6 +90,7 @@ class ApiToEventBridgeTarget extends common_1.CommonConstruct {
|
|
|
90
90
|
this.createApiToEventBridgeTargetIntegrationResponse();
|
|
91
91
|
this.createApiToEventBridgeTargetIntegrationErrorResponse();
|
|
92
92
|
this.createApiToEventBridgeTargetIntegration();
|
|
93
|
+
this.createApiToEventBridgeTargetRestApiLogGroup();
|
|
93
94
|
this.createApiToEventBridgeTargetRestApi();
|
|
94
95
|
this.createApiToEventBridgeTargetResource();
|
|
95
96
|
this.createApiToEventBridgeTargetResponseModel();
|
|
@@ -339,6 +340,12 @@ class ApiToEventBridgeTarget extends common_1.CommonConstruct {
|
|
|
339
340
|
...this.props.api.methodErrorResponse,
|
|
340
341
|
};
|
|
341
342
|
}
|
|
343
|
+
createApiToEventBridgeTargetRestApiLogGroup() {
|
|
344
|
+
this.apiToEventBridgeTargetRestApi.accessLogGroup = this.logManager.createLogGroup(`${this.id}-rest-api-access-log`, this, {
|
|
345
|
+
logGroupName: `/custom/api/${this.id}-rest-api-access`,
|
|
346
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
342
349
|
/**
|
|
343
350
|
* @summary Method to create rest restApi for Api
|
|
344
351
|
* @protected
|
|
@@ -348,10 +355,6 @@ class ApiToEventBridgeTarget extends common_1.CommonConstruct {
|
|
|
348
355
|
this.apiToEventBridgeTargetRestApi.api = apig.RestApi.fromRestApiId(this, `${this.id}-rest-api`, cdk.Fn.importValue(this.props.api.importedRestApiRef));
|
|
349
356
|
return;
|
|
350
357
|
}
|
|
351
|
-
const accessLogGroup = this.logManager.createLogGroup(`${this.id}-rest-api-access-log`, this, {
|
|
352
|
-
logGroupName: `/custom/api/${this.id}-rest-api-access`,
|
|
353
|
-
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
354
|
-
});
|
|
355
358
|
this.apiToEventBridgeTargetRestApi.api = new apig.RestApi(this, `${this.id}-rest-api`, {
|
|
356
359
|
...{
|
|
357
360
|
cloudWatchRole: this.props.api.restApi?.cloudWatchRole ?? true,
|
|
@@ -370,7 +373,7 @@ class ApiToEventBridgeTarget extends common_1.CommonConstruct {
|
|
|
370
373
|
loggingLevel: apig.MethodLoggingLevel.INFO,
|
|
371
374
|
metricsEnabled: true,
|
|
372
375
|
stageName: this.props.stage,
|
|
373
|
-
accessLogDestination: new apig.LogGroupLogDestination(accessLogGroup),
|
|
376
|
+
accessLogDestination: new apig.LogGroupLogDestination(this.apiToEventBridgeTargetRestApi.accessLogGroup),
|
|
374
377
|
accessLogFormat: apig.AccessLogFormat.jsonWithStandardFields(),
|
|
375
378
|
},
|
|
376
379
|
endpointConfiguration: {
|
|
@@ -3,6 +3,7 @@ export * from './api-to-eventbridge-target-with-sns';
|
|
|
3
3
|
export * from './api-to-lambda-target';
|
|
4
4
|
export * from './graphql-api-lambda';
|
|
5
5
|
export * from './graphql-api-lambda-with-cache';
|
|
6
|
+
export * from './lambda-with-iam-access';
|
|
6
7
|
export * from './rest-api-lambda';
|
|
7
8
|
export * from './rest-api-lambda-with-cache';
|
|
8
9
|
export * from './site-with-ecs-backend';
|
|
@@ -19,6 +19,7 @@ __exportStar(require("./api-to-eventbridge-target-with-sns"), exports);
|
|
|
19
19
|
__exportStar(require("./api-to-lambda-target"), exports);
|
|
20
20
|
__exportStar(require("./graphql-api-lambda"), exports);
|
|
21
21
|
__exportStar(require("./graphql-api-lambda-with-cache"), exports);
|
|
22
|
+
__exportStar(require("./lambda-with-iam-access"), exports);
|
|
22
23
|
__exportStar(require("./rest-api-lambda"), exports);
|
|
23
24
|
__exportStar(require("./rest-api-lambda-with-cache"), exports);
|
|
24
25
|
__exportStar(require("./site-with-ecs-backend"), exports);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./main"), exports);
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { CommonConstruct } from '../../common';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { LambdaWithIamAccessEnvironment, LambdaWithIamAccessProps } from './types';
|
|
4
|
+
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
5
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
6
|
+
import * as secretsManager from 'aws-cdk-lib/aws-secretsmanager';
|
|
7
|
+
/**
|
|
8
|
+
* @category cdk-utils.lambda-with-iam-access
|
|
9
|
+
* @subcategory construct
|
|
10
|
+
* @classdesc Provides a construct to create a lambda function with IAM access
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* import { LambdaWithIamAccess, LambdaWithIamAccessProps } '@gradientedge/cdk-utils'
|
|
14
|
+
* import { Construct } from 'constructs'
|
|
15
|
+
*
|
|
16
|
+
* class CustomConstruct extends LambdaWithIamAccess {
|
|
17
|
+
* constructor(parent: Construct, id: string, props: LambdaWithIamAccessProps) {
|
|
18
|
+
* super(parent, id, props)
|
|
19
|
+
* this.props = props
|
|
20
|
+
* this.id = id
|
|
21
|
+
* this.initResources()
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* @mixin
|
|
25
|
+
*/
|
|
26
|
+
export declare class LambdaWithIamAccess extends CommonConstruct {
|
|
27
|
+
props: LambdaWithIamAccessProps;
|
|
28
|
+
id: string;
|
|
29
|
+
lambdaPolicy: iam.PolicyDocument;
|
|
30
|
+
lambdaRole: iam.Role;
|
|
31
|
+
lambdaEnvironment: LambdaWithIamAccessEnvironment;
|
|
32
|
+
lambdaLayers: lambda.LayerVersion[];
|
|
33
|
+
lambdaFunction: lambda.Function;
|
|
34
|
+
lambdaIamUser: iam.User;
|
|
35
|
+
lambdaUserAccessKey: iam.CfnAccessKey;
|
|
36
|
+
lambdaUserAccessSecret: secretsManager.Secret;
|
|
37
|
+
protected constructor(parent: Construct, id: string, props: LambdaWithIamAccessProps);
|
|
38
|
+
/**
|
|
39
|
+
* @summary Initialise and provision resources
|
|
40
|
+
* @protected
|
|
41
|
+
*/
|
|
42
|
+
initResources(): void;
|
|
43
|
+
/**
|
|
44
|
+
* @summary Method to create iam policy for Lambda function
|
|
45
|
+
* @protected
|
|
46
|
+
*/
|
|
47
|
+
protected createLambdaPolicy(): void;
|
|
48
|
+
/**
|
|
49
|
+
* @summary Method to create iam role for Lambda function
|
|
50
|
+
* @protected
|
|
51
|
+
*/
|
|
52
|
+
protected createLambdaRole(): void;
|
|
53
|
+
/**
|
|
54
|
+
* @summary Method to create environment variables for Lambda function
|
|
55
|
+
* @protected
|
|
56
|
+
*/
|
|
57
|
+
protected createLambdaEnvironment(): void;
|
|
58
|
+
/**
|
|
59
|
+
* @summary Method to create layers for Lambda function
|
|
60
|
+
* @protected
|
|
61
|
+
*/
|
|
62
|
+
protected createLambdaLayers(): void;
|
|
63
|
+
/**
|
|
64
|
+
* @summary Method to create lambda function
|
|
65
|
+
* @protected
|
|
66
|
+
*/
|
|
67
|
+
protected createLambdaFunction(): void;
|
|
68
|
+
/**
|
|
69
|
+
* @summary Method to create iam user for the lambda function
|
|
70
|
+
* @protected
|
|
71
|
+
*/
|
|
72
|
+
protected createIamUserForLambdaFunction(): void;
|
|
73
|
+
/**
|
|
74
|
+
* @summary Method to create iam secret for the lambda function
|
|
75
|
+
* @protected
|
|
76
|
+
*/
|
|
77
|
+
protected createIamSecretForLambdaFunction(): void;
|
|
78
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.LambdaWithIamAccess = void 0;
|
|
27
|
+
const common_1 = require("../../common");
|
|
28
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
29
|
+
const secretsManager = __importStar(require("aws-cdk-lib/aws-secretsmanager"));
|
|
30
|
+
/**
|
|
31
|
+
* @category cdk-utils.lambda-with-iam-access
|
|
32
|
+
* @subcategory construct
|
|
33
|
+
* @classdesc Provides a construct to create a lambda function with IAM access
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* import { LambdaWithIamAccess, LambdaWithIamAccessProps } '@gradientedge/cdk-utils'
|
|
37
|
+
* import { Construct } from 'constructs'
|
|
38
|
+
*
|
|
39
|
+
* class CustomConstruct extends LambdaWithIamAccess {
|
|
40
|
+
* constructor(parent: Construct, id: string, props: LambdaWithIamAccessProps) {
|
|
41
|
+
* super(parent, id, props)
|
|
42
|
+
* this.props = props
|
|
43
|
+
* this.id = id
|
|
44
|
+
* this.initResources()
|
|
45
|
+
* }
|
|
46
|
+
* }
|
|
47
|
+
* @mixin
|
|
48
|
+
*/
|
|
49
|
+
class LambdaWithIamAccess extends common_1.CommonConstruct {
|
|
50
|
+
/* LambdaWithIamAccess props */
|
|
51
|
+
props;
|
|
52
|
+
id;
|
|
53
|
+
/* LambdaWithIamAccess resources */
|
|
54
|
+
lambdaPolicy;
|
|
55
|
+
lambdaRole;
|
|
56
|
+
lambdaEnvironment;
|
|
57
|
+
lambdaLayers;
|
|
58
|
+
lambdaFunction;
|
|
59
|
+
lambdaIamUser;
|
|
60
|
+
lambdaUserAccessKey;
|
|
61
|
+
lambdaUserAccessSecret;
|
|
62
|
+
constructor(parent, id, props) {
|
|
63
|
+
super(parent, id, props);
|
|
64
|
+
this.props = props;
|
|
65
|
+
this.id = id;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @summary Initialise and provision resources
|
|
69
|
+
* @protected
|
|
70
|
+
*/
|
|
71
|
+
initResources() {
|
|
72
|
+
this.createLambdaPolicy();
|
|
73
|
+
this.createLambdaRole();
|
|
74
|
+
this.createLambdaEnvironment();
|
|
75
|
+
this.createLambdaLayers();
|
|
76
|
+
this.createLambdaFunction();
|
|
77
|
+
this.createIamUserForLambdaFunction();
|
|
78
|
+
this.createIamSecretForLambdaFunction();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* @summary Method to create iam policy for Lambda function
|
|
82
|
+
* @protected
|
|
83
|
+
*/
|
|
84
|
+
createLambdaPolicy() {
|
|
85
|
+
this.lambdaPolicy = new iam.PolicyDocument({
|
|
86
|
+
statements: [this.iamManager.statementForCreateAnyLogStream()],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @summary Method to create iam role for Lambda function
|
|
91
|
+
* @protected
|
|
92
|
+
*/
|
|
93
|
+
createLambdaRole() {
|
|
94
|
+
this.lambdaRole = this.iamManager.createRoleForLambda(`${this.id}-lambda-role`, this, this.lambdaPolicy);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* @summary Method to create environment variables for Lambda function
|
|
98
|
+
* @protected
|
|
99
|
+
*/
|
|
100
|
+
createLambdaEnvironment() {
|
|
101
|
+
this.lambdaEnvironment = {
|
|
102
|
+
NODE_ENV: this.props.nodeEnv,
|
|
103
|
+
LOG_LEVEL: this.props.logLevel,
|
|
104
|
+
TZ: this.props.timezone,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* @summary Method to create layers for Lambda function
|
|
109
|
+
* @protected
|
|
110
|
+
*/
|
|
111
|
+
createLambdaLayers() {
|
|
112
|
+
const layers = [];
|
|
113
|
+
if (!this.props.lambdaLayerSources)
|
|
114
|
+
return;
|
|
115
|
+
this.props.lambdaLayerSources.forEach((source, index) => {
|
|
116
|
+
layers.push(this.lambdaManager.createLambdaLayer(`${this.id}-layer-${index}`, this, source));
|
|
117
|
+
});
|
|
118
|
+
this.lambdaLayers = layers;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* @summary Method to create lambda function
|
|
122
|
+
* @protected
|
|
123
|
+
*/
|
|
124
|
+
createLambdaFunction() {
|
|
125
|
+
this.lambdaFunction = this.lambdaManager.createLambdaFunction(`${this.id}-lambda`, this, this.props.lambda, this.lambdaRole, this.lambdaLayers, this.props.lambdaSource, this.props.lambdaHandler || 'index.handler', this.lambdaEnvironment);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* @summary Method to create iam user for the lambda function
|
|
129
|
+
* @protected
|
|
130
|
+
*/
|
|
131
|
+
createIamUserForLambdaFunction() {
|
|
132
|
+
this.lambdaIamUser = new iam.User(this, `${this.id}-lambda-user`, {
|
|
133
|
+
userName: `${this.id}-user-${this.props.stage}`,
|
|
134
|
+
});
|
|
135
|
+
new iam.Policy(this, `${this.id}-lambda-user-policy`, {
|
|
136
|
+
policyName: `${this.id}-policy-${this.props.stage}`,
|
|
137
|
+
statements: [
|
|
138
|
+
new iam.PolicyStatement({
|
|
139
|
+
resources: [this.lambdaFunction.functionArn],
|
|
140
|
+
actions: ['lambda:InvokeFunction'],
|
|
141
|
+
}),
|
|
142
|
+
],
|
|
143
|
+
users: [this.lambdaIamUser],
|
|
144
|
+
});
|
|
145
|
+
this.lambdaUserAccessKey = new iam.CfnAccessKey(this, `${this.id}-access-key-${this.props.stage}`, {
|
|
146
|
+
userName: this.lambdaIamUser.userName,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* @summary Method to create iam secret for the lambda function
|
|
151
|
+
* @protected
|
|
152
|
+
*/
|
|
153
|
+
createIamSecretForLambdaFunction() {
|
|
154
|
+
this.lambdaUserAccessSecret = new secretsManager.Secret(this, `${this.id}-lambda-user-secret-${this.props.stage}`, this.props.lambdaSecret);
|
|
155
|
+
const cfnSecret = this.lambdaUserAccessSecret.node.defaultChild;
|
|
156
|
+
cfnSecret.generateSecretString = undefined;
|
|
157
|
+
cfnSecret.secretString = `{ "ACCESS_KEY_ID": "${this.lambdaUserAccessKey.ref}", "ACCESS_KEY_SECRET": "${this.lambdaUserAccessKey.attrSecretAccessKey}" }`;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.LambdaWithIamAccess = LambdaWithIamAccess;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CommonStackProps, LambdaEnvironment, LambdaProps } from '../../types';
|
|
2
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
3
|
+
import { SecretProps } from 'aws-cdk-lib/aws-secretsmanager';
|
|
4
|
+
export interface LambdaWithIamAccessProps extends CommonStackProps {
|
|
5
|
+
lambda: LambdaProps;
|
|
6
|
+
lambdaHandler?: string;
|
|
7
|
+
lambdaLayerSources: lambda.AssetCode[];
|
|
8
|
+
lambdaSecret: SecretProps;
|
|
9
|
+
lambdaSource: lambda.AssetCode;
|
|
10
|
+
logLevel: string;
|
|
11
|
+
nodeEnv: string;
|
|
12
|
+
timezone: string;
|
|
13
|
+
}
|
|
14
|
+
export interface LambdaWithIamAccessEnvironment extends LambdaEnvironment {
|
|
15
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as apig from 'aws-cdk-lib/aws-apigateway';
|
|
2
2
|
import * as acm from 'aws-cdk-lib/aws-certificatemanager';
|
|
3
3
|
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
4
|
+
import * as logs from 'aws-cdk-lib/aws-logs';
|
|
4
5
|
import * as route53 from 'aws-cdk-lib/aws-route53';
|
|
5
6
|
import * as sns from 'aws-cdk-lib/aws-sns';
|
|
6
7
|
import * as types from '../types/aws';
|
|
@@ -11,6 +12,7 @@ import * as types from '../types/aws';
|
|
|
11
12
|
* @classdesc Provides a construct to contain api resources for ApiToEventBridgeTargetWithSns
|
|
12
13
|
*/
|
|
13
14
|
export declare class ApiToEventbridgeTargetRestApi implements types.ApiToEventBridgeTargetRestApiType {
|
|
15
|
+
accessLogGroup: logs.LogGroup;
|
|
14
16
|
api: apig.RestApi;
|
|
15
17
|
certificate: acm.ICertificate;
|
|
16
18
|
domain: apig.DomainName;
|
|
@@ -340,6 +340,7 @@ export interface ApiToEventBridgeTargetEventType {
|
|
|
340
340
|
* @subcategory Types
|
|
341
341
|
*/
|
|
342
342
|
export interface ApiToEventBridgeTargetRestApiType {
|
|
343
|
+
accessLogGroup: logs.LogGroup;
|
|
343
344
|
api: apig.IRestApi;
|
|
344
345
|
authoriser?: apig.IAuthorizer;
|
|
345
346
|
certificate: acm.ICertificate;
|
package/package.json
CHANGED
|
@@ -79,6 +79,7 @@ export class ApiToEventBridgeTarget extends CommonConstruct {
|
|
|
79
79
|
this.createApiToEventBridgeTargetIntegrationResponse()
|
|
80
80
|
this.createApiToEventBridgeTargetIntegrationErrorResponse()
|
|
81
81
|
this.createApiToEventBridgeTargetIntegration()
|
|
82
|
+
this.createApiToEventBridgeTargetRestApiLogGroup()
|
|
82
83
|
this.createApiToEventBridgeTargetRestApi()
|
|
83
84
|
this.createApiToEventBridgeTargetResource()
|
|
84
85
|
this.createApiToEventBridgeTargetResponseModel()
|
|
@@ -360,6 +361,17 @@ export class ApiToEventBridgeTarget extends CommonConstruct {
|
|
|
360
361
|
}
|
|
361
362
|
}
|
|
362
363
|
|
|
364
|
+
protected createApiToEventBridgeTargetRestApiLogGroup() {
|
|
365
|
+
this.apiToEventBridgeTargetRestApi.accessLogGroup = this.logManager.createLogGroup(
|
|
366
|
+
`${this.id}-rest-api-access-log`,
|
|
367
|
+
this,
|
|
368
|
+
{
|
|
369
|
+
logGroupName: `/custom/api/${this.id}-rest-api-access`,
|
|
370
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
371
|
+
}
|
|
372
|
+
)
|
|
373
|
+
}
|
|
374
|
+
|
|
363
375
|
/**
|
|
364
376
|
* @summary Method to create rest restApi for Api
|
|
365
377
|
* @protected
|
|
@@ -374,11 +386,6 @@ export class ApiToEventBridgeTarget extends CommonConstruct {
|
|
|
374
386
|
return
|
|
375
387
|
}
|
|
376
388
|
|
|
377
|
-
const accessLogGroup = this.logManager.createLogGroup(`${this.id}-rest-api-access-log`, this, {
|
|
378
|
-
logGroupName: `/custom/api/${this.id}-rest-api-access`,
|
|
379
|
-
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
380
|
-
})
|
|
381
|
-
|
|
382
389
|
this.apiToEventBridgeTargetRestApi.api = new apig.RestApi(this, `${this.id}-rest-api`, {
|
|
383
390
|
...{
|
|
384
391
|
cloudWatchRole: this.props.api.restApi?.cloudWatchRole ?? true,
|
|
@@ -397,7 +404,7 @@ export class ApiToEventBridgeTarget extends CommonConstruct {
|
|
|
397
404
|
loggingLevel: apig.MethodLoggingLevel.INFO,
|
|
398
405
|
metricsEnabled: true,
|
|
399
406
|
stageName: this.props.stage,
|
|
400
|
-
accessLogDestination: new apig.LogGroupLogDestination(accessLogGroup),
|
|
407
|
+
accessLogDestination: new apig.LogGroupLogDestination(this.apiToEventBridgeTargetRestApi.accessLogGroup),
|
|
401
408
|
accessLogFormat: apig.AccessLogFormat.jsonWithStandardFields(),
|
|
402
409
|
},
|
|
403
410
|
endpointConfiguration: {
|
|
@@ -3,6 +3,7 @@ export * from './api-to-eventbridge-target-with-sns'
|
|
|
3
3
|
export * from './api-to-lambda-target'
|
|
4
4
|
export * from './graphql-api-lambda'
|
|
5
5
|
export * from './graphql-api-lambda-with-cache'
|
|
6
|
+
export * from './lambda-with-iam-access'
|
|
6
7
|
export * from './rest-api-lambda'
|
|
7
8
|
export * from './rest-api-lambda-with-cache'
|
|
8
9
|
export * from './site-with-ecs-backend'
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { CommonConstruct } from '../../common'
|
|
2
|
+
import { Construct } from 'constructs'
|
|
3
|
+
import { LambdaWithIamAccessEnvironment, LambdaWithIamAccessProps } from './types'
|
|
4
|
+
import * as iam from 'aws-cdk-lib/aws-iam'
|
|
5
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda'
|
|
6
|
+
import * as secretsManager from 'aws-cdk-lib/aws-secretsmanager'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @category cdk-utils.lambda-with-iam-access
|
|
10
|
+
* @subcategory construct
|
|
11
|
+
* @classdesc Provides a construct to create a lambda function with IAM access
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* import { LambdaWithIamAccess, LambdaWithIamAccessProps } '@gradientedge/cdk-utils'
|
|
15
|
+
* import { Construct } from 'constructs'
|
|
16
|
+
*
|
|
17
|
+
* class CustomConstruct extends LambdaWithIamAccess {
|
|
18
|
+
* constructor(parent: Construct, id: string, props: LambdaWithIamAccessProps) {
|
|
19
|
+
* super(parent, id, props)
|
|
20
|
+
* this.props = props
|
|
21
|
+
* this.id = id
|
|
22
|
+
* this.initResources()
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* @mixin
|
|
26
|
+
*/
|
|
27
|
+
export class LambdaWithIamAccess extends CommonConstruct {
|
|
28
|
+
/* LambdaWithIamAccess props */
|
|
29
|
+
props: LambdaWithIamAccessProps
|
|
30
|
+
id: string
|
|
31
|
+
|
|
32
|
+
/* LambdaWithIamAccess resources */
|
|
33
|
+
lambdaPolicy: iam.PolicyDocument
|
|
34
|
+
lambdaRole: iam.Role
|
|
35
|
+
lambdaEnvironment: LambdaWithIamAccessEnvironment
|
|
36
|
+
lambdaLayers: lambda.LayerVersion[]
|
|
37
|
+
lambdaFunction: lambda.Function
|
|
38
|
+
lambdaIamUser: iam.User
|
|
39
|
+
lambdaUserAccessKey: iam.CfnAccessKey
|
|
40
|
+
lambdaUserAccessSecret: secretsManager.Secret
|
|
41
|
+
|
|
42
|
+
protected constructor(parent: Construct, id: string, props: LambdaWithIamAccessProps) {
|
|
43
|
+
super(parent, id, props)
|
|
44
|
+
|
|
45
|
+
this.props = props
|
|
46
|
+
this.id = id
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @summary Initialise and provision resources
|
|
51
|
+
* @protected
|
|
52
|
+
*/
|
|
53
|
+
public initResources() {
|
|
54
|
+
this.createLambdaPolicy()
|
|
55
|
+
this.createLambdaRole()
|
|
56
|
+
this.createLambdaEnvironment()
|
|
57
|
+
this.createLambdaLayers()
|
|
58
|
+
this.createLambdaFunction()
|
|
59
|
+
this.createIamUserForLambdaFunction()
|
|
60
|
+
this.createIamSecretForLambdaFunction()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @summary Method to create iam policy for Lambda function
|
|
65
|
+
* @protected
|
|
66
|
+
*/
|
|
67
|
+
protected createLambdaPolicy() {
|
|
68
|
+
this.lambdaPolicy = new iam.PolicyDocument({
|
|
69
|
+
statements: [this.iamManager.statementForCreateAnyLogStream()],
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @summary Method to create iam role for Lambda function
|
|
75
|
+
* @protected
|
|
76
|
+
*/
|
|
77
|
+
protected createLambdaRole() {
|
|
78
|
+
this.lambdaRole = this.iamManager.createRoleForLambda(`${this.id}-lambda-role`, this, this.lambdaPolicy)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @summary Method to create environment variables for Lambda function
|
|
83
|
+
* @protected
|
|
84
|
+
*/
|
|
85
|
+
protected createLambdaEnvironment() {
|
|
86
|
+
this.lambdaEnvironment = {
|
|
87
|
+
NODE_ENV: this.props.nodeEnv,
|
|
88
|
+
LOG_LEVEL: this.props.logLevel,
|
|
89
|
+
TZ: this.props.timezone,
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @summary Method to create layers for Lambda function
|
|
95
|
+
* @protected
|
|
96
|
+
*/
|
|
97
|
+
protected createLambdaLayers() {
|
|
98
|
+
const layers: lambda.LayerVersion[] = []
|
|
99
|
+
|
|
100
|
+
if (!this.props.lambdaLayerSources) return
|
|
101
|
+
|
|
102
|
+
this.props.lambdaLayerSources.forEach((source: lambda.AssetCode, index: number) => {
|
|
103
|
+
layers.push(this.lambdaManager.createLambdaLayer(`${this.id}-layer-${index}`, this, source))
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
this.lambdaLayers = layers
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @summary Method to create lambda function
|
|
111
|
+
* @protected
|
|
112
|
+
*/
|
|
113
|
+
protected createLambdaFunction() {
|
|
114
|
+
this.lambdaFunction = this.lambdaManager.createLambdaFunction(
|
|
115
|
+
`${this.id}-lambda`,
|
|
116
|
+
this,
|
|
117
|
+
this.props.lambda,
|
|
118
|
+
this.lambdaRole,
|
|
119
|
+
this.lambdaLayers,
|
|
120
|
+
this.props.lambdaSource,
|
|
121
|
+
this.props.lambdaHandler || 'index.handler',
|
|
122
|
+
this.lambdaEnvironment
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @summary Method to create iam user for the lambda function
|
|
128
|
+
* @protected
|
|
129
|
+
*/
|
|
130
|
+
protected createIamUserForLambdaFunction() {
|
|
131
|
+
this.lambdaIamUser = new iam.User(this, `${this.id}-lambda-user`, {
|
|
132
|
+
userName: `${this.id}-user-${this.props.stage}`,
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
new iam.Policy(this, `${this.id}-lambda-user-policy`, {
|
|
136
|
+
policyName: `${this.id}-policy-${this.props.stage}`,
|
|
137
|
+
statements: [
|
|
138
|
+
new iam.PolicyStatement({
|
|
139
|
+
resources: [this.lambdaFunction.functionArn],
|
|
140
|
+
actions: ['lambda:InvokeFunction'],
|
|
141
|
+
}),
|
|
142
|
+
],
|
|
143
|
+
users: [this.lambdaIamUser],
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
this.lambdaUserAccessKey = new iam.CfnAccessKey(this, `${this.id}-access-key-${this.props.stage}`, {
|
|
147
|
+
userName: this.lambdaIamUser.userName,
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @summary Method to create iam secret for the lambda function
|
|
153
|
+
* @protected
|
|
154
|
+
*/
|
|
155
|
+
protected createIamSecretForLambdaFunction() {
|
|
156
|
+
this.lambdaUserAccessSecret = new secretsManager.Secret(
|
|
157
|
+
this,
|
|
158
|
+
`${this.id}-lambda-user-secret-${this.props.stage}`,
|
|
159
|
+
this.props.lambdaSecret
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
const cfnSecret = this.lambdaUserAccessSecret.node.defaultChild as secretsManager.CfnSecret
|
|
163
|
+
cfnSecret.generateSecretString = undefined
|
|
164
|
+
cfnSecret.secretString = `{ "ACCESS_KEY_ID": "${this.lambdaUserAccessKey.ref}", "ACCESS_KEY_SECRET": "${this.lambdaUserAccessKey.attrSecretAccessKey}" }`
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CommonStackProps, LambdaEnvironment, LambdaProps } from '../../types'
|
|
2
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda'
|
|
3
|
+
import { SecretProps } from 'aws-cdk-lib/aws-secretsmanager'
|
|
4
|
+
|
|
5
|
+
export interface LambdaWithIamAccessProps extends CommonStackProps {
|
|
6
|
+
lambda: LambdaProps
|
|
7
|
+
lambdaHandler?: string
|
|
8
|
+
lambdaLayerSources: lambda.AssetCode[]
|
|
9
|
+
lambdaSecret: SecretProps
|
|
10
|
+
lambdaSource: lambda.AssetCode
|
|
11
|
+
logLevel: string
|
|
12
|
+
nodeEnv: string
|
|
13
|
+
timezone: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface LambdaWithIamAccessEnvironment extends LambdaEnvironment {}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as apig from 'aws-cdk-lib/aws-apigateway'
|
|
2
2
|
import * as acm from 'aws-cdk-lib/aws-certificatemanager'
|
|
3
3
|
import * as iam from 'aws-cdk-lib/aws-iam'
|
|
4
|
+
import * as logs from 'aws-cdk-lib/aws-logs'
|
|
4
5
|
import * as route53 from 'aws-cdk-lib/aws-route53'
|
|
5
6
|
import * as sns from 'aws-cdk-lib/aws-sns'
|
|
6
7
|
import * as types from '../types/aws'
|
|
@@ -12,6 +13,7 @@ import * as types from '../types/aws'
|
|
|
12
13
|
* @classdesc Provides a construct to contain api resources for ApiToEventBridgeTargetWithSns
|
|
13
14
|
*/
|
|
14
15
|
export class ApiToEventbridgeTargetRestApi implements types.ApiToEventBridgeTargetRestApiType {
|
|
16
|
+
accessLogGroup: logs.LogGroup
|
|
15
17
|
api: apig.RestApi
|
|
16
18
|
certificate: acm.ICertificate
|
|
17
19
|
domain: apig.DomainName
|
|
@@ -366,6 +366,7 @@ export interface ApiToEventBridgeTargetEventType {
|
|
|
366
366
|
* @subcategory Types
|
|
367
367
|
*/
|
|
368
368
|
export interface ApiToEventBridgeTargetRestApiType {
|
|
369
|
+
accessLogGroup: logs.LogGroup
|
|
369
370
|
api: apig.IRestApi
|
|
370
371
|
authoriser?: apig.IAuthorizer
|
|
371
372
|
certificate: acm.ICertificate
|