diff --git a/deployment/v2/align-version.js b/deployment/v2/align-version.js index 83f1a8eed..151533fc0 100755 --- a/deployment/v2/align-version.js +++ b/deployment/v2/align-version.js @@ -10,7 +10,7 @@ const nullVersionMarker = process.argv[2]; const targetSolutionsConstructsVersion = process.argv[3]; // these versions need to be sourced from a config file -const awsCdkLibVersion = '2.177.0'; +const awsCdkLibVersion = '2.179.0'; for (const file of process.argv.splice(4)) { const pkg = JSON.parse(fs.readFileSync(file).toString()); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md index e4f7a1ff0..997fca7f8 100755 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md @@ -200,7 +200,7 @@ When the construct is created or updated, it will overwrite the `MessagesHandler For more information on specifying an API with OpenAPI, please see the [OpenAPI Specification](https://spec.openapis.org/oas/latest.html) ## ApiIntegration Details -This construct defines a custom type, `ApiIntegration`, that is specified as a required prop. The type has a required property, `id`, and two optional properties `existingLambdaObj` and `lambdaFunctionProps`. The `id` property is used to map the corresponding lambda function being defined with the placeholder string in the OpenAPI template file, and is not a CDK construct ID. Exactly one of `existingLambdaObj` or `lambdaFunctionProps` must be specified or the construct will throw an error. +This construct defines a custom type, `ApiIntegration`, that is specified as a required prop. The type has a required property, `id`, and three optional properties `existingLambdaObj`, `existingFunctionAlias` and `lambdaFunctionProps`. The `id` property is used to map the corresponding lambda function being defined with the placeholder string in the OpenAPI template file, and is not a CDK construct ID. Exactly one of `existingLambdaObj` or `lambdaFunctionProps` must be specified or the construct will throw an error. ## Default settings diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts index 8aa5bb8ff..bb99b5cc1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts @@ -16,6 +16,7 @@ import { Construct } from 'constructs'; import * as apigateway from 'aws-cdk-lib/aws-apigateway'; import * as logs from 'aws-cdk-lib/aws-logs'; import * as iam from 'aws-cdk-lib/aws-iam'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as s3 from 'aws-cdk-lib/aws-s3'; import * as defaults from '@aws-solutions-constructs/core'; import { RestApiBaseProps } from 'aws-cdk-lib/aws-apigateway'; @@ -116,24 +117,41 @@ export class OpenApiGatewayToLambda extends Construct { // store a counter to be able to uniquely name lambda functions to avoid naming collisions let lambdaCounter = 0; - this.apiLambdaFunctions = props.apiIntegrations.map(apiIntegration => { - if (apiIntegration.existingLambdaObj && apiIntegration.lambdaFunctionProps) { - throw new Error(`Error - Cannot provide both lambdaFunctionProps and existingLambdaObj in an ApiIntegrationfor the api integration with id: ${apiIntegration.id}`); - } - if (apiIntegration.existingLambdaObj || apiIntegration.lambdaFunctionProps) { + // TODO: Should this functionality be moved to openapi-helper.ts? + this.apiLambdaFunctions = props.apiIntegrations.map(rawApiIntegration => { + // let updatedIntegration: ApiIntegration; + // if (rawApiIntegration.alternateType) { + // if ((rawApiIntegration.alternateType as lambda.Alias).aliasName) { + // updatedIntegration = { + // ...rawApiIntegration, + // existingFunctionAlias: rawApiIntegration.alternateType as lambda.Alias + // }; + // } else { + // updatedIntegration = { + // ...rawApiIntegration, + // existingLambdaObj: rawApiIntegration.alternateType as lambda.Function + // }; + // } + // } else { + // updatedIntegration = rawApiIntegration; + // } + if (rawApiIntegration.existingLambdaObj && this.isResourceAnAlias(rawApiIntegration.existingLambdaObj)) { return { - id: apiIntegration.id, - lambdaFunction: defaults.buildLambdaFunction(this, { - existingLambdaObj: apiIntegration.existingLambdaObj, - lambdaFunctionProps: apiIntegration.lambdaFunctionProps - }, `${apiIntegration.id}ApiFunction${lambdaCounter++}`) + id: rawApiIntegration.id, + functionAlias: rawApiIntegration.existingLambdaObj as lambda.Alias }; } else { - throw new Error(`One of existingLambdaObj or lambdaFunctionProps must be specified for the api integration with id: ${apiIntegration.id}`); + return { + id: rawApiIntegration.id, + lambdaFunction: defaults.buildLambdaFunction(this, { + existingLambdaObj: rawApiIntegration.existingLambdaObj as lambda.Function, + lambdaFunctionProps: rawApiIntegration.lambdaFunctionProps + }, `${rawApiIntegration.id}ApiFunction${lambdaCounter++}`), + }; } }); - const definition = ObtainApiDefinition(this, { + const definition = ObtainApiDefinition(this, { tokenToFunctionMap: this.apiLambdaFunctions, apiDefinitionBucket: props.apiDefinitionBucket, apiDefinitionKey: props.apiDefinitionKey, @@ -155,13 +173,28 @@ export class OpenApiGatewayToLambda extends Construct { // Redeploy the API any time a decoupled (non-inline) API definition changes (from asset or s3 object) this.apiGateway.latestDeployment?.addToLogicalId(props.apiDefinitionKey ?? props.apiDefinitionAsset?.s3ObjectKey); this.apiLambdaFunctions.forEach(apiLambdaFunction => { + // We confirm upstream that one of these two values exists, so we can cast away Typescripts doubt + const targetInterface: lambda.IFunction = (apiLambdaFunction.lambdaFunction ?? apiLambdaFunction.functionAlias) as lambda.IFunction; + // Redeploy the API any time one of the lambda functions changes - this.apiGateway.latestDeployment?.addToLogicalId(apiLambdaFunction.lambdaFunction.functionArn); - // Grant APIGW invocation rights for each lambda function - apiLambdaFunction.lambdaFunction.addPermission(`${id}PermitAPIGInvocation`, { - principal: new iam.ServicePrincipal('apigateway.amazonaws.com'), - sourceArn: this.apiGateway.arnForExecuteApi('*') - }); + this.apiGateway.latestDeployment?.addToLogicalId(targetInterface.functionArn); + if (apiLambdaFunction.functionAlias) { + // Grant APIGW invocation rights for each lambda function + apiLambdaFunction.functionAlias.addPermission(`${id}PermitAPIGInvocation`, { + principal: new iam.ServicePrincipal('apigateway.amazonaws.com'), + sourceArn: this.apiGateway.arnForExecuteApi('*') + }); + } else { + // Grant APIGW invocation rights for each lambda function + targetInterface.addPermission(`${id}PermitAPIGInvocation`, { + principal: new iam.ServicePrincipal('apigateway.amazonaws.com'), + sourceArn: this.apiGateway.arnForExecuteApi('*') + }); + } }); } + + private isResourceAnAlias(lambdaResource: lambda.Function | lambda.Alias): boolean { + return (lambdaResource as lambda.Alias).aliasName !== undefined; + } } diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/openapi-helper.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/openapi-helper.ts index 72b53ffea..f77e83575 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/openapi-helper.ts +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/openapi-helper.ts @@ -47,7 +47,7 @@ export interface ApiIntegration { * * One and only one of existingLambdaObj or lambdaFunctionProps must be specified, any other combination will cause an error. */ - readonly existingLambdaObj?: lambda.Function; + readonly existingLambdaObj?: lambda.Function | lambda.Alias; /** * Properties for the Lambda function to create and associate with the API method in the OpenAPI file matched by id. * @@ -65,9 +65,11 @@ export interface ApiLambdaFunction { */ readonly id: string; /** - * The instantiated lambda.Function. + * The function the API method will integrate with - + * Must be defined in lambdaFunction or functionAlias (but not both) */ - readonly lambdaFunction: lambda.Function; + readonly lambdaFunction?: lambda.Function; + readonly functionAlias?: lambda.Alias; } export interface OpenApiProps { @@ -104,6 +106,20 @@ export function CheckOpenApiProps(props: OpenApiProps) { if (props.apiIntegrations === undefined || props.apiIntegrations.length < 1) { errorMessages += 'At least one ApiIntegration must be specified in the apiIntegrations property\n'; errorFound = true; + } else { + props.apiIntegrations.forEach((apiIntegration: ApiIntegration) => { + if (!apiIntegration.id) { + errorMessages += 'Each ApiIntegration must have a non-empty id property\n'; + errorFound = true; + } + let functionDefCount = 0; + if (apiIntegration.lambdaFunctionProps) { functionDefCount++; } + if (apiIntegration.existingLambdaObj) { functionDefCount++; } + if (functionDefCount !== 1) { + errorMessages += `ApiIntegration id:${apiIntegration.id} must have exactly one of lambdaFunctionProps or existingLambdaObj\n`; + errorFound = true; + } + }); } if (errorFound) { @@ -136,7 +152,9 @@ export function ObtainApiDefinition(scope: Construct, props: ObtainApiDefinition const uriPlaceholderString = apiLambdaFunction.id; // the endpoint URI of the backing lambda function, as defined in the API Gateway extensions for OpenAPI here: // https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-swagger-extensions-integration.html - const uriResolvedValue = `arn:${Aws.PARTITION}:apigateway:${Aws.REGION}:lambda:path/2015-03-31/functions/${apiLambdaFunction.lambdaFunction.functionArn}/invocations`; + // We know that either functionAlias or lambdaFunction must be defined, so we can use ! to satisfy Typescript + const targetArn = apiLambdaFunction.functionAlias ? apiLambdaFunction.functionAlias.functionArn : apiLambdaFunction.lambdaFunction!.functionArn; + const uriResolvedValue = `arn:${Aws.PARTITION}:apigateway:${Aws.REGION}:lambda:path/2015-03-31/functions/${targetArn}/invocations`; return { id: uriPlaceholderString, diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e/index.mjs b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e/index.mjs new file mode 100644 index 000000000..55e35c614 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e/index.mjs @@ -0,0 +1,16 @@ +export const handler = async (event) => { + switch (event.httpMethod) { + case 'POST': + return { + statusCode: 200, + body: JSON.stringify({"message": "NEW - successfully handled POST from messages lambda"}) + }; + case 'GET': + return { + statusCode: 200, + body: JSON.stringify({"message": "NEW - successfully handled GET from messages lambda"}) + }; + default: + throw new Error(`cannot handle httpMethod: ${event.httpMethod}`); + } +}; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7/index.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7/index.js new file mode 100644 index 000000000..46ce9dea9 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7/index.js @@ -0,0 +1,66 @@ +"use strict"; +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = void 0; +const client_s3_1 = require("@aws-sdk/client-s3"); +const crypto = require("crypto"); +const s3Client = new client_s3_1.S3Client({ region: process.env.REGION }); +const handler = async (event, context) => { + let status = 'SUCCESS'; + let responseData = {}; + // These are the standard Create/Update/Delete custom resource request types defined here: + // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-requesttypes.html + if (event.RequestType === 'Create' || event.RequestType === 'Update') { + try { + const templateValues = JSON.parse(event.ResourceProperties.TemplateValues).templateValues; + const templateInputBucket = event.ResourceProperties.TemplateInputBucket; + const templateInputKey = event.ResourceProperties.TemplateInputKey; + const templateOutputBucket = event.ResourceProperties.TemplateOutputBucket; + const templateOutputKey = crypto.randomBytes(32).toString('hex'); + const getObjectResponse = await s3Client.send(new client_s3_1.GetObjectCommand({ + Bucket: templateInputBucket, + Key: templateInputKey + })); + let template = await getObjectResponse.Body?.transformToString(); + templateValues.forEach((templateValue) => { + template = template?.replace(new RegExp(templateValue.id, 'g'), templateValue.value); + }); + await s3Client.send(new client_s3_1.PutObjectCommand({ + Bucket: templateOutputBucket, + Key: templateOutputKey, + Body: template + })); + responseData = { + TemplateOutputKey: templateOutputKey + }; + } + catch (err) { + status = 'FAILED'; + responseData = { + Error: err + }; + } + } + return { + Status: status, + Reason: JSON.stringify(responseData), + PhysicalResourceId: event.PhysicalResourceId ?? context.logStreamName, + StackId: event.StackId, + RequestId: event.RequestId, + LogicalResourceId: event.LogicalResourceId, + Data: responseData, + }; +}; +exports.handler = handler; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7OztBQUVILGtEQUFrRjtBQUNsRixpQ0FBaUM7QUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxvQkFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUV2RCxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBVSxFQUFFLE9BQVksRUFBRSxFQUFFO0lBQ3hELElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUN2QixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7SUFFdEIsMEZBQTBGO0lBQzFGLDRGQUE0RjtJQUM1RixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUMsY0FBYyxDQUFDO1lBQzFGLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDO1lBQ3pFLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDO1lBQ25FLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDO1lBQzNFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFakUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSw0QkFBZ0IsQ0FBQztnQkFDakUsTUFBTSxFQUFFLG1CQUFtQjtnQkFDM0IsR0FBRyxFQUFFLGdCQUFnQjthQUN0QixDQUFDLENBQUMsQ0FBQztZQUVKLElBQUksUUFBUSxHQUFHLE1BQU0saUJBQWlCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7WUFFakUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWtCLEVBQUUsRUFBRTtnQkFDNUMsUUFBUSxHQUFHLFFBQVEsRUFBRSxPQUFPLENBQzFCLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQ2pDLGFBQWEsQ0FBQyxLQUFLLENBQ3BCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLDRCQUFnQixDQUFDO2dCQUN2QyxNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixHQUFHLEVBQUUsaUJBQWlCO2dCQUN0QixJQUFJLEVBQUUsUUFBUTthQUNmLENBQUMsQ0FBQyxDQUFDO1lBRUosWUFBWSxHQUFHO2dCQUNiLGlCQUFpQixFQUFFLGlCQUFpQjthQUNyQyxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsUUFBUSxDQUFDO1lBQ2xCLFlBQVksR0FBRztnQkFDYixLQUFLLEVBQUUsR0FBRzthQUNYLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLEVBQUUsTUFBTTtRQUNkLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztRQUNwQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDLGFBQWE7UUFDckUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztRQUMxQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1FBQzFDLElBQUksRUFBRSxZQUFZO0tBQ25CLENBQUM7QUFDSixDQUFDLENBQUM7QUF0RFcsUUFBQSxPQUFPLFdBc0RsQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFMzQ2xpZW50LCBHZXRPYmplY3RDb21tYW5kLCBQdXRPYmplY3RDb21tYW5kIH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbmNvbnN0IHMzQ2xpZW50ID0gbmV3IFMzQ2xpZW50KHsgcmVnaW9uOiBwcm9jZXNzLmVudi5SRUdJT04gfSk7XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBhbnksIGNvbnRleHQ6IGFueSkgPT4ge1xuICBsZXQgc3RhdHVzID0gJ1NVQ0NFU1MnO1xuICBsZXQgcmVzcG9uc2VEYXRhID0ge307XG5cbiAgLy8gVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBDcmVhdGUvVXBkYXRlL0RlbGV0ZSBjdXN0b20gcmVzb3VyY2UgcmVxdWVzdCB0eXBlcyBkZWZpbmVkIGhlcmU6XG4gIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2NycGctcmVmLXJlcXVlc3R0eXBlcy5odG1sXG4gIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gJ0NyZWF0ZScgfHwgZXZlbnQuUmVxdWVzdFR5cGUgPT09ICdVcGRhdGUnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlVmFsdWVzID0gSlNPTi5wYXJzZShldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuVGVtcGxhdGVWYWx1ZXMpLnRlbXBsYXRlVmFsdWVzO1xuICAgICAgY29uc3QgdGVtcGxhdGVJbnB1dEJ1Y2tldCA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5UZW1wbGF0ZUlucHV0QnVja2V0O1xuICAgICAgY29uc3QgdGVtcGxhdGVJbnB1dEtleSA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5UZW1wbGF0ZUlucHV0S2V5O1xuICAgICAgY29uc3QgdGVtcGxhdGVPdXRwdXRCdWNrZXQgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuVGVtcGxhdGVPdXRwdXRCdWNrZXQ7XG4gICAgICBjb25zdCB0ZW1wbGF0ZU91dHB1dEtleSA9IGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBjb25zdCBnZXRPYmplY3RSZXNwb25zZSA9IGF3YWl0IHMzQ2xpZW50LnNlbmQobmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgICBCdWNrZXQ6IHRlbXBsYXRlSW5wdXRCdWNrZXQsXG4gICAgICAgIEtleTogdGVtcGxhdGVJbnB1dEtleVxuICAgICAgfSkpO1xuXG4gICAgICBsZXQgdGVtcGxhdGUgPSBhd2FpdCBnZXRPYmplY3RSZXNwb25zZS5Cb2R5Py50cmFuc2Zvcm1Ub1N0cmluZygpO1xuXG4gICAgICB0ZW1wbGF0ZVZhbHVlcy5mb3JFYWNoKCh0ZW1wbGF0ZVZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZT8ucmVwbGFjZShcbiAgICAgICAgICBuZXcgUmVnRXhwKHRlbXBsYXRlVmFsdWUuaWQsICdnJyksXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZS52YWx1ZVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHMzQ2xpZW50LnNlbmQobmV3IFB1dE9iamVjdENvbW1hbmQoe1xuICAgICAgICBCdWNrZXQ6IHRlbXBsYXRlT3V0cHV0QnVja2V0LFxuICAgICAgICBLZXk6IHRlbXBsYXRlT3V0cHV0S2V5LFxuICAgICAgICBCb2R5OiB0ZW1wbGF0ZVxuICAgICAgfSkpO1xuXG4gICAgICByZXNwb25zZURhdGEgPSB7XG4gICAgICAgIFRlbXBsYXRlT3V0cHV0S2V5OiB0ZW1wbGF0ZU91dHB1dEtleVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHN0YXR1cyA9ICdGQUlMRUQnO1xuICAgICAgcmVzcG9uc2VEYXRhID0ge1xuICAgICAgICBFcnJvcjogZXJyXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgU3RhdHVzOiBzdGF0dXMsXG4gICAgUmVhc29uOiBKU09OLnN0cmluZ2lmeShyZXNwb25zZURhdGEpLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkID8/IGNvbnRleHQubG9nU3RyZWFtTmFtZSxcbiAgICBTdGFja0lkOiBldmVudC5TdGFja0lkLFxuICAgIFJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLFxuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICBEYXRhOiByZXNwb25zZURhdGEsXG4gIH07XG59OyJdfQ== \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7/index.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7/index.ts new file mode 100644 index 000000000..7d82dbe4a --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7/index.ts @@ -0,0 +1,73 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { S3Client, GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3"; +import * as crypto from 'crypto'; + +const s3Client = new S3Client({ region: process.env.REGION }); + +export const handler = async (event: any, context: any) => { + let status = 'SUCCESS'; + let responseData = {}; + + // These are the standard Create/Update/Delete custom resource request types defined here: + // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-requesttypes.html + if (event.RequestType === 'Create' || event.RequestType === 'Update') { + try { + const templateValues = JSON.parse(event.ResourceProperties.TemplateValues).templateValues; + const templateInputBucket = event.ResourceProperties.TemplateInputBucket; + const templateInputKey = event.ResourceProperties.TemplateInputKey; + const templateOutputBucket = event.ResourceProperties.TemplateOutputBucket; + const templateOutputKey = crypto.randomBytes(32).toString('hex'); + + const getObjectResponse = await s3Client.send(new GetObjectCommand({ + Bucket: templateInputBucket, + Key: templateInputKey + })); + + let template = await getObjectResponse.Body?.transformToString(); + + templateValues.forEach((templateValue: any) => { + template = template?.replace( + new RegExp(templateValue.id, 'g'), + templateValue.value + ); + }); + + await s3Client.send(new PutObjectCommand({ + Bucket: templateOutputBucket, + Key: templateOutputKey, + Body: template + })); + + responseData = { + TemplateOutputKey: templateOutputKey + }; + } catch (err) { + status = 'FAILED'; + responseData = { + Error: err + }; + } + } + + return { + Status: status, + Reason: JSON.stringify(responseData), + PhysicalResourceId: event.PhysicalResourceId ?? context.logStreamName, + StackId: event.StackId, + RequestId: event.RequestId, + LogicalResourceId: event.LogicalResourceId, + Data: responseData, + }; +}; \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df/index.mjs b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50/index.mjs similarity index 88% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df/index.mjs rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50/index.mjs index dfcaf1052..220496109 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df/index.mjs +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50/index.mjs @@ -3,12 +3,12 @@ export const handler = async (event) => { case 'POST': return { statusCode: 200, - body: JSON.stringify({"message": "successfully handled POST from messages lambda"}) + body: JSON.stringify({"message": "successfully handled POST from photos lambda"}) }; case 'GET': return { statusCode: 200, - body: JSON.stringify({"message": "successfully handled GET from messages lambda"}) + body: JSON.stringify({"message": "successfully handled GET from photos lambda"}) }; default: throw new Error(`cannot handle httpMethod: ${event.httpMethod}`); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.7dbcd6245c5c6f70da313d31e9bd533af2214c565d855fb2f669666e927c125e b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.7dbcd6245c5c6f70da313d31e9bd533af2214c565d855fb2f669666e927c125e new file mode 100644 index 000000000..2ffcefdfb --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.7dbcd6245c5c6f70da313d31e9bd533af2214c565d855fb2f669666e927c125e @@ -0,0 +1,3 @@ +DO-NOT-DELETE + +This file is used to create an aws_s3_assets.Asset that will be referenced when writing the transformed asset. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js new file mode 100644 index 000000000..17c9ea7df --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Retry=exports.includeStackTraces=exports.MISSING_PHYSICAL_ID_MARKER=exports.CREATE_FAILED_PHYSICAL_ID_MARKER=void 0,exports.submitResponse=submitResponse,exports.safeHandler=safeHandler,exports.redactDataFromPayload=redactDataFromPayload;const url=require("url"),outbound_1=require("./outbound"),util_1=require("./util");exports.CREATE_FAILED_PHYSICAL_ID_MARKER="AWSCDK::CustomResourceProviderFramework::CREATE_FAILED",exports.MISSING_PHYSICAL_ID_MARKER="AWSCDK::CustomResourceProviderFramework::MISSING_PHYSICAL_ID";async function submitResponse(status,event,options={}){const json={Status:status,Reason:options.reason||status,StackId:event.StackId,RequestId:event.RequestId,PhysicalResourceId:event.PhysicalResourceId||exports.MISSING_PHYSICAL_ID_MARKER,LogicalResourceId:event.LogicalResourceId,NoEcho:options.noEcho,Data:event.Data},responseBody=JSON.stringify(json),parsedUrl=url.parse(event.ResponseURL),loggingSafeUrl=`${parsedUrl.protocol}//${parsedUrl.hostname}/${parsedUrl.pathname}?***`;options?.noEcho?(0,util_1.log)("submit redacted response to cloudformation",loggingSafeUrl,redactDataFromPayload(json)):(0,util_1.log)("submit response to cloudformation",loggingSafeUrl,json);const retryOptions={attempts:5,sleep:1e3};await(0,util_1.withRetries)(retryOptions,outbound_1.httpRequest)({hostname:parsedUrl.hostname,path:parsedUrl.path,method:"PUT",headers:{"content-type":"","content-length":Buffer.byteLength(responseBody,"utf8")}},responseBody)}exports.includeStackTraces=!0;function safeHandler(block){return async event=>{if(event.RequestType==="Delete"&&event.PhysicalResourceId===exports.CREATE_FAILED_PHYSICAL_ID_MARKER){(0,util_1.log)("ignoring DELETE event caused by a failed CREATE event"),await submitResponse("SUCCESS",event);return}try{await block(event)}catch(e){if(e instanceof Retry)throw(0,util_1.log)("retry requested by handler"),e;event.PhysicalResourceId||(event.RequestType==="Create"?((0,util_1.log)("CREATE failed, responding with a marker physical resource id so that the subsequent DELETE will be ignored"),event.PhysicalResourceId=exports.CREATE_FAILED_PHYSICAL_ID_MARKER):(0,util_1.log)(`ERROR: Malformed event. "PhysicalResourceId" is required: ${JSON.stringify({...event,ResponseURL:"..."})}`)),await submitResponse("FAILED",event,{reason:exports.includeStackTraces?e.stack:e.message})}}}function redactDataFromPayload(payload){const redactedPayload=JSON.parse(JSON.stringify(payload));if(redactedPayload.Data){const keys=Object.keys(redactedPayload.Data);for(const key of keys)redactedPayload.Data[key]="*****"}return redactedPayload}class Retry extends Error{}exports.Retry=Retry; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/consts.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/consts.js rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/framework.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/framework.js rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/outbound.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js similarity index 84% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/outbound.js rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js index 4d5c7889f..3c900428d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/outbound.js +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.httpRequest=exports.invokeFunction=exports.startExecution=void 0;const https=require("https"),client_lambda_1=require("@aws-sdk/client-lambda"),client_sfn_1=require("@aws-sdk/client-sfn"),FRAMEWORK_HANDLER_TIMEOUT=9e5,awsSdkConfig={httpOptions:{timeout:FRAMEWORK_HANDLER_TIMEOUT}};async function defaultHttpRequest(options,requestBody){return new Promise((resolve,reject)=>{try{const request=https.request(options,response=>{response.resume(),!response.statusCode||response.statusCode>=400?reject(new Error(`Unsuccessful HTTP response: ${response.statusCode}`)):resolve()});request.on("error",reject),request.write(requestBody),request.end()}catch(e){reject(e)}})}let sfn,lambda;async function defaultStartExecution(req){return sfn||(sfn=new client_sfn_1.SFN(awsSdkConfig)),sfn.startExecution(req)}async function defaultInvokeFunction(req){lambda||(lambda=new client_lambda_1.Lambda(awsSdkConfig));try{return await lambda.invoke(req)}catch{return await(0,client_lambda_1.waitUntilFunctionActiveV2)({client:lambda,maxWaitTime:300},{FunctionName:req.FunctionName}),await lambda.invoke(req)}}exports.startExecution=defaultStartExecution,exports.invokeFunction=defaultInvokeFunction,exports.httpRequest=defaultHttpRequest; +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.httpRequest=exports.invokeFunction=exports.startExecution=void 0;const https=require("https"),client_lambda_1=require("@aws-sdk/client-lambda"),client_sfn_1=require("@aws-sdk/client-sfn"),FRAMEWORK_HANDLER_TIMEOUT=9e5,awsSdkConfig={httpOptions:{timeout:FRAMEWORK_HANDLER_TIMEOUT}};async function defaultHttpRequest(options,requestBody){return new Promise((resolve,reject)=>{try{const request=https.request(options,response=>{response.resume(),!response.statusCode||response.statusCode>=400?reject(new Error(`Unsuccessful HTTP response: ${response.statusCode}`)):resolve()});request.on("error",reject),request.write(requestBody),request.end()}catch(e){reject(e)}})}let sfn,lambda;async function defaultStartExecution(req){return sfn||(sfn=new client_sfn_1.SFN(awsSdkConfig)),sfn.startExecution(req)}async function defaultInvokeFunction(req){lambda||(lambda=new client_lambda_1.Lambda(awsSdkConfig));try{return await lambda.invoke(req)}catch{return await(0,client_lambda_1.waitUntilFunctionActiveV2)({client:lambda,maxWaitTime:300},{FunctionName:req.FunctionName}),lambda.invoke(req)}}exports.startExecution=defaultStartExecution,exports.invokeFunction=defaultInvokeFunction,exports.httpRequest=defaultHttpRequest; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js new file mode 100644 index 000000000..47b472b09 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getEnv=getEnv,exports.log=log,exports.withRetries=withRetries,exports.parseJsonPayload=parseJsonPayload;function getEnv(name){const value=process.env[name];if(!value)throw new Error(`The environment variable "${name}" is not defined`);return value}function log(title,...args){console.log("[provider-framework]",title,...args.map(x=>typeof x=="object"?JSON.stringify(x,void 0,2):x))}function withRetries(options,fn){return async(...xs)=>{let attempts=options.attempts,ms=options.sleep;for(;;)try{return await fn(...xs)}catch(e){if(attempts--<=0)throw e;await sleep(Math.floor(Math.random()*ms)),ms*=2}}}async function sleep(ms){return new Promise(ok=>setTimeout(ok,ms))}function parseJsonPayload(payload){const text=new TextDecoder().decode(Buffer.from(payload??""));if(!text)return{};try{return JSON.parse(text)}catch{throw new Error(`return values from user-handlers must be JSON objects. got: "${text}"`)}} diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml new file mode 100644 index 000000000..b60599592 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/asset.c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml @@ -0,0 +1,39 @@ +openapi: "3.0.1" +info: + title: "api" + version: "2023-02-20T20:46:08Z" +paths: + /messages: + get: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: MessagesHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + x-amazon-apigateway-auth: + type: "AWS_IAM" + post: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: MessagesHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + x-amazon-apigateway-auth: + type: "AWS_IAM" + /photos: + get: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: PhotosHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + x-amazon-apigateway-auth: + type: "AWS_IAM" + post: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: PhotosHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + x-amazon-apigateway-auth: + type: "AWS_IAM" \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/cdk.out b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/cdk.out new file mode 100644 index 000000000..91e1a8b99 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"39.0.0"} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/integ.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/integ.json new file mode 100644 index 000000000..7dd6b6bb7 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/integ.json @@ -0,0 +1,12 @@ +{ + "version": "39.0.0", + "testCases": { + "opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest": { + "stacks": [ + "opilam-apiFromAssetLambdaFunctionAliases" + ], + "assertionStack": "opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest/DeployAssert", + "assertionStackName": "opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71" + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/manifest.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/manifest.json new file mode 100644 index 000000000..eebe3cd7c --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/manifest.json @@ -0,0 +1,269 @@ +{ + "version": "39.0.0", + "artifacts": { + "opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.assets" + ], + "metadata": { + "/opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest/DeployAssert" + }, + "opilam-apiFromAssetLambdaFunctionAliases.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "opilam-apiFromAssetLambdaFunctionAliases.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "opilam-apiFromAssetLambdaFunctionAliases": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "opilam-apiFromAssetLambdaFunctionAliases.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/90e62a6fcf8b3c3369d639d53ad7ae48d7a7b571c06fd65356e6c844754bb19d.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "opilam-apiFromAssetLambdaFunctionAliases.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "opilam-apiFromAssetLambdaFunctionAliases.assets" + ], + "metadata": { + "/opilam-apiFromAssetLambdaFunctionAliases/LambdaFunctionServiceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "LambdaFunctionServiceRole0C4CDE0B" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/LambdaFunctionServiceRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "LambdaFunctionServiceRoleDefaultPolicy126C8897" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "LambdaFunctionBF21E41F" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction/CurrentVersion/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "LambdaFunctionCurrentVersion7D5C86E3e1fbde6f17ee9d8a6083dfbb39f7780b" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAssetServiceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "PhotosLambdaTestFromAssetServiceRoleE0B4776B" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAssetServiceRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "PhotosLambdaTestFromAssetServiceRoleDefaultPolicy240F3F29" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAsset/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "PhotosLambdaTestFromAssetB776E3C5" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAsset/OpenApiGatewayToLambdaPermitAPIGInvocation": [ + { + "type": "aws:cdk:logicalId", + "data": "PhotosLambdaTestFromAssetOpenApiGatewayToLambdaPermitAPIGInvocationA0D5D04E" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/messages-alias/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "messagesalias73FA2C12" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/messages-alias/OpenApiGatewayToLambdaPermitAPIGInvocation": [ + { + "type": "aws:cdk:logicalId", + "data": "messagesaliasOpenApiGatewayToLambdaPermitAPIGInvocation4D73221A" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunctionServiceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunctionServiceRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaLambdaFunctionServiceRoleDefaultPolicy90DFA0A8" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunction/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaLambdaFunctionC7227471" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaApiTemplateWriterPolicy5B3085E5" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/ServiceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterCustomResource/Default": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiAccessLogGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaSpecRestApi27C18064" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/Deployment/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD077506cc115d2977eccc01a7a14e0a95492a" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/DeploymentStage.prod/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/Endpoint": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaSpecRestApiEndpointD1FA5E3A" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/UsagePlan/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaSpecRestApiUsagePlan44F6F5C6" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaRestApiCloudWatchRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaRestApiAccount": [ + { + "type": "aws:cdk:logicalId", + "data": "OpenApiGatewayToLambdaLambdaRestApiAccount71EC7DA6" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/LatestNodeRuntimeMap": [ + { + "type": "aws:cdk:logicalId", + "data": "LatestNodeRuntimeMap" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/opilam-apiFromAssetLambdaFunctionAliases/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "opilam-apiFromAssetLambdaFunctionAliases" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilam-apiFromAssetLambdaFunctionAliases.assets.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilam-apiFromAssetLambdaFunctionAliases.assets.json new file mode 100644 index 000000000..b06a54cc6 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilam-apiFromAssetLambdaFunctionAliases.assets.json @@ -0,0 +1,97 @@ +{ + "version": "39.0.0", + "files": { + "c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32": { + "source": { + "path": "asset.c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e": { + "source": { + "path": "asset.0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50": { + "source": { + "path": "asset.654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "7dbcd6245c5c6f70da313d31e9bd533af2214c565d855fb2f669666e927c125e": { + "source": { + "path": "asset.7dbcd6245c5c6f70da313d31e9bd533af2214c565d855fb2f669666e927c125e", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "7dbcd6245c5c6f70da313d31e9bd533af2214c565d855fb2f669666e927c125e.7dbcd6245c5c6f70da313d31e9bd533af2214c565d855fb2f669666e927c125e", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7": { + "source": { + "path": "asset.37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca": { + "source": { + "path": "asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "90e62a6fcf8b3c3369d639d53ad7ae48d7a7b571c06fd65356e6c844754bb19d": { + "source": { + "path": "opilam-apiFromAssetLambdaFunctionAliases.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "90e62a6fcf8b3c3369d639d53ad7ae48d7a7b571c06fd65356e6c844754bb19d.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilam-apiFromAssetLambdaFunctionAliases.template.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilam-apiFromAssetLambdaFunctionAliases.template.json new file mode 100644 index 000000000..6bfb541f9 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilam-apiFromAssetLambdaFunctionAliases.template.json @@ -0,0 +1,1181 @@ +{ + "Description": "Integration Test for aws-openapigateway-lambda", + "Resources": { + "LambdaFunctionServiceRole0C4CDE0B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + }, + "Metadata": { + "guard": { + "SuppressedRules": [ + "IAM_NO_INLINE_POLICY_CHECK" + ] + } + } + }, + "LambdaFunctionServiceRoleDefaultPolicy126C8897": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTelemetryRecords", + "xray:PutTraceSegments" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRoleDefaultPolicy126C8897", + "Roles": [ + { + "Ref": "LambdaFunctionServiceRole0C4CDE0B" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "LambdaFunctionBF21E41F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e.zip" + }, + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" + } + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, + "Runtime": "nodejs20.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "LambdaFunctionServiceRoleDefaultPolicy126C8897", + "LambdaFunctionServiceRole0C4CDE0B" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "LambdaFunctionCurrentVersion7D5C86E3e1fbde6f17ee9d8a6083dfbb39f7780b": { + "Type": "AWS::Lambda::Version", + "Properties": { + "FunctionName": { + "Ref": "LambdaFunctionBF21E41F" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "PhotosLambdaTestFromAssetServiceRoleE0B4776B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + }, + "Metadata": { + "guard": { + "SuppressedRules": [ + "IAM_NO_INLINE_POLICY_CHECK" + ] + } + } + }, + "PhotosLambdaTestFromAssetServiceRoleDefaultPolicy240F3F29": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTelemetryRecords", + "xray:PutTraceSegments" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "PhotosLambdaTestFromAssetServiceRoleDefaultPolicy240F3F29", + "Roles": [ + { + "Ref": "PhotosLambdaTestFromAssetServiceRoleE0B4776B" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "PhotosLambdaTestFromAssetB776E3C5": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip" + }, + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" + } + }, + "FunctionName": "PhotosLambdaTestFromAsset", + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "PhotosLambdaTestFromAssetServiceRoleE0B4776B", + "Arn" + ] + }, + "Runtime": "nodejs20.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "PhotosLambdaTestFromAssetServiceRoleDefaultPolicy240F3F29", + "PhotosLambdaTestFromAssetServiceRoleE0B4776B" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "PhotosLambdaTestFromAssetOpenApiGatewayToLambdaPermitAPIGInvocationA0D5D04E": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "PhotosLambdaTestFromAssetB776E3C5", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "messagesalias73FA2C12": { + "Type": "AWS::Lambda::Alias", + "Properties": { + "FunctionName": { + "Ref": "LambdaFunctionBF21E41F" + }, + "FunctionVersion": { + "Fn::GetAtt": [ + "LambdaFunctionCurrentVersion7D5C86E3e1fbde6f17ee9d8a6083dfbb39f7780b", + "Version" + ] + }, + "Name": "messagesAlias" + } + }, + "messagesaliasOpenApiGatewayToLambdaPermitAPIGInvocation4D73221A": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Ref": "messagesalias73FA2C12" + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + }, + "Metadata": { + "guard": { + "SuppressedRules": [ + "IAM_NO_INLINE_POLICY_CHECK" + ] + } + } + }, + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleDefaultPolicy90DFA0A8": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTelemetryRecords", + "xray:PutTraceSegments" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaLambdaFunctionServiceRoleDefaultPolicy90DFA0A8", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "OpenApiGatewayToLambdaLambdaFunctionC7227471": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7.zip" + }, + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" + } + }, + "Handler": "index.handler", + "MemorySize": 1024, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85", + "Arn" + ] + }, + "Runtime": "nodejs20.x", + "Timeout": 60, + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleDefaultPolicy90DFA0A8", + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterPolicy5B3085E5": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml" + ] + ] + } + }, + { + "Action": "s3:PutObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiTemplateWriterPolicy5B3085E5", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85" + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + ":*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca.zip" + }, + "Description": "AWS CDK resource provider framework - onEvent (opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", + "Environment": { + "Variables": { + "USER_ON_EVENT_FUNCTION_ARN": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + } + } + }, + "Handler": "framework.onEvent", + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", + "Arn" + ] + }, + "Runtime": { + "Fn::FindInMap": [ + "LatestNodeRuntimeMap", + { + "Ref": "AWS::Region" + }, + "value" + ] + }, + "Timeout": 900 + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework has an IAM role with the arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Managed Policy attached, which grants permission to write to CloudWatch Logs" + }, + { + "id": "W89", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not access VPC resources" + }, + { + "id": "W92", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not define ReservedConcurrentExecutions" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4": { + "Type": "Custom::TemplateWriter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730", + "Arn" + ] + }, + "TemplateValues": { + "Fn::Join": [ + "", + [ + "{\"templateValues\":[{\"id\":\"MessagesHandler\",\"value\":\"arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Ref": "messagesalias73FA2C12" + }, + "/invocations\"},{\"id\":\"PhotosHandler\",\"value\":\"arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "PhotosLambdaTestFromAssetB776E3C5", + "Arn" + ] + }, + "/invocations\"}]}" + ] + ] + }, + "TemplateInputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "TemplateInputKey": "c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml", + "TemplateOutputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiTemplateWriterPolicy5B3085E5" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W86", + "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" + }, + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApi27C18064": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "BodyS3Location": { + "Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "Key": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4", + "TemplateOutputKey" + ] + } + }, + "Name": { + "Fn::Join": [ + "", + [ + "OpenApiGatewayToLambda-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD077506cc115d2977eccc01a7a14e0a95492a": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "Description": "Automatically created by the RestApi construct", + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W45", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" + } + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "AccessLogSetting": { + "DestinationArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC", + "Arn" + ] + }, + "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" + }, + "DeploymentId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD077506cc115d2977eccc01a7a14e0a95492a" + }, + "MethodSettings": [ + { + "DataTraceEnabled": false, + "HttpMethod": "*", + "LoggingLevel": "INFO", + "ResourcePath": "/*" + } + ], + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "StageName": "prod", + "TracingEnabled": true + }, + "Metadata": { + "guard": { + "SuppressedRules": [ + "API_GW_CACHE_ENABLED_AND_ENCRYPTED" + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApiUsagePlan44F6F5C6": { + "Type": "AWS::ApiGateway::UsagePlan", + "Properties": { + "ApiStages": [ + { + "ApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "Stage": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "Throttle": {} + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "apigateway.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:DescribeLogGroups", + "logs:DescribeLogStreams", + "logs:FilterLogEvents", + "logs:GetLogEvents", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaRestApiCloudWatchRolePolicy" + } + ] + }, + "Metadata": { + "guard": { + "SuppressedRules": [ + "IAM_NO_INLINE_POLICY_CHECK" + ] + } + } + }, + "OpenApiGatewayToLambdaLambdaRestApiAccount71EC7DA6": { + "Type": "AWS::ApiGateway::Account", + "Properties": { + "CloudWatchRoleArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95", + "Arn" + ] + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaSpecRestApi27C18064" + ] + } + }, + "Outputs": { + "OpenApiGatewayToLambdaSpecRestApiEndpointD1FA5E3A": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "/" + ] + ] + } + } + }, + "Mappings": { + "LatestNodeRuntimeMap": { + "af-south-1": { + "value": "nodejs20.x" + }, + "ap-east-1": { + "value": "nodejs20.x" + }, + "ap-northeast-1": { + "value": "nodejs20.x" + }, + "ap-northeast-2": { + "value": "nodejs20.x" + }, + "ap-northeast-3": { + "value": "nodejs20.x" + }, + "ap-south-1": { + "value": "nodejs20.x" + }, + "ap-south-2": { + "value": "nodejs20.x" + }, + "ap-southeast-1": { + "value": "nodejs20.x" + }, + "ap-southeast-2": { + "value": "nodejs20.x" + }, + "ap-southeast-3": { + "value": "nodejs20.x" + }, + "ap-southeast-4": { + "value": "nodejs20.x" + }, + "ap-southeast-5": { + "value": "nodejs20.x" + }, + "ap-southeast-7": { + "value": "nodejs20.x" + }, + "ca-central-1": { + "value": "nodejs20.x" + }, + "ca-west-1": { + "value": "nodejs20.x" + }, + "cn-north-1": { + "value": "nodejs18.x" + }, + "cn-northwest-1": { + "value": "nodejs18.x" + }, + "eu-central-1": { + "value": "nodejs20.x" + }, + "eu-central-2": { + "value": "nodejs20.x" + }, + "eu-isoe-west-1": { + "value": "nodejs18.x" + }, + "eu-north-1": { + "value": "nodejs20.x" + }, + "eu-south-1": { + "value": "nodejs20.x" + }, + "eu-south-2": { + "value": "nodejs20.x" + }, + "eu-west-1": { + "value": "nodejs20.x" + }, + "eu-west-2": { + "value": "nodejs20.x" + }, + "eu-west-3": { + "value": "nodejs20.x" + }, + "il-central-1": { + "value": "nodejs20.x" + }, + "me-central-1": { + "value": "nodejs20.x" + }, + "me-south-1": { + "value": "nodejs20.x" + }, + "mx-central-1": { + "value": "nodejs20.x" + }, + "sa-east-1": { + "value": "nodejs20.x" + }, + "us-east-1": { + "value": "nodejs20.x" + }, + "us-east-2": { + "value": "nodejs20.x" + }, + "us-gov-east-1": { + "value": "nodejs18.x" + }, + "us-gov-west-1": { + "value": "nodejs18.x" + }, + "us-iso-east-1": { + "value": "nodejs18.x" + }, + "us-iso-west-1": { + "value": "nodejs18.x" + }, + "us-isob-east-1": { + "value": "nodejs18.x" + }, + "us-west-1": { + "value": "nodejs20.x" + }, + "us-west-2": { + "value": "nodejs20.x" + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.assets.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.assets.json new file mode 100644 index 000000000..ec9a8c3c5 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.assets.json @@ -0,0 +1,19 @@ +{ + "version": "39.0.0", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "source": { + "path": "opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.template.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.template.json new file mode 100644 index 000000000..ad9d0fb73 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/opilamapiFromAssetLambdaFunctionAliasesIntegDefaultTestDeployAssertE338EC71.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/tree.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/tree.json new file mode 100644 index 000000000..b1b9f8901 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.js.snapshot/tree.json @@ -0,0 +1,1518 @@ +{ + "version": "tree-0.1", + "tree": { + "id": "App", + "path": "", + "children": { + "opilam-apiFromAssetLambdaFunctionAliases": { + "id": "opilam-apiFromAssetLambdaFunctionAliases", + "path": "opilam-apiFromAssetLambdaFunctionAliases", + "children": { + "ApiDefinitionAsset": { + "id": "ApiDefinitionAsset", + "path": "opilam-apiFromAssetLambdaFunctionAliases/ApiDefinitionAsset", + "children": { + "Stage": { + "id": "Stage", + "path": "opilam-apiFromAssetLambdaFunctionAliases/ApiDefinitionAsset/Stage", + "constructInfo": { + "fqn": "aws-cdk-lib.AssetStaging", + "version": "2.177.0" + } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "opilam-apiFromAssetLambdaFunctionAliases/ApiDefinitionAsset/AssetBucket", + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3.BucketBase", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3_assets.Asset", + "version": "2.177.0" + } + }, + "LambdaFunctionServiceRole": { + "id": "LambdaFunctionServiceRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunctionServiceRole", + "children": { + "ImportLambdaFunctionServiceRole": { + "id": "ImportLambdaFunctionServiceRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunctionServiceRole/ImportLambdaFunctionServiceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunctionServiceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "policies": [ + { + "policyName": "LambdaFunctionServiceRolePolicy", + "policyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "2.177.0" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunctionServiceRole/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunctionServiceRole/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTelemetryRecords", + "xray:PutTraceSegments" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "policyName": "LambdaFunctionServiceRoleDefaultPolicy126C8897", + "roles": [ + { + "Ref": "LambdaFunctionServiceRole0C4CDE0B" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "2.177.0" + } + }, + "LambdaFunction": { + "id": "LambdaFunction", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction", + "children": { + "Code": { + "id": "Code", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction/Code", + "children": { + "Stage": { + "id": "Stage", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction/Code/Stage", + "constructInfo": { + "fqn": "aws-cdk-lib.AssetStaging", + "version": "2.177.0" + } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction/Code/AssetBucket", + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3.BucketBase", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3_assets.Asset", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Function", + "aws:cdk:cloudformation:props": { + "code": { + "s3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "s3Key": "0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e.zip" + }, + "environment": { + "variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" + } + }, + "handler": "index.handler", + "role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, + "runtime": "nodejs20.x", + "tracingConfig": { + "mode": "Active" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", + "version": "2.177.0" + } + }, + "CurrentVersion": { + "id": "CurrentVersion", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction/CurrentVersion", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LambdaFunction/CurrentVersion/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Version", + "aws:cdk:cloudformation:props": { + "functionName": { + "Ref": "LambdaFunctionBF21E41F" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnVersion", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.Version", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.Function", + "version": "2.177.0" + } + }, + "PhotosLambdaTestFromAssetServiceRole": { + "id": "PhotosLambdaTestFromAssetServiceRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAssetServiceRole", + "children": { + "ImportPhotosLambdaTestFromAssetServiceRole": { + "id": "ImportPhotosLambdaTestFromAssetServiceRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAssetServiceRole/ImportPhotosLambdaTestFromAssetServiceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAssetServiceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "policies": [ + { + "policyName": "LambdaFunctionServiceRolePolicy", + "policyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "2.177.0" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAssetServiceRole/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAssetServiceRole/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTelemetryRecords", + "xray:PutTraceSegments" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "policyName": "PhotosLambdaTestFromAssetServiceRoleDefaultPolicy240F3F29", + "roles": [ + { + "Ref": "PhotosLambdaTestFromAssetServiceRoleE0B4776B" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "2.177.0" + } + }, + "PhotosLambdaTestFromAsset": { + "id": "PhotosLambdaTestFromAsset", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAsset", + "children": { + "Code": { + "id": "Code", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAsset/Code", + "children": { + "Stage": { + "id": "Stage", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAsset/Code/Stage", + "constructInfo": { + "fqn": "aws-cdk-lib.AssetStaging", + "version": "2.177.0" + } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAsset/Code/AssetBucket", + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3.BucketBase", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3_assets.Asset", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAsset/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Function", + "aws:cdk:cloudformation:props": { + "code": { + "s3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "s3Key": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip" + }, + "environment": { + "variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" + } + }, + "functionName": "PhotosLambdaTestFromAsset", + "handler": "index.handler", + "role": { + "Fn::GetAtt": [ + "PhotosLambdaTestFromAssetServiceRoleE0B4776B", + "Arn" + ] + }, + "runtime": "nodejs20.x", + "tracingConfig": { + "mode": "Active" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", + "version": "2.177.0" + } + }, + "OpenApiGatewayToLambdaPermitAPIGInvocation": { + "id": "OpenApiGatewayToLambdaPermitAPIGInvocation", + "path": "opilam-apiFromAssetLambdaFunctionAliases/PhotosLambdaTestFromAsset/OpenApiGatewayToLambdaPermitAPIGInvocation", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Permission", + "aws:cdk:cloudformation:props": { + "action": "lambda:InvokeFunction", + "functionName": { + "Fn::GetAtt": [ + "PhotosLambdaTestFromAssetB776E3C5", + "Arn" + ] + }, + "principal": "apigateway.amazonaws.com", + "sourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.Function", + "version": "2.177.0" + } + }, + "messages-alias": { + "id": "messages-alias", + "path": "opilam-apiFromAssetLambdaFunctionAliases/messages-alias", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/messages-alias/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Alias", + "aws:cdk:cloudformation:props": { + "functionName": { + "Ref": "LambdaFunctionBF21E41F" + }, + "functionVersion": { + "Fn::GetAtt": [ + "LambdaFunctionCurrentVersion7D5C86E3e1fbde6f17ee9d8a6083dfbb39f7780b", + "Version" + ] + }, + "name": "messagesAlias" + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnAlias", + "version": "2.177.0" + } + }, + "ScalingRole": { + "id": "ScalingRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/messages-alias/ScalingRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "2.177.0" + } + }, + "OpenApiGatewayToLambdaPermitAPIGInvocation": { + "id": "OpenApiGatewayToLambdaPermitAPIGInvocation", + "path": "opilam-apiFromAssetLambdaFunctionAliases/messages-alias/OpenApiGatewayToLambdaPermitAPIGInvocation", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Permission", + "aws:cdk:cloudformation:props": { + "action": "lambda:InvokeFunction", + "functionName": { + "Ref": "messagesalias73FA2C12" + }, + "principal": "apigateway.amazonaws.com", + "sourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.Alias", + "version": "2.177.0" + } + }, + "OpenApiGatewayToLambda": { + "id": "OpenApiGatewayToLambda", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda", + "children": { + "ApiOutputAsset": { + "id": "ApiOutputAsset", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiOutputAsset", + "children": { + "Stage": { + "id": "Stage", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiOutputAsset/Stage", + "constructInfo": { + "fqn": "aws-cdk-lib.AssetStaging", + "version": "2.177.0" + } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiOutputAsset/AssetBucket", + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3.BucketBase", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3_assets.Asset", + "version": "2.177.0" + } + }, + "LambdaFunctionServiceRole": { + "id": "LambdaFunctionServiceRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunctionServiceRole", + "children": { + "ImportLambdaFunctionServiceRole": { + "id": "ImportLambdaFunctionServiceRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunctionServiceRole/ImportLambdaFunctionServiceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunctionServiceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "policies": [ + { + "policyName": "LambdaFunctionServiceRolePolicy", + "policyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "2.177.0" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunctionServiceRole/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunctionServiceRole/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTelemetryRecords", + "xray:PutTraceSegments" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "policyName": "OpenApiGatewayToLambdaLambdaFunctionServiceRoleDefaultPolicy90DFA0A8", + "roles": [ + { + "Ref": "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "2.177.0" + } + }, + "LambdaFunction": { + "id": "LambdaFunction", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunction", + "children": { + "Code": { + "id": "Code", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunction/Code", + "children": { + "Stage": { + "id": "Stage", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunction/Code/Stage", + "constructInfo": { + "fqn": "aws-cdk-lib.AssetStaging", + "version": "2.177.0" + } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunction/Code/AssetBucket", + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3.BucketBase", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3_assets.Asset", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaFunction/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Function", + "aws:cdk:cloudformation:props": { + "code": { + "s3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "s3Key": "37a6f0964e9c5c4133e01db00bbcaebc6da2a25a21e27aa0f87add1eb65546e7.zip" + }, + "environment": { + "variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" + } + }, + "handler": "index.handler", + "memorySize": 1024, + "role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85", + "Arn" + ] + }, + "runtime": "nodejs20.x", + "timeout": 60, + "tracingConfig": { + "mode": "Active" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.Function", + "version": "2.177.0" + } + }, + "ApiTemplateWriterPolicy": { + "id": "ApiTemplateWriterPolicy", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml" + ] + ] + } + }, + { + "Action": "s3:PutObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "policyName": "OpenApiGatewayToLambdaApiTemplateWriterPolicy5B3085E5", + "roles": [ + { + "Ref": "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "2.177.0" + } + }, + "ApiTemplateWriterProvider": { + "id": "ApiTemplateWriterProvider", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider", + "children": { + "framework-onEvent": { + "id": "framework-onEvent", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent", + "children": { + "ServiceRole": { + "id": "ServiceRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/ServiceRole", + "children": { + "ImportServiceRole": { + "id": "ImportServiceRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/ServiceRole/ImportServiceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/ServiceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "managedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "2.177.0" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/ServiceRole/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/ServiceRole/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + ":*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "policyName": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "2.177.0" + } + }, + "Code": { + "id": "Code", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/Code", + "children": { + "Stage": { + "id": "Stage", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/Code/Stage", + "constructInfo": { + "fqn": "aws-cdk-lib.AssetStaging", + "version": "2.177.0" + } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/Code/AssetBucket", + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3.BucketBase", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_s3_assets.Asset", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Function", + "aws:cdk:cloudformation:props": { + "code": { + "s3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "s3Key": "bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca.zip" + }, + "description": "AWS CDK resource provider framework - onEvent (opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", + "environment": { + "variables": { + "USER_ON_EVENT_FUNCTION_ARN": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + } + } + }, + "handler": "framework.onEvent", + "role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", + "Arn" + ] + }, + "runtime": { + "Fn::FindInMap": [ + "LatestNodeRuntimeMap", + { + "Ref": "AWS::Region" + }, + "value" + ] + }, + "timeout": 900 + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.Function", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.custom_resources.Provider", + "version": "2.177.0" + } + }, + "ApiTemplateWriterCustomResource": { + "id": "ApiTemplateWriterCustomResource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterCustomResource", + "children": { + "Default": { + "id": "Default", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiTemplateWriterCustomResource/Default", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnResource", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.CustomResource", + "version": "2.177.0" + } + }, + "ApiAccessLogGroup": { + "id": "ApiAccessLogGroup", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiAccessLogGroup", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/ApiAccessLogGroup/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup", + "aws:cdk:cloudformation:props": {} + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_logs.LogGroup", + "version": "2.177.0" + } + }, + "SpecRestApi": { + "id": "SpecRestApi", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGateway::RestApi", + "aws:cdk:cloudformation:props": { + "bodyS3Location": { + "bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "key": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4", + "TemplateOutputKey" + ] + } + }, + "name": { + "Fn::Join": [ + "", + [ + "OpenApiGatewayToLambda-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.CfnRestApi", + "version": "2.177.0" + } + }, + "Default": { + "id": "Default", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/Default", + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.ResourceBase", + "version": "2.177.0" + } + }, + "Deployment": { + "id": "Deployment", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/Deployment", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/Deployment/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGateway::Deployment", + "aws:cdk:cloudformation:props": { + "description": "Automatically created by the RestApi construct", + "restApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.CfnDeployment", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.Deployment", + "version": "2.177.0" + } + }, + "DeploymentStage.prod": { + "id": "DeploymentStage.prod", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/DeploymentStage.prod", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/DeploymentStage.prod/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGateway::Stage", + "aws:cdk:cloudformation:props": { + "accessLogSetting": { + "destinationArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC", + "Arn" + ] + }, + "format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" + }, + "deploymentId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD077506cc115d2977eccc01a7a14e0a95492a" + }, + "methodSettings": [ + { + "httpMethod": "*", + "resourcePath": "/*", + "dataTraceEnabled": false, + "loggingLevel": "INFO" + } + ], + "restApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "stageName": "prod", + "tracingEnabled": true + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.CfnStage", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.Stage", + "version": "2.177.0" + } + }, + "Endpoint": { + "id": "Endpoint", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/Endpoint", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnOutput", + "version": "2.177.0" + } + }, + "UsagePlan": { + "id": "UsagePlan", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/UsagePlan", + "children": { + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/SpecRestApi/UsagePlan/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGateway::UsagePlan", + "aws:cdk:cloudformation:props": { + "apiStages": [ + { + "apiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "stage": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "throttle": {} + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.CfnUsagePlan", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.UsagePlan", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.SpecRestApi", + "version": "2.177.0" + } + }, + "LambdaRestApiCloudWatchRole": { + "id": "LambdaRestApiCloudWatchRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaRestApiCloudWatchRole", + "children": { + "ImportLambdaRestApiCloudWatchRole": { + "id": "ImportLambdaRestApiCloudWatchRole", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaRestApiCloudWatchRole/ImportLambdaRestApiCloudWatchRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "2.177.0" + } + }, + "Resource": { + "id": "Resource", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaRestApiCloudWatchRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "apigateway.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "policies": [ + { + "policyName": "LambdaRestApiCloudWatchRolePolicy", + "policyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:DescribeLogGroups", + "logs:DescribeLogStreams", + "logs:FilterLogEvents", + "logs:GetLogEvents", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "2.177.0" + } + }, + "LambdaRestApiAccount": { + "id": "LambdaRestApiAccount", + "path": "opilam-apiFromAssetLambdaFunctionAliases/OpenApiGatewayToLambda/LambdaRestApiAccount", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGateway::Account", + "aws:cdk:cloudformation:props": { + "cloudWatchRoleArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95", + "Arn" + ] + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apigateway.CfnAccount", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-solutions-constructs/aws-openapigateway-lambda.OpenApiGatewayToLambda", + "version": "2.77.0" + } + }, + "LatestNodeRuntimeMap": { + "id": "LatestNodeRuntimeMap", + "path": "opilam-apiFromAssetLambdaFunctionAliases/LatestNodeRuntimeMap", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnMapping", + "version": "2.177.0" + } + }, + "Integ": { + "id": "Integ", + "path": "opilam-apiFromAssetLambdaFunctionAliases/Integ", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest/DeployAssert", + "children": { + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "2.177.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "opilam-apiFromAssetLambdaFunctionAliases/Integ/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase", + "version": "2.177.0-alpha.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTest", + "version": "2.177.0-alpha.0" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "opilam-apiFromAssetLambdaFunctionAliases/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "2.177.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "opilam-apiFromAssetLambdaFunctionAliases/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "2.177.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "2.177.0" + } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.App", + "version": "2.177.0" + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.ts new file mode 100644 index 000000000..64be10dc7 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetLambdaFunctionAliases.ts @@ -0,0 +1,72 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; +import { OpenApiGatewayToLambda } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as defaults from '@aws-solutions-constructs/core'; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as path from 'path'; +import { IntegTest } from '@aws-cdk/integ-tests-alpha'; + +const app = new App(); +const stack = new Stack(app, defaults.generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for aws-openapigateway-lambda'; + +const apiDefinitionAsset = new Asset(stack, 'ApiDefinitionAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') +}); + +const messagesLambda = defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + runtime: defaults.COMMERCIAL_REGION_LAMBDA_NODE_RUNTIME, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + currentVersionOptions: { + removalPolicy: RemovalPolicy.RETAIN, + }, + } +}); + +const photosLambda = defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + functionName: 'PhotosLambdaTestFromAsset', + runtime: defaults.COMMERCIAL_REGION_LAMBDA_NODE_RUNTIME, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + } +}); + +const messagesAlias = new lambda.Alias(stack, 'messages-alias', { + version: messagesLambda.currentVersion, + aliasName: 'messagesAlias', +}); + +new OpenApiGatewayToLambda(stack, 'OpenApiGatewayToLambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + existingLambdaObj: messagesAlias + }, + { + id: 'PhotosHandler', + existingLambdaObj: photosLambda + } + ] +}); + +// Synth +new IntegTest(stack, 'Integ', { testCases: [ + stack +] }); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e/index.mjs b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e/index.mjs new file mode 100644 index 000000000..55e35c614 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e/index.mjs @@ -0,0 +1,16 @@ +export const handler = async (event) => { + switch (event.httpMethod) { + case 'POST': + return { + statusCode: 200, + body: JSON.stringify({"message": "NEW - successfully handled POST from messages lambda"}) + }; + case 'GET': + return { + statusCode: 200, + body: JSON.stringify({"message": "NEW - successfully handled GET from messages lambda"}) + }; + default: + throw new Error(`cannot handle httpMethod: ${event.httpMethod}`); + } +}; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/cfn-response.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/cfn-response.js deleted file mode 100644 index 4ca603b04..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/cfn-response.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Retry=exports.redactDataFromPayload=exports.safeHandler=exports.includeStackTraces=exports.submitResponse=exports.MISSING_PHYSICAL_ID_MARKER=exports.CREATE_FAILED_PHYSICAL_ID_MARKER=void 0;const url=require("url"),outbound_1=require("./outbound"),util_1=require("./util");exports.CREATE_FAILED_PHYSICAL_ID_MARKER="AWSCDK::CustomResourceProviderFramework::CREATE_FAILED",exports.MISSING_PHYSICAL_ID_MARKER="AWSCDK::CustomResourceProviderFramework::MISSING_PHYSICAL_ID";async function submitResponse(status,event,options={}){const json={Status:status,Reason:options.reason||status,StackId:event.StackId,RequestId:event.RequestId,PhysicalResourceId:event.PhysicalResourceId||exports.MISSING_PHYSICAL_ID_MARKER,LogicalResourceId:event.LogicalResourceId,NoEcho:options.noEcho,Data:event.Data},responseBody=JSON.stringify(json),parsedUrl=url.parse(event.ResponseURL),loggingSafeUrl=`${parsedUrl.protocol}//${parsedUrl.hostname}/${parsedUrl.pathname}?***`;options?.noEcho?(0,util_1.log)("submit redacted response to cloudformation",loggingSafeUrl,redactDataFromPayload(json)):(0,util_1.log)("submit response to cloudformation",loggingSafeUrl,json);const retryOptions={attempts:5,sleep:1e3};await(0,util_1.withRetries)(retryOptions,outbound_1.httpRequest)({hostname:parsedUrl.hostname,path:parsedUrl.path,method:"PUT",headers:{"content-type":"","content-length":Buffer.byteLength(responseBody,"utf8")}},responseBody)}exports.submitResponse=submitResponse,exports.includeStackTraces=!0;function safeHandler(block){return async event=>{if(event.RequestType==="Delete"&&event.PhysicalResourceId===exports.CREATE_FAILED_PHYSICAL_ID_MARKER){(0,util_1.log)("ignoring DELETE event caused by a failed CREATE event"),await submitResponse("SUCCESS",event);return}try{await block(event)}catch(e){if(e instanceof Retry)throw(0,util_1.log)("retry requested by handler"),e;event.PhysicalResourceId||(event.RequestType==="Create"?((0,util_1.log)("CREATE failed, responding with a marker physical resource id so that the subsequent DELETE will be ignored"),event.PhysicalResourceId=exports.CREATE_FAILED_PHYSICAL_ID_MARKER):(0,util_1.log)(`ERROR: Malformed event. "PhysicalResourceId" is required: ${JSON.stringify({...event,ResponseURL:"..."})}`)),await submitResponse("FAILED",event,{reason:exports.includeStackTraces?e.stack:e.message})}}}exports.safeHandler=safeHandler;function redactDataFromPayload(payload){const redactedPayload=JSON.parse(JSON.stringify(payload));if(redactedPayload.Data){const keys=Object.keys(redactedPayload.Data);for(const key of keys)redactedPayload.Data[key]="*****"}return redactedPayload}exports.redactDataFromPayload=redactDataFromPayload;class Retry extends Error{}exports.Retry=Retry; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/util.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/util.js deleted file mode 100644 index 5a5a52b76..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e/util.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseJsonPayload=exports.withRetries=exports.log=exports.getEnv=void 0;function getEnv(name){const value=process.env[name];if(!value)throw new Error(`The environment variable "${name}" is not defined`);return value}exports.getEnv=getEnv;function log(title,...args){console.log("[provider-framework]",title,...args.map(x=>typeof x=="object"?JSON.stringify(x,void 0,2):x))}exports.log=log;function withRetries(options,fn){return async(...xs)=>{let attempts=options.attempts,ms=options.sleep;for(;;)try{return await fn(...xs)}catch(e){if(attempts--<=0)throw e;await sleep(Math.floor(Math.random()*ms)),ms*=2}}}exports.withRetries=withRetries;async function sleep(ms){return new Promise(ok=>setTimeout(ok,ms))}function parseJsonPayload(payload){const text=new TextDecoder().decode(Buffer.from(payload??""));if(!text)return{};try{return JSON.parse(text)}catch{throw new Error(`return values from user-handlers must be JSON objects. got: "${text}"`)}}exports.parseJsonPayload=parseJsonPayload; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js new file mode 100644 index 000000000..17c9ea7df --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Retry=exports.includeStackTraces=exports.MISSING_PHYSICAL_ID_MARKER=exports.CREATE_FAILED_PHYSICAL_ID_MARKER=void 0,exports.submitResponse=submitResponse,exports.safeHandler=safeHandler,exports.redactDataFromPayload=redactDataFromPayload;const url=require("url"),outbound_1=require("./outbound"),util_1=require("./util");exports.CREATE_FAILED_PHYSICAL_ID_MARKER="AWSCDK::CustomResourceProviderFramework::CREATE_FAILED",exports.MISSING_PHYSICAL_ID_MARKER="AWSCDK::CustomResourceProviderFramework::MISSING_PHYSICAL_ID";async function submitResponse(status,event,options={}){const json={Status:status,Reason:options.reason||status,StackId:event.StackId,RequestId:event.RequestId,PhysicalResourceId:event.PhysicalResourceId||exports.MISSING_PHYSICAL_ID_MARKER,LogicalResourceId:event.LogicalResourceId,NoEcho:options.noEcho,Data:event.Data},responseBody=JSON.stringify(json),parsedUrl=url.parse(event.ResponseURL),loggingSafeUrl=`${parsedUrl.protocol}//${parsedUrl.hostname}/${parsedUrl.pathname}?***`;options?.noEcho?(0,util_1.log)("submit redacted response to cloudformation",loggingSafeUrl,redactDataFromPayload(json)):(0,util_1.log)("submit response to cloudformation",loggingSafeUrl,json);const retryOptions={attempts:5,sleep:1e3};await(0,util_1.withRetries)(retryOptions,outbound_1.httpRequest)({hostname:parsedUrl.hostname,path:parsedUrl.path,method:"PUT",headers:{"content-type":"","content-length":Buffer.byteLength(responseBody,"utf8")}},responseBody)}exports.includeStackTraces=!0;function safeHandler(block){return async event=>{if(event.RequestType==="Delete"&&event.PhysicalResourceId===exports.CREATE_FAILED_PHYSICAL_ID_MARKER){(0,util_1.log)("ignoring DELETE event caused by a failed CREATE event"),await submitResponse("SUCCESS",event);return}try{await block(event)}catch(e){if(e instanceof Retry)throw(0,util_1.log)("retry requested by handler"),e;event.PhysicalResourceId||(event.RequestType==="Create"?((0,util_1.log)("CREATE failed, responding with a marker physical resource id so that the subsequent DELETE will be ignored"),event.PhysicalResourceId=exports.CREATE_FAILED_PHYSICAL_ID_MARKER):(0,util_1.log)(`ERROR: Malformed event. "PhysicalResourceId" is required: ${JSON.stringify({...event,ResponseURL:"..."})}`)),await submitResponse("FAILED",event,{reason:exports.includeStackTraces?e.stack:e.message})}}}function redactDataFromPayload(payload){const redactedPayload=JSON.parse(JSON.stringify(payload));if(redactedPayload.Data){const keys=Object.keys(redactedPayload.Data);for(const key of keys)redactedPayload.Data[key]="*****"}return redactedPayload}class Retry extends Error{}exports.Retry=Retry; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js new file mode 100644 index 000000000..5c78d63db --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FRAMEWORK_ON_TIMEOUT_HANDLER_NAME=exports.FRAMEWORK_IS_COMPLETE_HANDLER_NAME=exports.FRAMEWORK_ON_EVENT_HANDLER_NAME=exports.WAITER_STATE_MACHINE_ARN_ENV=exports.USER_IS_COMPLETE_FUNCTION_ARN_ENV=exports.USER_ON_EVENT_FUNCTION_ARN_ENV=void 0,exports.USER_ON_EVENT_FUNCTION_ARN_ENV="USER_ON_EVENT_FUNCTION_ARN",exports.USER_IS_COMPLETE_FUNCTION_ARN_ENV="USER_IS_COMPLETE_FUNCTION_ARN",exports.WAITER_STATE_MACHINE_ARN_ENV="WAITER_STATE_MACHINE_ARN",exports.FRAMEWORK_ON_EVENT_HANDLER_NAME="onEvent",exports.FRAMEWORK_IS_COMPLETE_HANDLER_NAME="isComplete",exports.FRAMEWORK_ON_TIMEOUT_HANDLER_NAME="onTimeout"; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js new file mode 100644 index 000000000..952048e6f --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js @@ -0,0 +1,3 @@ +"use strict";const cfnResponse=require("./cfn-response"),consts=require("./consts"),outbound_1=require("./outbound"),util_1=require("./util");async function onEvent(cfnRequest){const sanitizedRequest={...cfnRequest,ResponseURL:"..."};(0,util_1.log)("onEventHandler",sanitizedRequest),cfnRequest.ResourceProperties=cfnRequest.ResourceProperties||{};const onEventResult=await invokeUserFunction(consts.USER_ON_EVENT_FUNCTION_ARN_ENV,sanitizedRequest,cfnRequest.ResponseURL);onEventResult?.NoEcho?(0,util_1.log)("redacted onEvent returned:",cfnResponse.redactDataFromPayload(onEventResult)):(0,util_1.log)("onEvent returned:",onEventResult);const resourceEvent=createResponseEvent(cfnRequest,onEventResult),sanitizedEvent={...resourceEvent,ResponseURL:"..."};if(onEventResult?.NoEcho?(0,util_1.log)("readacted event:",cfnResponse.redactDataFromPayload(sanitizedEvent)):(0,util_1.log)("event:",sanitizedEvent),!process.env[consts.USER_IS_COMPLETE_FUNCTION_ARN_ENV])return cfnResponse.submitResponse("SUCCESS",resourceEvent,{noEcho:resourceEvent.NoEcho});const waiter={stateMachineArn:(0,util_1.getEnv)(consts.WAITER_STATE_MACHINE_ARN_ENV),name:resourceEvent.RequestId,input:JSON.stringify(resourceEvent)};(0,util_1.log)("starting waiter",{stateMachineArn:(0,util_1.getEnv)(consts.WAITER_STATE_MACHINE_ARN_ENV),name:resourceEvent.RequestId}),await(0,outbound_1.startExecution)(waiter)}async function isComplete(event){const sanitizedRequest={...event,ResponseURL:"..."};event?.NoEcho?(0,util_1.log)("redacted isComplete request",cfnResponse.redactDataFromPayload(sanitizedRequest)):(0,util_1.log)("isComplete",sanitizedRequest);const isCompleteResult=await invokeUserFunction(consts.USER_IS_COMPLETE_FUNCTION_ARN_ENV,sanitizedRequest,event.ResponseURL);if(event?.NoEcho?(0,util_1.log)("redacted user isComplete returned:",cfnResponse.redactDataFromPayload(isCompleteResult)):(0,util_1.log)("user isComplete returned:",isCompleteResult),!isCompleteResult.IsComplete)throw isCompleteResult.Data&&Object.keys(isCompleteResult.Data).length>0?new Error('"Data" is not allowed if "IsComplete" is "False"'):new cfnResponse.Retry(JSON.stringify(event));const response={...event,...isCompleteResult,Data:{...event.Data,...isCompleteResult.Data}};await cfnResponse.submitResponse("SUCCESS",response,{noEcho:event.NoEcho})}async function onTimeout(timeoutEvent){(0,util_1.log)("timeoutHandler",timeoutEvent);const isCompleteRequest=JSON.parse(JSON.parse(timeoutEvent.Cause).errorMessage);await cfnResponse.submitResponse("FAILED",isCompleteRequest,{reason:"Operation timed out"})}async function invokeUserFunction(functionArnEnv,sanitizedPayload,responseUrl){const functionArn=(0,util_1.getEnv)(functionArnEnv);(0,util_1.log)(`executing user function ${functionArn} with payload`,sanitizedPayload);const resp=await(0,outbound_1.invokeFunction)({FunctionName:functionArn,Payload:JSON.stringify({...sanitizedPayload,ResponseURL:responseUrl})});(0,util_1.log)("user function response:",resp,typeof resp);const jsonPayload=(0,util_1.parseJsonPayload)(resp.Payload);if(resp.FunctionError){(0,util_1.log)("user function threw an error:",resp.FunctionError);const errorMessage=jsonPayload.errorMessage||"error",arn=functionArn.split(":"),functionName=arn[arn.length-1],message=[errorMessage,"",`Logs: /aws/lambda/${functionName}`,""].join(` +`),e=new Error(message);throw jsonPayload.trace&&(e.stack=[message,...jsonPayload.trace.slice(1)].join(` +`)),e}return jsonPayload}function createResponseEvent(cfnRequest,onEventResult){onEventResult=onEventResult||{};const physicalResourceId=onEventResult.PhysicalResourceId||defaultPhysicalResourceId(cfnRequest);if(cfnRequest.RequestType==="Delete"&&physicalResourceId!==cfnRequest.PhysicalResourceId)throw new Error(`DELETE: cannot change the physical resource ID from "${cfnRequest.PhysicalResourceId}" to "${onEventResult.PhysicalResourceId}" during deletion`);return cfnRequest.RequestType==="Update"&&physicalResourceId!==cfnRequest.PhysicalResourceId&&(0,util_1.log)(`UPDATE: changing physical resource ID from "${cfnRequest.PhysicalResourceId}" to "${onEventResult.PhysicalResourceId}"`),{...cfnRequest,...onEventResult,PhysicalResourceId:physicalResourceId}}function defaultPhysicalResourceId(req){switch(req.RequestType){case"Create":return req.RequestId;case"Update":case"Delete":return req.PhysicalResourceId;default:throw new Error(`Invalid "RequestType" in request "${JSON.stringify(req)}"`)}}module.exports={[consts.FRAMEWORK_ON_EVENT_HANDLER_NAME]:cfnResponse.safeHandler(onEvent),[consts.FRAMEWORK_IS_COMPLETE_HANDLER_NAME]:cfnResponse.safeHandler(isComplete),[consts.FRAMEWORK_ON_TIMEOUT_HANDLER_NAME]:onTimeout}; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js new file mode 100644 index 000000000..3c900428d --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.httpRequest=exports.invokeFunction=exports.startExecution=void 0;const https=require("https"),client_lambda_1=require("@aws-sdk/client-lambda"),client_sfn_1=require("@aws-sdk/client-sfn"),FRAMEWORK_HANDLER_TIMEOUT=9e5,awsSdkConfig={httpOptions:{timeout:FRAMEWORK_HANDLER_TIMEOUT}};async function defaultHttpRequest(options,requestBody){return new Promise((resolve,reject)=>{try{const request=https.request(options,response=>{response.resume(),!response.statusCode||response.statusCode>=400?reject(new Error(`Unsuccessful HTTP response: ${response.statusCode}`)):resolve()});request.on("error",reject),request.write(requestBody),request.end()}catch(e){reject(e)}})}let sfn,lambda;async function defaultStartExecution(req){return sfn||(sfn=new client_sfn_1.SFN(awsSdkConfig)),sfn.startExecution(req)}async function defaultInvokeFunction(req){lambda||(lambda=new client_lambda_1.Lambda(awsSdkConfig));try{return await lambda.invoke(req)}catch{return await(0,client_lambda_1.waitUntilFunctionActiveV2)({client:lambda,maxWaitTime:300},{FunctionName:req.FunctionName}),lambda.invoke(req)}}exports.startExecution=defaultStartExecution,exports.invokeFunction=defaultInvokeFunction,exports.httpRequest=defaultHttpRequest; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js new file mode 100644 index 000000000..47b472b09 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getEnv=getEnv,exports.log=log,exports.withRetries=withRetries,exports.parseJsonPayload=parseJsonPayload;function getEnv(name){const value=process.env[name];if(!value)throw new Error(`The environment variable "${name}" is not defined`);return value}function log(title,...args){console.log("[provider-framework]",title,...args.map(x=>typeof x=="object"?JSON.stringify(x,void 0,2):x))}function withRetries(options,fn){return async(...xs)=>{let attempts=options.attempts,ms=options.sleep;for(;;)try{return await fn(...xs)}catch(e){if(attempts--<=0)throw e;await sleep(Math.floor(Math.random()*ms)),ms*=2}}}async function sleep(ms){return new Promise(ok=>setTimeout(ok,ms))}function parseJsonPayload(payload){const text=new TextDecoder().decode(Buffer.from(payload??""));if(!text)return{};try{return JSON.parse(text)}catch{throw new Error(`return values from user-handlers must be JSON objects. got: "${text}"`)}} diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/cdk.out b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/cdk.out index c6e612584..91e1a8b99 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/cdk.out +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"38.0.1"} \ No newline at end of file +{"version":"39.0.0"} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/integ.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/integ.json index bc64a64b3..1f2423487 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/integ.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "38.0.1", + "version": "39.0.0", "testCases": { "opilam-apiFromAssetNewLambdaFunctions/Integ/DefaultTest": { "stacks": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/manifest.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/manifest.json index df4d62d3d..6df44e161 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/manifest.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "38.0.1", + "version": "39.0.0", "artifacts": { "opilamapiFromAssetNewLambdaFunctionsIntegDefaultTestDeployAssert781D98B1.assets": { "type": "cdk:asset-manifest", @@ -16,7 +16,6 @@ "templateFile": "opilamapiFromAssetNewLambdaFunctionsIntegDefaultTestDeployAssert781D98B1.template.json", "terminationProtection": false, "validateOnSynth": false, - "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", @@ -65,10 +64,9 @@ "templateFile": "opilam-apiFromAssetNewLambdaFunctions.template.json", "terminationProtection": false, "validateOnSynth": false, - "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/1078a06460997393f4ab0948c3087da0656481e3e0f2940ad5f64a117c302127.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/90d634912feb9d2bbdc8ef2cf410e287d931c5bfa6d60eaeab305f07f8e7f1d1.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -246,19 +244,10 @@ "data": "CheckBootstrapVersion" } ], - "OpenApiGatewayToLambdaMessagesHandlerApiFunction0PermitAPIGInvocationB70BC520": [ + "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD07753f2f46dfb3496adafababdebee8390ee": [ { "type": "aws:cdk:logicalId", - "data": "OpenApiGatewayToLambdaMessagesHandlerApiFunction0PermitAPIGInvocationB70BC520", - "trace": [ - "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" - ] - } - ], - "OpenApiGatewayToLambdaPhotosHandlerApiFunction1PermitAPIGInvocationA20E40FB": [ - { - "type": "aws:cdk:logicalId", - "data": "OpenApiGatewayToLambdaPhotosHandlerApiFunction1PermitAPIGInvocationA20E40FB", + "data": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD07753f2f46dfb3496adafababdebee8390ee", "trace": [ "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" ] diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilam-apiFromAssetNewLambdaFunctions.assets.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilam-apiFromAssetNewLambdaFunctions.assets.json index 0bbf0e67c..079b156a7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilam-apiFromAssetNewLambdaFunctions.assets.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilam-apiFromAssetNewLambdaFunctions.assets.json @@ -1,5 +1,5 @@ { - "version": "38.0.1", + "version": "39.0.0", "files": { "c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32": { "source": { @@ -14,15 +14,15 @@ } } }, - "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df": { + "0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e": { "source": { - "path": "asset.8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df", + "path": "asset.0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e", "packaging": "zip" }, "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip", + "objectKey": "0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e.zip", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } @@ -66,20 +66,20 @@ } } }, - "4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e": { + "bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca": { "source": { - "path": "asset.4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e", + "path": "asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca", "packaging": "zip" }, "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e.zip", + "objectKey": "bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca.zip", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } }, - "1078a06460997393f4ab0948c3087da0656481e3e0f2940ad5f64a117c302127": { + "90d634912feb9d2bbdc8ef2cf410e287d931c5bfa6d60eaeab305f07f8e7f1d1": { "source": { "path": "opilam-apiFromAssetNewLambdaFunctions.template.json", "packaging": "file" @@ -87,7 +87,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "1078a06460997393f4ab0948c3087da0656481e3e0f2940ad5f64a117c302127.json", + "objectKey": "90d634912feb9d2bbdc8ef2cf410e287d931c5bfa6d60eaeab305f07f8e7f1d1.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilam-apiFromAssetNewLambdaFunctions.template.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilam-apiFromAssetNewLambdaFunctions.template.json index f724f6d31..8f3deffb2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilam-apiFromAssetNewLambdaFunctions.template.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilam-apiFromAssetNewLambdaFunctions.template.json @@ -104,7 +104,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip" + "S3Key": "0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e.zip" }, "Environment": { "Variables": { @@ -648,7 +648,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e.zip" + "S3Key": "bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca.zip" }, "Description": "AWS CDK resource provider framework - onEvent (opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", "Environment": { diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilamapiFromAssetNewLambdaFunctionsIntegDefaultTestDeployAssert781D98B1.assets.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilamapiFromAssetNewLambdaFunctionsIntegDefaultTestDeployAssert781D98B1.assets.json index 833c3a761..de29838e6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilamapiFromAssetNewLambdaFunctionsIntegDefaultTestDeployAssert781D98B1.assets.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/opilamapiFromAssetNewLambdaFunctionsIntegDefaultTestDeployAssert781D98B1.assets.json @@ -1,5 +1,5 @@ { - "version": "38.0.1", + "version": "39.0.0", "files": { "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { "source": { diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/tree.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/tree.json index dba1ce581..653838cc7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/tree.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.js.snapshot/tree.json @@ -17,7 +17,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/ApiDefinitionAsset/Stage", "constructInfo": { "fqn": "aws-cdk-lib.AssetStaging", - "version": "2.160.0" + "version": "2.177.0" } }, "AssetBucket": { @@ -25,13 +25,13 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/ApiDefinitionAsset/AssetBucket", "constructInfo": { "fqn": "aws-cdk-lib.aws_s3.BucketBase", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_s3_assets.Asset", - "version": "2.160.0" + "version": "2.177.0" } }, "OpenApiGatewayToLambda": { @@ -47,7 +47,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/MessagesHandlerApiFunction0ServiceRole/ImportMessagesHandlerApiFunction0ServiceRole", "constructInfo": { "fqn": "aws-cdk-lib.Resource", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -110,7 +110,7 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "2.160.0" + "version": "2.177.0" } }, "DefaultPolicy": { @@ -146,19 +146,19 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "2.160.0" + "version": "2.177.0" } }, "MessagesHandlerApiFunction0": { @@ -174,7 +174,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/MessagesHandlerApiFunction0/Code/Stage", "constructInfo": { "fqn": "aws-cdk-lib.AssetStaging", - "version": "2.160.0" + "version": "2.177.0" } }, "AssetBucket": { @@ -182,13 +182,13 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/MessagesHandlerApiFunction0/Code/AssetBucket", "constructInfo": { "fqn": "aws-cdk-lib.aws_s3.BucketBase", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_s3_assets.Asset", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -201,7 +201,7 @@ "s3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "s3Key": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip" + "s3Key": "0ac0535f48d1ada09cde7f11fc72195d9d32da75a2719aeb20c4e5c45b28e62e.zip" }, "environment": { "variables": { @@ -223,7 +223,7 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", - "version": "2.160.0" + "version": "2.177.0" } }, "OpenApiGatewayToLambdaPermitAPIGInvocation": { @@ -268,13 +268,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.Function", - "version": "2.160.0" + "version": "2.177.0" } }, "PhotosHandlerApiFunction1ServiceRole": { @@ -286,7 +286,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/PhotosHandlerApiFunction1ServiceRole/ImportPhotosHandlerApiFunction1ServiceRole", "constructInfo": { "fqn": "aws-cdk-lib.Resource", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -349,7 +349,7 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "2.160.0" + "version": "2.177.0" } }, "DefaultPolicy": { @@ -385,19 +385,19 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "2.160.0" + "version": "2.177.0" } }, "PhotosHandlerApiFunction1": { @@ -413,7 +413,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/PhotosHandlerApiFunction1/Code/Stage", "constructInfo": { "fqn": "aws-cdk-lib.AssetStaging", - "version": "2.160.0" + "version": "2.177.0" } }, "AssetBucket": { @@ -421,13 +421,13 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/PhotosHandlerApiFunction1/Code/AssetBucket", "constructInfo": { "fqn": "aws-cdk-lib.aws_s3.BucketBase", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_s3_assets.Asset", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -462,7 +462,7 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", - "version": "2.160.0" + "version": "2.177.0" } }, "OpenApiGatewayToLambdaPermitAPIGInvocation": { @@ -507,13 +507,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.Function", - "version": "2.160.0" + "version": "2.177.0" } }, "ApiOutputAsset": { @@ -525,7 +525,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiOutputAsset/Stage", "constructInfo": { "fqn": "aws-cdk-lib.AssetStaging", - "version": "2.160.0" + "version": "2.177.0" } }, "AssetBucket": { @@ -533,13 +533,13 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiOutputAsset/AssetBucket", "constructInfo": { "fqn": "aws-cdk-lib.aws_s3.BucketBase", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_s3_assets.Asset", - "version": "2.160.0" + "version": "2.177.0" } }, "LambdaFunctionServiceRole": { @@ -551,7 +551,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/LambdaFunctionServiceRole/ImportLambdaFunctionServiceRole", "constructInfo": { "fqn": "aws-cdk-lib.Resource", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -614,7 +614,7 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "2.160.0" + "version": "2.177.0" } }, "DefaultPolicy": { @@ -650,19 +650,19 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "2.160.0" + "version": "2.177.0" } }, "LambdaFunction": { @@ -678,7 +678,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/LambdaFunction/Code/Stage", "constructInfo": { "fqn": "aws-cdk-lib.AssetStaging", - "version": "2.160.0" + "version": "2.177.0" } }, "AssetBucket": { @@ -686,13 +686,13 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/LambdaFunction/Code/AssetBucket", "constructInfo": { "fqn": "aws-cdk-lib.aws_s3.BucketBase", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_s3_assets.Asset", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -729,13 +729,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.Function", - "version": "2.160.0" + "version": "2.177.0" } }, "ApiTemplateWriterPolicy": { @@ -803,13 +803,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "2.160.0" + "version": "2.177.0" } }, "ApiTemplateWriterProvider": { @@ -829,7 +829,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/ServiceRole/ImportServiceRole", "constructInfo": { "fqn": "aws-cdk-lib.Resource", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -868,7 +868,7 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "2.160.0" + "version": "2.177.0" } }, "DefaultPolicy": { @@ -922,19 +922,19 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "2.160.0" + "version": "2.177.0" } }, "Code": { @@ -946,7 +946,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/Code/Stage", "constructInfo": { "fqn": "aws-cdk-lib.AssetStaging", - "version": "2.160.0" + "version": "2.177.0" } }, "AssetBucket": { @@ -954,13 +954,13 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider/framework-onEvent/Code/AssetBucket", "constructInfo": { "fqn": "aws-cdk-lib.aws_s3.BucketBase", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_s3_assets.Asset", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -973,7 +973,7 @@ "s3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "s3Key": "4dc48ffba382f93077a1e6824599bbd4ceb6f91eb3d9442eca3b85bdb1a20b1e.zip" + "s3Key": "bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca.zip" }, "description": "AWS CDK resource provider framework - onEvent (opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", "environment": { @@ -1007,19 +1007,19 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_lambda.Function", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.custom_resources.Provider", - "version": "2.160.0" + "version": "2.177.0" } }, "ApiTemplateWriterCustomResource": { @@ -1031,13 +1031,13 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterCustomResource/Default", "constructInfo": { "fqn": "aws-cdk-lib.CfnResource", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.CustomResource", - "version": "2.160.0" + "version": "2.177.0" } }, "ApiAccessLogGroup": { @@ -1053,13 +1053,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_logs.LogGroup", - "version": "2.160.0" + "version": "2.177.0" } }, "SpecRestApi": { @@ -1108,7 +1108,7 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.CfnRestApi", - "version": "2.160.0" + "version": "2.177.0" } }, "Default": { @@ -1116,7 +1116,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/SpecRestApi/Default", "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.ResourceBase", - "version": "2.160.0" + "version": "2.177.0" } }, "Deployment": { @@ -1137,13 +1137,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.CfnDeployment", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.Deployment", - "version": "2.160.0" + "version": "2.177.0" } }, "DeploymentStage.prod": { @@ -1185,13 +1185,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.CfnStage", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.Stage", - "version": "2.160.0" + "version": "2.177.0" } }, "Endpoint": { @@ -1199,7 +1199,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/SpecRestApi/Endpoint", "constructInfo": { "fqn": "aws-cdk-lib.CfnOutput", - "version": "2.160.0" + "version": "2.177.0" } }, "UsagePlan": { @@ -1227,19 +1227,19 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.CfnUsagePlan", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.UsagePlan", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.SpecRestApi", - "version": "2.160.0" + "version": "2.177.0" } }, "LambdaRestApiCloudWatchRole": { @@ -1251,7 +1251,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/LambdaRestApiCloudWatchRole/ImportLambdaRestApiCloudWatchRole", "constructInfo": { "fqn": "aws-cdk-lib.Resource", - "version": "2.160.0" + "version": "2.177.0" } }, "Resource": { @@ -1318,13 +1318,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "2.160.0" + "version": "2.177.0" } }, "LambdaRestApiAccount": { @@ -1343,13 +1343,13 @@ }, "constructInfo": { "fqn": "aws-cdk-lib.aws_apigateway.CfnAccount", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "@aws-solutions-constructs/aws-openapigateway-lambda.OpenApiGatewayToLambda", - "version": "2.70.0" + "version": "2.77.0" } }, "LatestNodeRuntimeMap": { @@ -1357,7 +1357,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/LatestNodeRuntimeMap", "constructInfo": { "fqn": "aws-cdk-lib.CfnMapping", - "version": "2.160.0" + "version": "2.177.0" } }, "Integ": { @@ -1373,7 +1373,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/Integ/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.3.0" + "version": "10.4.2" } }, "DeployAssert": { @@ -1385,7 +1385,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/Integ/DefaultTest/DeployAssert/BootstrapVersion", "constructInfo": { "fqn": "aws-cdk-lib.CfnParameter", - "version": "2.160.0" + "version": "2.177.0" } }, "CheckBootstrapVersion": { @@ -1393,25 +1393,25 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/Integ/DefaultTest/DeployAssert/CheckBootstrapVersion", "constructInfo": { "fqn": "aws-cdk-lib.CfnRule", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.Stack", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase", - "version": "2.160.0-alpha.0" + "version": "2.177.0-alpha.0" } } }, "constructInfo": { "fqn": "@aws-cdk/integ-tests-alpha.IntegTest", - "version": "2.160.0-alpha.0" + "version": "2.177.0-alpha.0" } }, "BootstrapVersion": { @@ -1419,7 +1419,7 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/BootstrapVersion", "constructInfo": { "fqn": "aws-cdk-lib.CfnParameter", - "version": "2.160.0" + "version": "2.177.0" } }, "CheckBootstrapVersion": { @@ -1427,13 +1427,13 @@ "path": "opilam-apiFromAssetNewLambdaFunctions/CheckBootstrapVersion", "constructInfo": { "fqn": "aws-cdk-lib.CfnRule", - "version": "2.160.0" + "version": "2.177.0" } } }, "constructInfo": { "fqn": "aws-cdk-lib.Stack", - "version": "2.160.0" + "version": "2.177.0" } }, "Tree": { @@ -1441,13 +1441,13 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.3.0" + "version": "10.4.2" } } }, "constructInfo": { "fqn": "aws-cdk-lib.App", - "version": "2.160.0" + "version": "2.177.0" } } } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/messages-lambda/index.mjs b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/messages-lambda/index.mjs index dfcaf1052..55e35c614 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/messages-lambda/index.mjs +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/messages-lambda/index.mjs @@ -3,12 +3,12 @@ export const handler = async (event) => { case 'POST': return { statusCode: 200, - body: JSON.stringify({"message": "successfully handled POST from messages lambda"}) + body: JSON.stringify({"message": "NEW - successfully handled POST from messages lambda"}) }; case 'GET': return { statusCode: 200, - body: JSON.stringify({"message": "successfully handled GET from messages lambda"}) + body: JSON.stringify({"message": "NEW - successfully handled GET from messages lambda"}) }; default: throw new Error(`cannot handle httpMethod: ${event.httpMethod}`); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts index 05442521c..b5137c669 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts @@ -12,14 +12,14 @@ */ // Imports -import { Stack, Duration } from "aws-cdk-lib"; +import { Stack, Duration, RemovalPolicy } from "aws-cdk-lib"; import { OpenApiGatewayToLambda } from "../lib"; import { ObtainApiDefinition, CheckOpenApiProps } from "../lib/openapi-helper"; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as s3 from 'aws-cdk-lib/aws-s3'; import { Asset } from "aws-cdk-lib/aws-s3-assets"; import * as path from 'path'; -import { Template } from "aws-cdk-lib/assertions"; +import { Match, Template } from "aws-cdk-lib/assertions"; import { CreateScrapBucket } from "@aws-solutions-constructs/core"; import * as defaults from '@aws-solutions-constructs/core'; import * as inlineJsonApiDefinition from './openapi/apiDefinition.json'; @@ -184,6 +184,7 @@ test('Multiple Lambda Functions can be specified', () => { const template = Template.fromStack(stack); template.resourceCountIs('AWS::Lambda::Function', 4); + template.resourceCountIs("AWS::Lambda::Alias", 0); }); test('Existing lambda function can be specified', () => { @@ -247,7 +248,7 @@ test('Throws error when neither existingLambdaObj or lambdaFunctionProps is spec ] }); }; - expect(app).toThrowError('One of existingLambdaObj or lambdaFunctionProps must be specified for the api integration with id: MessagesHandler'); + expect(app).toThrowError(`ApiIntegration id:MessagesHandler must have exactly one of lambdaFunctionProps or existingLambdaObj\n`); }); test('Two Constructs create APIs with different names', () => { @@ -369,40 +370,6 @@ test('Confirm API definition uri is added to function name', () => { }); -test('Confirm that providing both lambdaFunction and functionProps is an error', () => { - const stack = new Stack(); - const existingLambdaObj = new lambda.Function(stack, 'ExistingLambda', { - runtime: defaults.COMMERCIAL_REGION_LAMBDA_NODE_RUNTIME, - handler: 'index.handler', - functionName: 'ExistingLambdaFunction', - code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), - }); - - const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { - path: path.join(__dirname, 'openapi/apiDefinition.yaml') - }); - - const props = { - apiDefinitionAsset, - apiIntegrations: [ - { - id: 'MessagesHandler', - lambdaFunctionProps: { - runtime: defaults.COMMERCIAL_REGION_LAMBDA_NODE_RUNTIME, - handler: 'index.handler', - code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), - }, - existingLambdaObj - } - ] - }; - - const app = () => { - new OpenApiGatewayToLambda(stack, 'test', props); - }; - expect(app).toThrowError(`Error - Cannot provide both lambdaFunctionProps and existingLambdaObj in an ApiIntegrationfor the api integration with id: MessagesHandler`); -}); - /* * openapi-helper.ts tests */ @@ -746,5 +713,85 @@ test('Shared lambda function works', () => { expect(construct.apiLambdaFunctions.length).toEqual(1); expect(construct.apiLambdaFunctions[0].id).toEqual('MessagesHandler'); expect(construct.apiLambdaFunctions[0].lambdaFunction).toBeDefined(); - expect(construct.apiLambdaFunctions[0].lambdaFunction.functionArn).toEqual(constructTwo.apiLambdaFunctions[0].lambdaFunction.functionArn); + expect(construct.apiLambdaFunctions[0].lambdaFunction!.functionArn).toEqual(constructTwo.apiLambdaFunctions[0].lambdaFunction!.functionArn); }); + +test('Deploys API based on Alias correctly', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'ApiDefinitionAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const messagesLambda = defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + runtime: defaults.COMMERCIAL_REGION_LAMBDA_NODE_RUNTIME, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + currentVersionOptions: { + removalPolicy: RemovalPolicy.RETAIN, + }, + } + }); + + const photosLambda = defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + functionName: 'PhotosLambdaTestFromAsset', + runtime: defaults.COMMERCIAL_REGION_LAMBDA_NODE_RUNTIME, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + } + }); + + const messagesAlias = new lambda.Alias(stack, 'messages-alias', { + version: messagesLambda.currentVersion, + aliasName: 'messagesAlias', + }); + + new OpenApiGatewayToLambda(stack, 'OpenApiGatewayToLambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + existingLambdaObj: messagesAlias + }, + { + id: 'PhotosHandler', + existingLambdaObj: photosLambda + } + ] + }); + + const template = Template.fromStack(stack); + defaults.printWarning(`\n\n==dbg==\n${JSON.stringify(template)}\n\n==dbg===\n\n`); + + template.resourceCountIs("AWS::Lambda::Alias", 1); + template.resourceCountIs("AWS::Lambda::Version", 1); + template.hasResourceProperties("AWS::Lambda::Alias", { + FunctionName: { + Ref: Match.stringLikeRegexp("LambdaFunction.*") + }, + FunctionVersion: { + "Fn::GetAtt": [ + Match.stringLikeRegexp("LambdaFunctionCurrentVersion.*"), + "Version" + ] + }, + Name: "messagesAlias" + }); + // Confirm we've granted permission the the Alias and not the Lambda + template.hasResourceProperties("AWS::Lambda::Permission", { + Action: "lambda:InvokeFunction", + FunctionName: { + Ref: Match.stringLikeRegexp("messagesalias.*") + }, + Principal: "apigateway.amazonaws.com", + }); + template.resourcePropertiesCountIs("AWS::Lambda::Permission", { + Action: "lambda:InvokeFunction", + FunctionName: { + Ref: Match.stringLikeRegexp("LambdaFunction.*") + }, + Principal: "apigateway.amazonaws.com", + }, 0); +}); \ No newline at end of file