UNPKG

@aws/pdk

Version:

All documentation is located at: https://aws.github.io/aws-pdk

94 lines 13.1 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.LambdaIntegration = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); /*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); const integration_1 = require("./integration"); const snap_start_java_function_1 = require("../functions/snap-start-java-function"); const utils_1 = require("../spec/utils"); /** * A lambda integration */ class LambdaIntegration extends integration_1.Integration { constructor(lambdaFunction) { super(); // Snap Start applies only to versions, so if the function is a SnapStartFunction, we'll reference the current version if (lambdaFunction instanceof snap_start_java_function_1.SnapStartFunction) { this.lambdaFunction = lambdaFunction.currentVersion; } else { this.lambdaFunction = lambdaFunction; } } /** * Render the lambda integration as a snippet of OpenAPI */ render(_props) { return { type: "AWS_PROXY", httpMethod: "POST", uri: (0, utils_1.functionInvocationUri)(this.lambdaFunction), passthroughBehavior: "WHEN_NO_MATCH", }; } getOperationPermissionId(operationId) { return `LambdaPermission-${operationId}`; } /** * Grant API Gateway permissions to invoke the lambda */ grant({ scope, api, operationId, method, path, operationLookup, }) { // Router permissions are unique to a function const routerPermissionId = `LambdaRouterPermission-${this.lambdaFunction.node.addr.slice(-8)}`; // Check if we've already granted a router permission for this lambda if (scope.node.tryFindChild(routerPermissionId)) { return; // The function already has access to all operations } // Check if a permission has been added for other operations for the same function arn const otherOperationPermissions = Object.keys(operationLookup) .map((opId) => scope.node.tryFindChild(this.getOperationPermissionId(opId))) .filter((permission) => permission && permission instanceof aws_lambda_1.CfnPermission && permission.functionName === this.lambdaFunction.functionArn); if (otherOperationPermissions.length > 0) { // This lambda function is reused, so we add the "router permission" which allows // invocation for any operation, to save exceeding the policy size limit for large // numbers of operations. otherOperationPermissions.forEach((permission) => scope.node.tryRemoveChild(permission.node.id)); new aws_lambda_1.CfnPermission(scope, routerPermissionId, { action: "lambda:InvokeFunction", principal: "apigateway.amazonaws.com", functionName: this.lambdaFunction.functionArn, sourceArn: aws_cdk_lib_1.Stack.of(scope).formatArn({ service: "execute-api", resource: api.restApiId, // Permissions for all resourceName: "*/*/*", }), }); } else { // Add an individual operation permission since this lambda is not reused for multiple operations new aws_lambda_1.CfnPermission(scope, this.getOperationPermissionId(operationId), { action: "lambda:InvokeFunction", principal: "apigateway.amazonaws.com", functionName: this.lambdaFunction.functionArn, sourceArn: aws_cdk_lib_1.Stack.of(scope).formatArn({ service: "execute-api", resource: api.restApiId, // Scope permissions to any stage and a specific method and path of the operation. // Path parameters (eg {param} are replaced with wildcards) resourceName: `*/${method.toUpperCase()}${path.replace(/{[^\}]*\}/g, "*")}`, }), }); } } } exports.LambdaIntegration = LambdaIntegration; _a = JSII_RTTI_SYMBOL_1; LambdaIntegration[_a] = { fqn: "@aws/pdk.type_safe_api.LambdaIntegration", version: "0.26.14" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7c0NBQ3NDO0FBQ3RDLDZDQUFvQztBQUNwQyx1REFBa0U7QUFDbEUsK0NBS3VCO0FBQ3ZCLG9GQUEwRTtBQUMxRSx5Q0FBc0Q7QUFFdEQ7O0dBRUc7QUFDSCxNQUFhLGlCQUFrQixTQUFRLHlCQUFXO0lBR2hELFlBQVksY0FBeUI7UUFDbkMsS0FBSyxFQUFFLENBQUM7UUFDUixzSEFBc0g7UUFDdEgsSUFBSSxjQUFjLFlBQVksNENBQWlCLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE1BQThCO1FBQzFDLE9BQU87WUFDTCxJQUFJLEVBQUUsV0FBVztZQUNqQixVQUFVLEVBQUUsTUFBTTtZQUNsQixHQUFHLEVBQUUsSUFBQSw2QkFBcUIsRUFBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQy9DLG1CQUFtQixFQUFFLGVBQWU7U0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxXQUFtQjtRQUNsRCxPQUFPLG9CQUFvQixXQUFXLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsRUFDWCxLQUFLLEVBQ0wsR0FBRyxFQUNILFdBQVcsRUFDWCxNQUFNLEVBQ04sSUFBSSxFQUNKLGVBQWUsR0FDTztRQUN0Qiw4Q0FBOEM7UUFDOUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FDdEYsQ0FBQyxDQUFDLENBQ0gsRUFBRSxDQUFDO1FBRUoscUVBQXFFO1FBQ3JFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxvREFBb0Q7UUFDOUQsQ0FBQztRQUVELHNGQUFzRjtRQUN0RixNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO2FBQzNELEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1osS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQzdEO2FBQ0EsTUFBTSxDQUNMLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDYixVQUFVO1lBQ1YsVUFBVSxZQUFZLDBCQUFhO1lBQ25DLFVBQVUsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQzNDLENBQUM7UUFFdkIsSUFBSSx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekMsaUZBQWlGO1lBQ2pGLGtGQUFrRjtZQUNsRix5QkFBeUI7WUFDekIseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0MsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDOUMsQ0FBQztZQUNGLElBQUksMEJBQWEsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQzNDLE1BQU0sRUFBRSx1QkFBdUI7Z0JBQy9CLFNBQVMsRUFBRSwwQkFBMEI7Z0JBQ3JDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVc7Z0JBQzdDLFNBQVMsRUFBRSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ25DLE9BQU8sRUFBRSxhQUFhO29CQUN0QixRQUFRLEVBQUUsR0FBRyxDQUFDLFNBQVM7b0JBQ3ZCLHNCQUFzQjtvQkFDdEIsWUFBWSxFQUFFLE9BQU87aUJBQ3RCLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLGlHQUFpRztZQUNqRyxJQUFJLDBCQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDbkUsTUFBTSxFQUFFLHVCQUF1QjtnQkFDL0IsU0FBUyxFQUFFLDBCQUEwQjtnQkFDckMsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVztnQkFDN0MsU0FBUyxFQUFFLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDbkMsT0FBTyxFQUFFLGFBQWE7b0JBQ3RCLFFBQVEsRUFBRSxHQUFHLENBQUMsU0FBUztvQkFDdkIsa0ZBQWtGO29CQUNsRiwyREFBMkQ7b0JBQzNELFlBQVksRUFBRSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNwRCxZQUFZLEVBQ1osR0FBRyxDQUNKLEVBQUU7aUJBQ0osQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOztBQWxHSCw4Q0FtR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQ29weXJpZ2h0IFtBbWF6b24uY29tXShodHRwOi8vYW1hem9uLmNvbS8pLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cbmltcG9ydCB7IFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDZm5QZXJtaXNzaW9uLCBJRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtcbiAgQXBpR2F0ZXdheUludGVncmF0aW9uLFxuICBJbnRlZ3JhdGlvbixcbiAgSW50ZWdyYXRpb25HcmFudFByb3BzLFxuICBJbnRlZ3JhdGlvblJlbmRlclByb3BzLFxufSBmcm9tIFwiLi9pbnRlZ3JhdGlvblwiO1xuaW1wb3J0IHsgU25hcFN0YXJ0RnVuY3Rpb24gfSBmcm9tIFwiLi4vZnVuY3Rpb25zL3NuYXAtc3RhcnQtamF2YS1mdW5jdGlvblwiO1xuaW1wb3J0IHsgZnVuY3Rpb25JbnZvY2F0aW9uVXJpIH0gZnJvbSBcIi4uL3NwZWMvdXRpbHNcIjtcblxuLyoqXG4gKiBBIGxhbWJkYSBpbnRlZ3JhdGlvblxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhSW50ZWdyYXRpb24gZXh0ZW5kcyBJbnRlZ3JhdGlvbiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBTbmFwIFN0YXJ0IGFwcGxpZXMgb25seSB0byB2ZXJzaW9ucywgc28gaWYgdGhlIGZ1bmN0aW9uIGlzIGEgU25hcFN0YXJ0RnVuY3Rpb24sIHdlJ2xsIHJlZmVyZW5jZSB0aGUgY3VycmVudCB2ZXJzaW9uXG4gICAgaWYgKGxhbWJkYUZ1bmN0aW9uIGluc3RhbmNlb2YgU25hcFN0YXJ0RnVuY3Rpb24pIHtcbiAgICAgIHRoaXMubGFtYmRhRnVuY3Rpb24gPSBsYW1iZGFGdW5jdGlvbi5jdXJyZW50VmVyc2lvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IGxhbWJkYUZ1bmN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGxhbWJkYSBpbnRlZ3JhdGlvbiBhcyBhIHNuaXBwZXQgb2YgT3BlbkFQSVxuICAgKi9cbiAgcHVibGljIHJlbmRlcihfcHJvcHM6IEludGVncmF0aW9uUmVuZGVyUHJvcHMpOiBBcGlHYXRld2F5SW50ZWdyYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIkFXU19QUk9YWVwiLFxuICAgICAgaHR0cE1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmk6IGZ1bmN0aW9uSW52b2NhdGlvblVyaSh0aGlzLmxhbWJkYUZ1bmN0aW9uKSxcbiAgICAgIHBhc3N0aHJvdWdoQmVoYXZpb3I6IFwiV0hFTl9OT19NQVRDSFwiLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldE9wZXJhdGlvblBlcm1pc3Npb25JZChvcGVyYXRpb25JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBMYW1iZGFQZXJtaXNzaW9uLSR7b3BlcmF0aW9uSWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBBUEkgR2F0ZXdheSBwZXJtaXNzaW9ucyB0byBpbnZva2UgdGhlIGxhbWJkYVxuICAgKi9cbiAgcHVibGljIGdyYW50KHtcbiAgICBzY29wZSxcbiAgICBhcGksXG4gICAgb3BlcmF0aW9uSWQsXG4gICAgbWV0aG9kLFxuICAgIHBhdGgsXG4gICAgb3BlcmF0aW9uTG9va3VwLFxuICB9OiBJbnRlZ3JhdGlvbkdyYW50UHJvcHMpIHtcbiAgICAvLyBSb3V0ZXIgcGVybWlzc2lvbnMgYXJlIHVuaXF1ZSB0byBhIGZ1bmN0aW9uXG4gICAgY29uc3Qgcm91dGVyUGVybWlzc2lvbklkID0gYExhbWJkYVJvdXRlclBlcm1pc3Npb24tJHt0aGlzLmxhbWJkYUZ1bmN0aW9uLm5vZGUuYWRkci5zbGljZShcbiAgICAgIC04XG4gICAgKX1gO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSBncmFudGVkIGEgcm91dGVyIHBlcm1pc3Npb24gZm9yIHRoaXMgbGFtYmRhXG4gICAgaWYgKHNjb3BlLm5vZGUudHJ5RmluZENoaWxkKHJvdXRlclBlcm1pc3Npb25JZCkpIHtcbiAgICAgIHJldHVybjsgLy8gVGhlIGZ1bmN0aW9uIGFscmVhZHkgaGFzIGFjY2VzcyB0byBhbGwgb3BlcmF0aW9uc1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGEgcGVybWlzc2lvbiBoYXMgYmVlbiBhZGRlZCBmb3Igb3RoZXIgb3BlcmF0aW9ucyBmb3IgdGhlIHNhbWUgZnVuY3Rpb24gYXJuXG4gICAgY29uc3Qgb3RoZXJPcGVyYXRpb25QZXJtaXNzaW9ucyA9IE9iamVjdC5rZXlzKG9wZXJhdGlvbkxvb2t1cClcbiAgICAgIC5tYXAoKG9wSWQpID0+XG4gICAgICAgIHNjb3BlLm5vZGUudHJ5RmluZENoaWxkKHRoaXMuZ2V0T3BlcmF0aW9uUGVybWlzc2lvbklkKG9wSWQpKVxuICAgICAgKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgICAgcGVybWlzc2lvbiAmJlxuICAgICAgICAgIHBlcm1pc3Npb24gaW5zdGFuY2VvZiBDZm5QZXJtaXNzaW9uICYmXG4gICAgICAgICAgcGVybWlzc2lvbi5mdW5jdGlvbk5hbWUgPT09IHRoaXMubGFtYmRhRnVuY3Rpb24uZnVuY3Rpb25Bcm5cbiAgICAgICkgYXMgQ2ZuUGVybWlzc2lvbltdO1xuXG4gICAgaWYgKG90aGVyT3BlcmF0aW9uUGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhpcyBsYW1iZGEgZnVuY3Rpb24gaXMgcmV1c2VkLCBzbyB3ZSBhZGQgdGhlIFwicm91dGVyIHBlcm1pc3Npb25cIiB3aGljaCBhbGxvd3NcbiAgICAgIC8vIGludm9jYXRpb24gZm9yIGFueSBvcGVyYXRpb24sIHRvIHNhdmUgZXhjZWVkaW5nIHRoZSBwb2xpY3kgc2l6ZSBsaW1pdCBmb3IgbGFyZ2VcbiAgICAgIC8vIG51bWJlcnMgb2Ygb3BlcmF0aW9ucy5cbiAgICAgIG90aGVyT3BlcmF0aW9uUGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT5cbiAgICAgICAgc2NvcGUubm9kZS50cnlSZW1vdmVDaGlsZChwZXJtaXNzaW9uLm5vZGUuaWQpXG4gICAgICApO1xuICAgICAgbmV3IENmblBlcm1pc3Npb24oc2NvcGUsIHJvdXRlclBlcm1pc3Npb25JZCwge1xuICAgICAgICBhY3Rpb246IFwibGFtYmRhOkludm9rZUZ1bmN0aW9uXCIsXG4gICAgICAgIHByaW5jaXBhbDogXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIixcbiAgICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLmxhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgICBzb3VyY2VBcm46IFN0YWNrLm9mKHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgICAgIHNlcnZpY2U6IFwiZXhlY3V0ZS1hcGlcIixcbiAgICAgICAgICByZXNvdXJjZTogYXBpLnJlc3RBcGlJZCxcbiAgICAgICAgICAvLyBQZXJtaXNzaW9ucyBmb3IgYWxsXG4gICAgICAgICAgcmVzb3VyY2VOYW1lOiBcIiovKi8qXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCBhbiBpbmRpdmlkdWFsIG9wZXJhdGlvbiBwZXJtaXNzaW9uIHNpbmNlIHRoaXMgbGFtYmRhIGlzIG5vdCByZXVzZWQgZm9yIG11bHRpcGxlIG9wZXJhdGlvbnNcbiAgICAgIG5ldyBDZm5QZXJtaXNzaW9uKHNjb3BlLCB0aGlzLmdldE9wZXJhdGlvblBlcm1pc3Npb25JZChvcGVyYXRpb25JZCksIHtcbiAgICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgICBwcmluY2lwYWw6IFwiYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tXCIsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy5sYW1iZGFGdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICAgICAgc291cmNlQXJuOiBTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgICBzZXJ2aWNlOiBcImV4ZWN1dGUtYXBpXCIsXG4gICAgICAgICAgcmVzb3VyY2U6IGFwaS5yZXN0QXBpSWQsXG4gICAgICAgICAgLy8gU2NvcGUgcGVybWlzc2lvbnMgdG8gYW55IHN0YWdlIGFuZCBhIHNwZWNpZmljIG1ldGhvZCBhbmQgcGF0aCBvZiB0aGUgb3BlcmF0aW9uLlxuICAgICAgICAgIC8vIFBhdGggcGFyYW1ldGVycyAoZWcge3BhcmFtfSBhcmUgcmVwbGFjZWQgd2l0aCB3aWxkY2FyZHMpXG4gICAgICAgICAgcmVzb3VyY2VOYW1lOiBgKi8ke21ldGhvZC50b1VwcGVyQ2FzZSgpfSR7cGF0aC5yZXBsYWNlKFxuICAgICAgICAgICAgL3tbXlxcfV0qXFx9L2csXG4gICAgICAgICAgICBcIipcIlxuICAgICAgICAgICl9YCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==