From 81d3b8b8ed9eabd4f2adbdc63d607975990c62ea Mon Sep 17 00:00:00 2001 From: Daniel <3842788+dscpinheiro@users.noreply.github.com> Date: Fri, 16 Oct 2020 12:59:22 +0000 Subject: [PATCH 1/3] feat(aws-apigateway-sagemakerendpoint): New aws-apigateway-sagemakerendpoint pattern implementation (#87) * feat(aws-apigateway-sagemakerendpoint): New aws-apigateway-sagemakerendpoint pattern implementation * Update comment not to exceed line limit * Update construct to allow usage of existing role for API Gateway * Remove duplicated property * Add comment to clarify request validation --- .../.eslintignore | 4 + .../.gitignore | 15 + .../.npmignore | 18 + .../README.md | 97 +++ .../architecture.png | Bin 0 -> 43379 bytes .../lib/index.ts | 176 +++++ .../package.json | 81 ++ .../apigateway-sagemakerendpoint.test.js.snap | 716 ++++++++++++++++++ .../test/apigateway-sagemakerendpoint.test.ts | 143 ++++ ...-sagemakerendpoint-overwrite.expected.json | 358 +++++++++ ....apigateway-sagemakerendpoint-overwrite.ts | 73 ++ .../test/integ.no-overwrite.expected.json | 347 +++++++++ .../test/integ.no-overwrite.ts | 45 ++ 13 files changed, 2073 insertions(+) create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.eslintignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.gitignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.npmignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/README.md create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/architecture.png create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/__snapshots__/apigateway-sagemakerendpoint.test.js.snap create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.eslintignore b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.eslintignore new file mode 100644 index 000000000..910cb0513 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.eslintignore @@ -0,0 +1,4 @@ +lib/*.js +test/*.js +*.d.ts +coverage \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.gitignore b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.gitignore new file mode 100644 index 000000000..6773cabd2 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.gitignore @@ -0,0 +1,15 @@ +lib/*.js +test/*.js +*.js.map +*.d.ts +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE +*.snk \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.npmignore b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.npmignore new file mode 100644 index 000000000..a1a9fdd01 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/.npmignore @@ -0,0 +1,18 @@ +# Exclude typescript source and config +*.ts +tsconfig.json +coverage +.nyc_output +*.tgz +*.snk +*.tsbuildinfo + +# Include javascript files and typescript declarations +!*.js +!*.d.ts + +# Exclude jsii outdir +dist + +# Include .jsii +!.jsii \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/README.md b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/README.md new file mode 100644 index 000000000..394a64a52 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/README.md @@ -0,0 +1,97 @@ +# aws-apigateway-sagemakerendpoint module + + +--- + +![Stability: Experimental](https://img.shields.io/badge/stability-Experimental-important.svg?style=for-the-badge) + +> All classes are under active development and subject to non-backward compatible changes or removal in any +> future version. These are not subject to the [Semantic Versioning](https://semver.org/) model. +> This means that while you may use them, you may need to update your source code when upgrading to a newer version of this package. + +--- + + +| **Reference Documentation**:| https://docs.aws.amazon.com/solutions/latest/constructs/| +|:-------------|:-------------| +
+ +| **Language** | **Package** | +|:-------------|-----------------| +|![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python|`aws_solutions_constructs.aws_apigateway_sagemakerendpoint`| +|![Typescript Logo](https://docs.aws.amazon.com/cdk/api/latest/img/typescript32.png) Typescript|`@aws-solutions-constructs/aws-apigateway-sagemakerendpoint`| +|![Java Logo](https://docs.aws.amazon.com/cdk/api/latest/img/java32.png) Java|`software.amazon.awsconstructs.services.apigatewaysagemakerendpoint`| + +## Overview + +This AWS Solutions Construct implements an Amazon API Gateway connected to an Amazon SageMaker endpoint pattern. + +Here is a minimal deployable pattern definition in Typescript: + +``` javascript +import { ApiGatewayToSageMakerEndpoint, ApiGatewayToSageMakerEndpointProps } from '@aws-solutions-constructs/aws-apigateway-sagemakerendpoint'; + +new ApiGatewayToSageMakerEndpoint(this, 'test-apigw-sagemakerendpoint', { + endpointName: 'my-endpoint', + resourcePath: '{my_param}', + requestMappingTemplate: 'my-request-vtl-template' +}); +``` + +## Initializer + +``` text +new ApiGatewayToSageMakerEndpoint(scope: Construct, id: string, props: ApiGatewayToSageMakerEndpointProps); +``` + +_Parameters_ + +* scope [`Construct`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_core.Construct.html) +* id `string` +* props [`ApiGatewayToSageMakerEndpointProps`](#pattern-construct-props) + +## Pattern Construct Props + +| **Name** | **Type** | **Description** | +|:-------------|:----------------|-----------------| +|apiGatewayProps?|[`api.RestApiProps`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-apigateway.RestApiProps.html)|Optional user-provided props to override the default props for the API Gateway.| +|apiGatewayExecutionRole?|[`iam.Role`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-iam.Role.html)|IAM Role used by API Gateway to invoke the SageMaker endpoint. If not specified, a default role is created with access to `endpointName`.| +|endpointName|`string`|Name of the deployed SageMaker inference endpoint.| +|resourceName?|`string`|Optional resource name where the GET method will be available.| +|resourcePath|`string`|Resource path for the GET method. The variable defined here can be referenced in `requestMappingTemplate`.| +|requestMappingTemplate|`string`|Mapping template to convert GET requests received on the REST API to POST requests expected by the SageMaker endpoint.| +|responseMappingTemplate?|`string`|Optional mapping template to convert responses received from the SageMaker endpoint.| + +## Pattern Properties + +| **Name** | **Type** | **Description** | +|:-------------|:----------------|-----------------| +|apiGateway|[`api.RestApi`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-apigateway.RestApi.html)|Returns an instance of the API Gateway REST API created by the pattern.| +|apiGatewayRole|[`iam.Role`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-iam.Role.html)|Returns an instance of the iam.Role created by the construct for API Gateway.| +|apiGatewayCloudWatchRole|[`iam.Role`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-iam.Role.html)|Returns an instance of the iam.Role created by the construct for API Gateway for CloudWatch access.| +|apiGatewayLogGroup|[`logs.LogGroup`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-logs.LogGroup.html)|Returns an instance of the LogGroup created by the construct for API Gateway access logging to CloudWatch.| + +## Sample API Usage + +> **Note**: Each SageMaker endpoint is unique, and the response from the API will depend on the deployed model. The example given below assumes the sample from [this blog post](https://aws.amazon.com/blogs/machine-learning/creating-a-machine-learning-powered-rest-api-with-amazon-api-gateway-mapping-templates-and-amazon-sagemaker/). For a reference on how that'd be implemented, please refer to [integ.apigateway-sagemakerendpoint-overwrite.ts](test/integ.apigateway-sagemakerendpoint-overwrite.ts). + +| **Method** | **Request Path** | **Query String** | **SageMaker Action** | **Description** | +|:-------------|:----------------|-----------------|-----------------|-----------------| +|GET|`/predicted-ratings/321`| `items=101,131,162` |`sagemaker:InvokeEndpoint`|Retrieves the predictions for a specific user and items.| + +## Default settings +Out of the box implementation of the Construct without any override will set the following defaults: + +### Amazon API Gateway +* Deploy an edge-optimized API endpoint +* Enable CloudWatch logging for API Gateway +* Configure least privilege access IAM role for API Gateway +* Set the default authorizationType for all API methods to IAM +* Enable X-Ray Tracing +* Validate request parameters before passing data to SageMaker + +## Architecture +![Architecture Diagram](architecture.png) + +*** +© Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/architecture.png b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..def2a1970744ca91d82e76b79bfdb2ea90ff1c1a GIT binary patch literal 43379 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 { + const stack = new Stack(); + new ApiGatewayToSageMakerEndpoint(stack, 'api-gateway-sagemakerendpoint', { + endpointName: 'my-endpoint', + resourcePath: '{my_param}', + requestMappingTemplate: 'my-request-vtl-template' + }); + expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot(); +}); + +// -------------------------------------------------------------- +// Test construct properties +// -------------------------------------------------------------- +test('Test construct properties', () => { + const stack = new Stack(); + const pattern = new ApiGatewayToSageMakerEndpoint(stack, 'api-gateway-sagemakerendpoint', { + endpointName: 'my-endpoint', + resourcePath: '{my_param}', + requestMappingTemplate: 'my-request-vtl-template' + }); + + expect(pattern.apiGateway !== null); + expect(pattern.apiGatewayRole !== null); + expect(pattern.apiGatewayCloudWatchRole !== null); + expect(pattern.apiGatewayLogGroup !== null); +}); + +// -------------------------------------------------------------- +// Test deployment w/ overwritten properties +// -------------------------------------------------------------- +test('Test deployment w/ overwritten properties', () => { + const stack = new Stack(); + + const existingRole = new iam.Role(stack, 'api-gateway-role', { + assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'), + description: 'existing role for SageMaker integration', + inlinePolicies: { + InvokePolicy: new iam.PolicyDocument({ + statements: [new iam.PolicyStatement({ + resources: [`arn:${Aws.PARTITION}:sagemaker:${Aws.REGION}:${Aws.ACCOUNT_ID}:endpoint/my-endpoint`], + actions: ['sagemaker:InvokeEndpoint'] + })] + }) + } + }); + + new ApiGatewayToSageMakerEndpoint(stack, 'api-gateway-sagemakerendpoint', { + endpointName: 'my-endpoint', + resourcePath: '{my_param}', + requestMappingTemplate: 'my-request-vtl-template', + + apiGatewayProps: { + restApiName: 'my-api', + deployOptions: { + methodOptions: { + '/*/*': { + throttlingRateLimit: 100, + throttlingBurstLimit: 25 + } + } + } + }, + apiGatewayExecutionRole: existingRole, + resourceName: 'my-resource', + responseMappingTemplate: 'my-response-vtl-template' + }); + + expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot(); + + expect(stack).toHaveResourceLike('AWS::ApiGateway::Stage', { + MethodSettings: [ + { + DataTraceEnabled: true, + HttpMethod: '*', + LoggingLevel: 'INFO', + ResourcePath: '/*' + }, + { + HttpMethod: '*', + ResourcePath: '/*', + ThrottlingRateLimit: 100, + ThrottlingBurstLimit: 25 + } + ] + }); + + expect(stack).toHaveResourceLike('AWS::ApiGateway::Resource', { + PathPart: 'my-resource' + }); + + expect(stack).toHaveResourceLike('AWS::ApiGateway::Method', { + Integration: { + IntegrationResponses: [ + { + ResponseTemplates: { + 'application/json': 'my-response-vtl-template', + }, + StatusCode: '200' + }, + { + StatusCode: '500', + SelectionPattern: '5\\d{2}' + }, + { + StatusCode: '400', + SelectionPattern: '4\\d{2}' + } + ] + }, + MethodResponses: [ + { StatusCode: '200' }, + { StatusCode: '500' }, + { StatusCode: '400' } + ] + }); + + expect(stack).toHaveResourceLike('AWS::IAM::Role', { + Description: 'existing role for SageMaker integration' + }); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json new file mode 100644 index 000000000..453b18de3 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json @@ -0,0 +1,358 @@ +{ + "Description": "Integration Test for aws-apigateway-sagemakerendpoint", + "Resources": { + "apigatewayroleE6D48DBD": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "apigateway.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "existing role for SageMaker integration", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": "sagemaker:InvokeEndpoint", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":sagemaker:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":endpoint/my-endpoint" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "InvokePolicy" + } + ] + } + }, + "testapigatewaysagemakerendpointoverwriteApiAccessLogGroupC0933D4E": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "testapigatewaysagemakerendpointoverwriteRestApi0EE22754": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "EndpointConfiguration": { + "Types": [ + "EDGE" + ] + }, + "Name": "RestApi" + } + }, + "testapigatewaysagemakerendpointoverwriteRestApiDeployment3B3B03364a19f99c87430d39385b3313a65df211": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + }, + "Description": "Automatically created by the RestApi construct" + }, + "DependsOn": [ + "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridGET06B35696", + "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridB999A556", + "testapigatewaysagemakerendpointoverwriteRestApipredictedratings1C8B9193", + "testapigatewaysagemakerendpointoverwriteRestApirequestvalidatorFA90CC69" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W45", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + } + ] + } + } + }, + "testapigatewaysagemakerendpointoverwriteRestApiDeploymentStageprod39A2035F": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + }, + "AccessLogSetting": { + "DestinationArn": { + "Fn::GetAtt": [ + "testapigatewaysagemakerendpointoverwriteApiAccessLogGroupC0933D4E", + "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": "testapigatewaysagemakerendpointoverwriteRestApiDeployment3B3B03364a19f99c87430d39385b3313a65df211" + }, + "MethodSettings": [ + { + "DataTraceEnabled": true, + "HttpMethod": "*", + "LoggingLevel": "INFO", + "ResourcePath": "/*" + } + ], + "StageName": "prod", + "TracingEnabled": true + } + }, + "testapigatewaysagemakerendpointoverwriteRestApipredictedratings1C8B9193": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "testapigatewaysagemakerendpointoverwriteRestApi0EE22754", + "RootResourceId" + ] + }, + "PathPart": "predicted-ratings", + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + } + } + }, + "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridB999A556": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApipredictedratings1C8B9193" + }, + "PathPart": "{user_id}", + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + } + } + }, + "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridGET06B35696": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "GET", + "ResourceId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridB999A556" + }, + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + }, + "AuthorizationType": "AWS_IAM", + "Integration": { + "Credentials": { + "Fn::GetAtt": [ + "apigatewayroleE6D48DBD", + "Arn" + ] + }, + "IntegrationHttpMethod": "POST", + "IntegrationResponses": [ + { + "ResponseTemplates": { + "application/json": "{\n \"ratings\": [\n#set( $predictions = $input.path(\"$.predictions\") )\n#foreach( $item in $predictions )\n $item.scores[0]#if( $foreach.hasNext ),#end\n $esc.newline\n#end\n ]\n}" + }, + "StatusCode": "200" + }, + { + "SelectionPattern": "5\\d{2}", + "StatusCode": "500" + }, + { + "SelectionPattern": "4\\d{2}", + "StatusCode": "400" + } + ], + "PassthroughBehavior": "NEVER", + "RequestParameters": { + "integration.request.header.Content-Type": "'application/json'" + }, + "RequestTemplates": { + "application/json": "{\n \"instances\": [\n#set( $user_id = $input.params(\"user_id\") )\n#set( $items = $input.params(\"items\") )\n#foreach( $item in $items.split(\",\") )\n {\"in0\": [$user_id], \"in1\": [$item]}#if( $foreach.hasNext ),#end\n $esc.newline\n#end\n ]\n}" + }, + "Type": "AWS", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":runtime.sagemaker:path/endpoints/my-endpoint/invocations" + ] + ] + } + }, + "MethodResponses": [ + { + "StatusCode": "200" + }, + { + "StatusCode": "500" + }, + { + "StatusCode": "400" + } + ], + "RequestValidatorId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApirequestvalidatorFA90CC69" + } + } + }, + "testapigatewaysagemakerendpointoverwriteRestApiUsagePlan64BD97E7": { + "Type": "AWS::ApiGateway::UsagePlan", + "Properties": { + "ApiStages": [ + { + "ApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + }, + "Stage": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApiDeploymentStageprod39A2035F" + }, + "Throttle": {} + } + ] + } + }, + "testapigatewaysagemakerendpointoverwriteRestApirequestvalidatorFA90CC69": { + "Type": "AWS::ApiGateway::RequestValidator", + "Properties": { + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + }, + "Name": "request-param-validator", + "ValidateRequestParameters": true + } + }, + "testapigatewaysagemakerendpointoverwriteLambdaRestApiCloudWatchRole2ED1F54A": { + "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:PutLogEvents", + "logs:GetLogEvents", + "logs:FilterLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaRestApiCloudWatchRolePolicy" + } + ] + } + }, + "testapigatewaysagemakerendpointoverwriteLambdaRestApiAccount8093B262": { + "Type": "AWS::ApiGateway::Account", + "Properties": { + "CloudWatchRoleArn": { + "Fn::GetAtt": [ + "testapigatewaysagemakerendpointoverwriteLambdaRestApiCloudWatchRole2ED1F54A", + "Arn" + ] + } + }, + "DependsOn": [ + "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + ] + } + }, + "Outputs": { + "testapigatewaysagemakerendpointoverwriteRestApiEndpointE0CCBC1C": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApiDeploymentStageprod39A2035F" + }, + "/" + ] + ] + } + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.ts new file mode 100644 index 000000000..3bda09e3b --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.ts @@ -0,0 +1,73 @@ +/** + * Copyright 2020 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. + */ + +// Imports +import { App, Stack, Aws } from '@aws-cdk/core'; +import { ApiGatewayToSageMakerEndpoint, ApiGatewayToSageMakerEndpointProps } from '../lib'; +import * as iam from '@aws-cdk/aws-iam'; + +// Setup +const app = new App(); +const stack = new Stack(app, 'test-apigateway-sagemakerendpoint-overwrite'); +stack.templateOptions.description = 'Integration Test for aws-apigateway-sagemakerendpoint'; + +const existingRole = new iam.Role(stack, 'api-gateway-role', { + assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'), + description: 'existing role for SageMaker integration', + inlinePolicies: { + InvokePolicy: new iam.PolicyDocument({ + statements: [new iam.PolicyStatement({ + resources: [`arn:${Aws.PARTITION}:sagemaker:${Aws.REGION}:${Aws.ACCOUNT_ID}:endpoint/my-endpoint`], + actions: ['sagemaker:InvokeEndpoint'] + })] + }) + } +}); + +// Definitions +const requestTemplate = +`{ + "instances": [ +#set( $user_id = $input.params("user_id") ) +#set( $items = $input.params("items") ) +#foreach( $item in $items.split(",") ) + {"in0": [$user_id], "in1": [$item]}#if( $foreach.hasNext ),#end + $esc.newline +#end + ] +}`; + +const responseTemplate = +`{ + "ratings": [ +#set( $predictions = $input.path("$.predictions") ) +#foreach( $item in $predictions ) + $item.scores[0]#if( $foreach.hasNext ),#end + $esc.newline +#end + ] +}`; + +const props: ApiGatewayToSageMakerEndpointProps = { + endpointName: 'my-endpoint', + resourcePath: '{user_id}', + resourceName: 'predicted-ratings', + requestMappingTemplate: requestTemplate, + responseMappingTemplate: responseTemplate, + apiGatewayExecutionRole: existingRole +}; + +new ApiGatewayToSageMakerEndpoint(stack, 'test-apigateway-sagemakerendpoint-overwrite', props); + +// Synth +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json new file mode 100644 index 000000000..d0e4d7942 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json @@ -0,0 +1,347 @@ +{ + "Description": "Integration Test for aws-apigateway-sagemakerendpoint", + "Resources": { + "testapigatewaysagemakerendpointdefaultApiAccessLogGroupAD5E1ADF": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "EndpointConfiguration": { + "Types": [ + "EDGE" + ] + }, + "Name": "RestApi" + } + }, + "testapigatewaysagemakerendpointdefaultRestApiDeployment04BFEB63b4264c277dbe6aa60ff584ba21d5d060": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + }, + "Description": "Automatically created by the RestApi construct" + }, + "DependsOn": [ + "testapigatewaysagemakerendpointdefaultRestApiuseridGETB3BB79AA", + "testapigatewaysagemakerendpointdefaultRestApiuserid9952BA11", + "testapigatewaysagemakerendpointdefaultRestApirequestvalidator1A23C251" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W45", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + } + ] + } + } + }, + "testapigatewaysagemakerendpointdefaultRestApiDeploymentStageprodFD1743A7": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + }, + "AccessLogSetting": { + "DestinationArn": { + "Fn::GetAtt": [ + "testapigatewaysagemakerendpointdefaultApiAccessLogGroupAD5E1ADF", + "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": "testapigatewaysagemakerendpointdefaultRestApiDeployment04BFEB63b4264c277dbe6aa60ff584ba21d5d060" + }, + "MethodSettings": [ + { + "DataTraceEnabled": true, + "HttpMethod": "*", + "LoggingLevel": "INFO", + "ResourcePath": "/*" + } + ], + "StageName": "prod", + "TracingEnabled": true + } + }, + "testapigatewaysagemakerendpointdefaultRestApiuserid9952BA11": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B", + "RootResourceId" + ] + }, + "PathPart": "{user_id}", + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + } + } + }, + "testapigatewaysagemakerendpointdefaultRestApiuseridGETB3BB79AA": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "GET", + "ResourceId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApiuserid9952BA11" + }, + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + }, + "AuthorizationType": "AWS_IAM", + "Integration": { + "Credentials": { + "Fn::GetAtt": [ + "testapigatewaysagemakerendpointdefaultapigatewayrole8EA61BE4", + "Arn" + ] + }, + "IntegrationHttpMethod": "POST", + "IntegrationResponses": [ + { + "StatusCode": "200" + }, + { + "SelectionPattern": "5\\d{2}", + "StatusCode": "500" + }, + { + "SelectionPattern": "4\\d{2}", + "StatusCode": "400" + } + ], + "PassthroughBehavior": "NEVER", + "RequestParameters": { + "integration.request.header.Content-Type": "'application/json'" + }, + "RequestTemplates": { + "application/json": "{\n \"instances\": [\n#set( $user_id = $input.params(\"user_id\") )\n#set( $items = $input.params(\"items\") )\n#foreach( $item in $items.split(\",\") )\n {\"in0\": [$user_id], \"in1\": [$item]}#if( $foreach.hasNext ),#end\n $esc.newline\n#end\n ]\n}" + }, + "Type": "AWS", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":runtime.sagemaker:path/endpoints/my-endpoint/invocations" + ] + ] + } + }, + "MethodResponses": [ + { + "StatusCode": "200" + }, + { + "StatusCode": "500" + }, + { + "StatusCode": "400" + } + ], + "RequestValidatorId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApirequestvalidator1A23C251" + } + } + }, + "testapigatewaysagemakerendpointdefaultRestApiUsagePlan7C5B0716": { + "Type": "AWS::ApiGateway::UsagePlan", + "Properties": { + "ApiStages": [ + { + "ApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + }, + "Stage": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApiDeploymentStageprodFD1743A7" + }, + "Throttle": {} + } + ] + } + }, + "testapigatewaysagemakerendpointdefaultRestApirequestvalidator1A23C251": { + "Type": "AWS::ApiGateway::RequestValidator", + "Properties": { + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + }, + "Name": "request-param-validator", + "ValidateRequestParameters": true + } + }, + "testapigatewaysagemakerendpointdefaultLambdaRestApiCloudWatchRole56EE67C8": { + "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:PutLogEvents", + "logs:GetLogEvents", + "logs:FilterLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaRestApiCloudWatchRolePolicy" + } + ] + } + }, + "testapigatewaysagemakerendpointdefaultLambdaRestApiAccount6B3C7FDD": { + "Type": "AWS::ApiGateway::Account", + "Properties": { + "CloudWatchRoleArn": { + "Fn::GetAtt": [ + "testapigatewaysagemakerendpointdefaultLambdaRestApiCloudWatchRole56EE67C8", + "Arn" + ] + } + }, + "DependsOn": [ + "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + ] + }, + "testapigatewaysagemakerendpointdefaultapigatewayrole8EA61BE4": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "apigateway.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "testapigatewaysagemakerendpointdefaultInvokeEndpointPolicyB835D2B2": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "sagemaker:InvokeEndpoint", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":sagemaker:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":endpoint/my-endpoint" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "testapigatewaysagemakerendpointdefaultInvokeEndpointPolicyB835D2B2", + "Roles": [ + { + "Ref": "testapigatewaysagemakerendpointdefaultapigatewayrole8EA61BE4" + } + ] + } + } + }, + "Outputs": { + "testapigatewaysagemakerendpointdefaultRestApiEndpoint1EFF6760": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "testapigatewaysagemakerendpointdefaultRestApiDeploymentStageprodFD1743A7" + }, + "/" + ] + ] + } + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.ts new file mode 100644 index 000000000..417c251f0 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.ts @@ -0,0 +1,45 @@ +/** + * Copyright 2020 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. + */ + +// Imports +import { App, Stack } from '@aws-cdk/core'; +import { ApiGatewayToSageMakerEndpoint, ApiGatewayToSageMakerEndpointProps } from '../lib'; + +// Setup +const app = new App(); +const stack = new Stack(app, 'test-apigateway-sagemakerendpoint-default'); +stack.templateOptions.description = 'Integration Test for aws-apigateway-sagemakerendpoint'; + +// Definitions +const requestTemplate = +`{ + "instances": [ +#set( $user_id = $input.params("user_id") ) +#set( $items = $input.params("items") ) +#foreach( $item in $items.split(",") ) + {"in0": [$user_id], "in1": [$item]}#if( $foreach.hasNext ),#end + $esc.newline +#end + ] +}`; + +const props: ApiGatewayToSageMakerEndpointProps = { + endpointName: 'my-endpoint', + resourcePath: '{user_id}', + requestMappingTemplate: requestTemplate +}; + +new ApiGatewayToSageMakerEndpoint(stack, 'test-apigateway-sagemakerendpoint-default', props); + +// Synth +app.synth(); From f02997ea4fa6515fc4429771d21821d2c26a8584 Mon Sep 17 00:00:00 2001 From: Hitendra Nishar Date: Fri, 16 Oct 2020 21:46:55 -0400 Subject: [PATCH 2/3] Update to version v1.68.0 --- CHANGELOG.md | 14 +- source/lerna.json | 2 +- source/package.json | 2 +- .../aws-apigateway-dynamodb/package.json | 28 +- .../aws-apigateway-iot/README.md | 8 +- .../aws-apigateway-iot/package.json | 24 +- .../package.json | 28 +- .../aws-apigateway-lambda/package.json | 28 +- .../README.md | 20 +- .../lib/index.ts | 2 +- .../package.json | 24 +- .../aws-apigateway-sqs/package.json | 32 +- .../lib/index.ts | 4 +- .../package.json | 42 +- ....cloudfront-apigateway-lambda.test.js.snap | 36 +- .../test/integ.no-arguments.expected.json | 42 +- .../integ.override-behavior.expected.json | 989 ++++++++++++++++++ .../test/integ.override-behavior.ts | 99 ++ .../aws-cloudfront-apigateway/lib/index.ts | 4 +- .../aws-cloudfront-apigateway/package.json | 32 +- .../test.cloudfront-apigateway.test.js.snap | 36 +- .../test/integ.no-arguments.expected.json | 42 +- .../aws-cloudfront-s3/lib/index.ts | 4 +- .../aws-cloudfront-s3/package.json | 28 +- .../test.cloudfront-s3.test.js.snap | 77 +- .../test/integ.existing-bucket.expected.json | 173 +-- .../test/integ.existing-bucket.ts | 18 +- .../test/integ.no-arguments.expected.json | 93 +- .../integ.no-security-headers.expected.json | 93 +- .../test/test.cloudfront-s3.test.ts | 123 +-- .../package.json | 32 +- .../package.json | 52 +- ...m-lambda-elasticsearch-kibana.test.js.snap | 15 +- .../test/integ.no-arguments.expected.json | 15 +- .../aws-dynamodb-stream-lambda/package.json | 32 +- .../dynamodb-stream-lambda.test.js.snap | 15 +- .../test/dynamodb-stream-lambda.test.ts | 15 +- .../test/integ.no-arguments.expected.json | 15 +- .../aws-events-rule-lambda/package.json | 24 +- .../aws-events-rule-sns/README.md | 5 +- .../aws-events-rule-sns/package.json | 28 +- .../aws-events-rule-sqs/README.md | 6 +- .../aws-events-rule-sqs/package.json | 28 +- .../package.json | 40 +- .../aws-iot-kinesisfirehose-s3/package.json | 36 +- .../test.iot-kinesisfirehose-s3.test.js.snap | 24 + .../test/integ.no-arguments.expected.json | 24 + .../aws-iot-lambda-dynamodb/package.json | 32 +- .../aws-iot-lambda/package.json | 24 +- .../package.json | 40 +- ....kinesisfirehose-analytics-s3.test.js.snap | 24 + .../test/integ.no-arguments.expected.json | 24 + .../aws-kinesisfirehose-s3/README.md | 2 +- .../aws-kinesisfirehose-s3/lib/index.ts | 5 +- .../aws-kinesisfirehose-s3/package.json | 32 +- .../test.kinesisfirehose-s3.test.js.snap | 24 + .../test/integ.no-arguments.expected.json | 24 + .../integ.pre-existing-bucket.expected.json | 16 + .../test/integ.pre-existing-bucket.ts | 12 +- .../.eslintignore | 5 + .../.gitignore | 16 + .../.npmignore | 21 + .../README.md | 98 ++ .../architecture.png | Bin 0 -> 53569 bytes .../lib/index.ts | 144 +++ .../package.json | 93 ++ .../test.kinesisfirehose-s3.test.js.snap | 423 ++++++++ .../integ.existingStreamObj.expected.json | 740 +++++++++++++ .../test/integ.existingStreamObj.ts | 39 + .../test/integ.no-arguments.expected.json | 420 ++++++++ .../test/integ.no-arguments.ts | 26 + .../test/lambda/index.js | 21 + .../test/test.kinesisfirehose-s3.test.ts | 144 +++ .../aws-kinesisstreams-lambda/README.md | 2 +- .../aws-kinesisstreams-lambda/package.json | 40 +- .../aws-lambda-dynamodb/package.json | 20 +- .../package.json | 32 +- .../aws-lambda-s3/package.json | 20 +- .../aws-lambda-sns/package.json | 24 +- .../aws-lambda-sqs-lambda/package.json | 28 +- .../aws-lambda-sqs/package.json | 20 +- .../aws-lambda-step-function/package.json | 28 +- .../aws-s3-lambda/package.json | 32 +- .../aws-s3-step-function/package.json | 52 +- .../aws-sns-lambda/package.json | 32 +- .../aws-sns-sqs/package.json | 32 +- .../aws-sqs-lambda/package.json | 28 +- .../lib/cloudfront-distribution-defaults.ts | 114 +- .../lib/cloudfront-distribution-helper.ts | 53 +- .../core/lib/kinesis-firehose-s3-defaults.ts | 9 +- .../core/package.json | 94 +- ...stribution-api-gateway-helper.test.js.snap | 669 +++++++++++- ...dfront-distribution-s3-helper.test.js.snap | 77 +- .../kinesis-firehose-s3-defaults.test.js.snap | 24 + ...nt-distribution-api-gateway-helper.test.ts | 242 +++-- .../cloudfront-distribution-s3-helper.test.ts | 438 +++----- .../test/kinesis-firehose-s3-defaults.test.ts | 33 +- source/tools/cdk-integ-tools/package.json | 6 +- .../aws-s3-static-website/package.json | 22 +- .../aws-serverless-image-handler/package.json | 40 +- .../aws-serverless-web-app/package.json | 32 +- 101 files changed, 5456 insertions(+), 1789 deletions(-) create mode 100644 source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.eslintignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.gitignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.npmignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/README.md create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/architecture.png create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/__snapshots__/test.kinesisfirehose-s3.test.js.snap create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/lambda/index.js create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/test.kinesisfirehose-s3.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ba1c8f5d..5528a0aea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.68.0] - 2020-10-16 + +### Added +- aws-kinesisstreams-kinesisfirehose-s3 pattern added ([#74](https://github.com/awslabs/aws-solutions-constructs/issues/74)) +- aws-apigateway-sagemakerendpoint pattern added ([#75](https://github.com/awslabs/aws-solutions-constructs/issues/75)) + +### Changed +- Upgraded all patterns to CDK v1.68.0 +- BREAKING CHANGE: For All `aws-cloudfront-*` patterns, changed the underlying CloudFront L2 construct from `CloudFrontWebDistribution` to `Distribution` + ## [1.67.0] - 2020-10-09 ### Changed -- Upgraded all patterns to CDK v1.66.0 +- Upgraded all patterns to CDK v1.67.0 - Make CloudWatch alarm creation optional ([#85](https://github.com/awslabs/aws-solutions-constructs/issues/85)) ## [1.66.0] - 2020-10-06 @@ -219,4 +229,4 @@ General Availability of the AWS Solutions Constructs!! 🎉🎉🥂🥂🍾🍾 - aws-s3-lambda pattern added - aws-sns-lambda pattern added - aws-sqs-lambda pattern added -- core pattern added \ No newline at end of file +- core pattern added diff --git a/source/lerna.json b/source/lerna.json index ed3cb1322..1b9557132 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "1.67.0" + "version": "1.68.0" } diff --git a/source/package.json b/source/package.json index 1f41e4a19..bed71d9ed 100644 --- a/source/package.json +++ b/source/package.json @@ -1,6 +1,6 @@ { "name": "aws-solutions-constructs", - "version": "1.67.0", + "version": "1.68.0", "description": "AWS Solutions Constructs Library", "repository": { "type": "git", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json index d6905d0c3..adacc3e47 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-dynamodb", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS API Gateway and Amazon DynamoDB integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md index ee1be1102..8778cbf22 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md @@ -32,13 +32,11 @@ This implementation enables write-only messages to be published on given MQTT to Here is a minimal deployable pattern definition in Typescript: -``` javascript -const { ApiGatewayToIot } from '@aws-solutions-constructs/aws-apigateway-iot'; +``` typescript +import { ApiGatewayToIot } from '@aws-solutions-constructs/aws-apigateway-iot'; new ApiGatewayToIot(this, 'ApiGatewayToIotPattern', { - apiGatewayToIotProps: { - iotEndpoint: 'a1234567890123-ats' - } + iotEndpoint: 'a1234567890123-ats' }); ``` diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json index 2f783e3aa..ddbba1812 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-iot", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs to proxy communication to IotCore using a APIGateway(REST).", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-iam": "~1.67.0" + "@aws-cdk/aws-iam": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json index 15fcda7fd..0566f81ad 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-kinesisstreams", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS API Gateway and Amazon Kinesis Data Streams integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesis": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesis": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesis": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesis": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json index fceae933c..05c5b2b90 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an API Gateway and a Lambda function.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-iam": "~1.67.0" + "@aws-cdk/aws-iam": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/README.md b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/README.md index 394a64a52..c328c3c88 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/README.md @@ -31,10 +31,24 @@ Here is a minimal deployable pattern definition in Typescript: ``` javascript import { ApiGatewayToSageMakerEndpoint, ApiGatewayToSageMakerEndpointProps } from '@aws-solutions-constructs/aws-apigateway-sagemakerendpoint'; +// Below is an example VTL (Velocity Template Language) mapping template for mapping the Api GET request to the Sagemaker POST request +const requestTemplate = +`{ + "instances": [ +#set( $user_id = $input.params("user_id") ) +#set( $items = $input.params("items") ) +#foreach( $item in $items.split(",") ) + {"in0": [$user_id], "in1": [$item]}#if( $foreach.hasNext ),#end + $esc.newline +#end + ] +}`; + +// Replace 'my-endpoint' with your Sagemaker Inference Endpoint new ApiGatewayToSageMakerEndpoint(this, 'test-apigw-sagemakerendpoint', { endpointName: 'my-endpoint', - resourcePath: '{my_param}', - requestMappingTemplate: 'my-request-vtl-template' + resourcePath: '{user_id}', + requestMappingTemplate: requestTemplate }); ``` @@ -77,7 +91,7 @@ _Parameters_ | **Method** | **Request Path** | **Query String** | **SageMaker Action** | **Description** | |:-------------|:----------------|-----------------|-----------------|-----------------| -|GET|`/predicted-ratings/321`| `items=101,131,162` |`sagemaker:InvokeEndpoint`|Retrieves the predictions for a specific user and items.| +|GET|`/321`| `items=101,131,162` |`sagemaker:InvokeEndpoint`|Retrieves the predictions for a specific user and items.| ## Default settings Out of the box implementation of the Construct without any override will set the following defaults: diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts index 6deda0d6d..973cfc5f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts @@ -86,7 +86,7 @@ export class ApiGatewayToSageMakerEndpoint extends Construct { * @param {cdk.App} scope - represents the scope for all the resources. * @param {string} id - this is a a scope-unique id. * @param {ApiGatewayToSageMakerEndpointProps} props - user provided props for the construct. - * @since 1.67.0 + * @since 1.68.0 * @access public */ constructor(scope: Construct, id: string, props: ApiGatewayToSageMakerEndpointProps) { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json index 4ba5bcc07..f541716f8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-sagemakerendpoint", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS API Gateway and Amazon SageMaker Endpoint integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json index d3502115c..0557d1713 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-sqs", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon S3 bucket.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts index 7932abee6..7e874ce3a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts @@ -48,7 +48,7 @@ export interface CloudFrontToApiGatewayToLambdaProps { * * @default - Default props are used */ - readonly cloudFrontDistributionProps?: cloudfront.CloudFrontWebDistributionProps | any, + readonly cloudFrontDistributionProps?: cloudfront.DistributionProps | any, /** * Optional user provided props to turn on/off the automatic injection of best practice HTTP * security headers in all responses from cloudfront @@ -59,7 +59,7 @@ export interface CloudFrontToApiGatewayToLambdaProps { } export class CloudFrontToApiGatewayToLambda extends Construct { - public readonly cloudFrontWebDistribution: cloudfront.CloudFrontWebDistribution; + public readonly cloudFrontWebDistribution: cloudfront.Distribution; public readonly edgeLambdaFunctionVersion?: lambda.Version; public readonly cloudFrontLoggingBucket?: s3.Bucket; public readonly apiGateway: api.RestApi; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json index 36bbcdd9e..21b6a6e9d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS Cloudfront to AWS API Gateway to AWS Lambda integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,19 +53,20 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/aws-cloudfront-apigateway": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/aws-cloudfront-apigateway": "~1.68.0", + "@aws-cdk/aws-cloudfront-origins": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -75,15 +76,16 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-solutions-constructs/aws-cloudfront-apigateway": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-solutions-constructs/aws-cloudfront-apigateway": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0" + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-cloudfront-origins": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/__snapshots__/test.cloudfront-apigateway-lambda.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/__snapshots__/test.cloudfront-apigateway-lambda.test.js.snap index 5959db79c..c2e28a333 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/__snapshots__/test.cloudfront-apigateway-lambda.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/__snapshots__/test.cloudfront-apigateway-lambda.test.js.snap @@ -50,7 +50,7 @@ Object { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", }, - "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionCFDistribution4AF2BFE4": Object { + "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistribution0AFC98FC": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ @@ -64,21 +64,8 @@ Object { "Properties": Object { "DistributionConfig": Object { "DefaultCacheBehavior": Object { - "AllowedMethods": Array [ - "GET", - "HEAD", - ], - "CachedMethods": Array [ - "GET", - "HEAD", - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": Object { - "Cookies": Object { - "Forward": "none", - }, - "QueryString": false, - }, "LambdaFunctionAssociations": Array [ Object { "EventType": "origin-response", @@ -87,10 +74,9 @@ Object { }, }, ], - "TargetOriginId": "origin1", + "TargetOriginId": "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin11F34FD46", "ViewerProtocolPolicy": "redirect-to-https", }, - "DefaultRootObject": "index.html", "Enabled": true, "HttpVersion": "http2", "IPV6Enabled": true, @@ -101,21 +87,11 @@ Object { "DomainName", ], }, - "IncludeCookies": false, }, "Origins": Array [ Object { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "CustomOriginConfig": Object { - "HTTPPort": 80, - "HTTPSPort": 443, - "OriginKeepaliveTimeout": 5, "OriginProtocolPolicy": "https-only", - "OriginReadTimeout": 30, - "OriginSSLProtocols": Array [ - "TLSv1.2", - ], }, "DomainName": Object { "Fn::Select": Array [ @@ -161,7 +137,7 @@ Object { }, ], }, - "Id": "origin1", + "Id": "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin11F34FD46", "OriginPath": Object { "Fn::Join": Array [ "", @@ -175,10 +151,6 @@ Object { }, }, ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": Object { - "CloudFrontDefaultCertificate": true, - }, }, }, "Type": "AWS::CloudFront::Distribution", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json index 3c513ce49..a9d81031e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json @@ -804,26 +804,13 @@ } } }, - "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionCFDistribution4AF2BFE4": { + "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistribution0AFC98FC": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "DefaultCacheBehavior": { - "AllowedMethods": [ - "GET", - "HEAD" - ], - "CachedMethods": [ - "GET", - "HEAD" - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": { - "Cookies": { - "Forward": "none" - }, - "QueryString": false - }, "LambdaFunctionAssociations": [ { "EventType": "origin-response", @@ -832,10 +819,9 @@ } } ], - "TargetOriginId": "origin1", + "TargetOriginId": "testcloudfrontapigatewaylambdastacktestcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin1F0C574BA", "ViewerProtocolPolicy": "redirect-to-https" }, - "DefaultRootObject": "index.html", "Enabled": true, "HttpVersion": "http2", "IPV6Enabled": true, @@ -845,22 +831,12 @@ "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudfrontLoggingBucket7F467421", "DomainName" ] - }, - "IncludeCookies": false + } }, "Origins": [ { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "CustomOriginConfig": { - "HTTPPort": 80, - "HTTPSPort": 443, - "OriginKeepaliveTimeout": 5, - "OriginProtocolPolicy": "https-only", - "OriginReadTimeout": 30, - "OriginSSLProtocols": [ - "TLSv1.2" - ] + "OriginProtocolPolicy": "https-only" }, "DomainName": { "Fn::Select": [ @@ -906,7 +882,7 @@ } ] }, - "Id": "origin1", + "Id": "testcloudfrontapigatewaylambdastacktestcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin1F0C574BA", "OriginPath": { "Fn::Join": [ "", @@ -919,11 +895,7 @@ ] } } - ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": { - "CloudFrontDefaultCertificate": true - } + ] } }, "Metadata": { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json new file mode 100644 index 000000000..f988b8926 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json @@ -0,0 +1,989 @@ +{ + "Description": "Integration Test for aws-cloudfront-apigateway-lambda", + "Resources": { + "SomeCachePolicy40B9E4D4": { + "Type": "AWS::CloudFront::CachePolicy", + "Properties": { + "CachePolicyConfig": { + "DefaultTTL": 28800, + "MaxTTL": 36000, + "MinTTL": 18000, + "Name": "SomeCachePolicy", + "ParametersInCacheKeyAndForwardedToOrigin": { + "CookiesConfig": { + "CookieBehavior": "none" + }, + "EnableAcceptEncodingGzip": false, + "HeadersConfig": { + "HeaderBehavior": "none" + }, + "QueryStringsConfig": { + "QueryStringBehavior": "none" + } + } + } + } + }, + "NoCachePolicy1F71EC46": { + "Type": "AWS::CloudFront::CachePolicy", + "Properties": { + "CachePolicyConfig": { + "DefaultTTL": 0, + "MaxTTL": 0, + "MinTTL": 0, + "Name": "NoCachePolicy", + "ParametersInCacheKeyAndForwardedToOrigin": { + "CookiesConfig": { + "CookieBehavior": "none" + }, + "EnableAcceptEncodingGzip": false, + "HeadersConfig": { + "HeaderBehavior": "none" + }, + "QueryStringsConfig": { + "QueryStringBehavior": "none" + } + } + } + } + }, + "cfapilambdaoverrideLambdaFunctionServiceRole4B1A4043": { + "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" + } + ] + } + }, + "cfapilambdaoverrideLambdaFunctionServiceRoleDefaultPolicy1A3D9202": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "cfapilambdaoverrideLambdaFunctionServiceRoleDefaultPolicy1A3D9202", + "Roles": [ + { + "Ref": "cfapilambdaoverrideLambdaFunctionServiceRole4B1A4043" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray." + } + ] + } + } + }, + "cfapilambdaoverrideLambdaFunction74CE466F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Ref": "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3Bucket1F467BCC" + }, + "S3Key": { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 0, + { + "Fn::Split": [ + "||", + { + "Ref": "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3VersionKey9E4F7872" + } + ] + } + ] + }, + { + "Fn::Select": [ + 1, + { + "Fn::Split": [ + "||", + { + "Ref": "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3VersionKey9E4F7872" + } + ] + } + ] + } + ] + ] + } + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "cfapilambdaoverrideLambdaFunctionServiceRole4B1A4043", + "Arn" + ] + }, + "Runtime": "nodejs10.x", + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" + } + }, + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "cfapilambdaoverrideLambdaFunctionServiceRoleDefaultPolicy1A3D9202", + "cfapilambdaoverrideLambdaFunctionServiceRole4B1A4043" + ], + "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 more tighter permissions." + } + ] + } + } + }, + "cfapilambdaoverrideApiAccessLogGroup2665068D": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "cfapilambdaoverrideLambdaRestApi6E7952FC": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "EndpointConfiguration": { + "Types": [ + "REGIONAL" + ] + }, + "Name": "LambdaRestApi" + } + }, + "cfapilambdaoverrideLambdaRestApiDeployment82ACBB00e7f3a114a506221ddcaf53765c4dd518": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + "Description": "Automatically created by the RestApi construct" + }, + "DependsOn": [ + "cfapilambdaoverrideLambdaRestApidynamicGET15050D54", + "cfapilambdaoverrideLambdaRestApidynamic88206171", + "cfapilambdaoverrideLambdaRestApistaticGET81EF9C24", + "cfapilambdaoverrideLambdaRestApistaticC2ECB649" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W45", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + } + ] + } + } + }, + "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "RestApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + "AccessLogSetting": { + "DestinationArn": { + "Fn::GetAtt": [ + "cfapilambdaoverrideApiAccessLogGroup2665068D", + "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": "cfapilambdaoverrideLambdaRestApiDeployment82ACBB00e7f3a114a506221ddcaf53765c4dd518" + }, + "MethodSettings": [ + { + "DataTraceEnabled": true, + "HttpMethod": "*", + "LoggingLevel": "INFO", + "ResourcePath": "/*" + } + ], + "StageName": "prod", + "TracingEnabled": true + } + }, + "cfapilambdaoverrideLambdaRestApistaticC2ECB649": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "cfapilambdaoverrideLambdaRestApi6E7952FC", + "RootResourceId" + ] + }, + "PathPart": "static", + "RestApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + } + } + }, + "cfapilambdaoverrideLambdaRestApistaticGET81EF9C24": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "GET", + "ResourceId": { + "Ref": "cfapilambdaoverrideLambdaRestApistaticC2ECB649" + }, + "RestApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + "AuthorizationType": "NONE", + "Integration": { + "IntegrationHttpMethod": "GET", + "Type": "HTTP_PROXY", + "Uri": "http://amazon.com" + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W59", + "reason": "AWS::ApiGateway::Method AuthorizationType is set to 'NONE' because API Gateway behind CloudFront does not support AWS_IAM authentication" + } + ] + } + } + }, + "cfapilambdaoverrideLambdaRestApidynamic88206171": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "cfapilambdaoverrideLambdaRestApi6E7952FC", + "RootResourceId" + ] + }, + "PathPart": "dynamic", + "RestApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + } + } + }, + "cfapilambdaoverrideLambdaRestApidynamicGETApiPermissiontestcfapilambdaoverridestackcfapilambdaoverrideLambdaRestApi6D58BDA9GETdynamic00489F37": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "cfapilambdaoverrideLambdaFunction74CE466F", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + "/", + { + "Ref": "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5" + }, + "/GET/dynamic" + ] + ] + } + } + }, + "cfapilambdaoverrideLambdaRestApidynamicGETApiPermissionTesttestcfapilambdaoverridestackcfapilambdaoverrideLambdaRestApi6D58BDA9GETdynamic537B9015": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "cfapilambdaoverrideLambdaFunction74CE466F", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + "/test-invoke-stage/GET/dynamic" + ] + ] + } + } + }, + "cfapilambdaoverrideLambdaRestApidynamicGET15050D54": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "GET", + "ResourceId": { + "Ref": "cfapilambdaoverrideLambdaRestApidynamic88206171" + }, + "RestApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + "AuthorizationType": "NONE", + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "cfapilambdaoverrideLambdaFunction74CE466F", + "Arn" + ] + }, + "/invocations" + ] + ] + } + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W59", + "reason": "AWS::ApiGateway::Method AuthorizationType is set to 'NONE' because API Gateway behind CloudFront does not support AWS_IAM authentication" + } + ] + } + } + }, + "cfapilambdaoverrideLambdaRestApiUsagePlanCF4B0BE0": { + "Type": "AWS::ApiGateway::UsagePlan", + "Properties": { + "ApiStages": [ + { + "ApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + "Stage": { + "Ref": "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5" + }, + "Throttle": {} + } + ] + } + }, + "cfapilambdaoverrideLambdaRestApiCloudWatchRole0F1F3559": { + "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:PutLogEvents", + "logs:GetLogEvents", + "logs:FilterLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaRestApiCloudWatchRolePolicy" + } + ] + } + }, + "cfapilambdaoverrideLambdaRestApiAccountFB480D92": { + "Type": "AWS::ApiGateway::Account", + "Properties": { + "CloudWatchRoleArn": { + "Fn::GetAtt": [ + "cfapilambdaoverrideLambdaRestApiCloudWatchRole0F1F3559", + "Arn" + ] + } + }, + "DependsOn": [ + "cfapilambdaoverrideLambdaRestApi6E7952FC" + ] + }, + "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersServiceRole60E3862B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + }, + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "edgelambda.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" + } + ] + } + }, + "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersServiceRoleDefaultPolicy3AE9A74C": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersServiceRoleDefaultPolicy3AE9A74C", + "Roles": [ + { + "Ref": "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersServiceRole60E3862B" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray." + } + ] + } + } + }, + "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeaders67E61E6E": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "ZipFile": "exports.handler = (event, context, callback) => { const response = event.Records[0].cf.response; const headers = response.headers; headers['x-xss-protection'] = [ { key: 'X-XSS-Protection', value: '1; mode=block' } ]; headers['x-frame-options'] = [ { key: 'X-Frame-Options', value: 'DENY' } ]; headers['x-content-type-options'] = [ { key: 'X-Content-Type-Options', value: 'nosniff' } ]; headers['strict-transport-security'] = [ { key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubdomains; preload' } ]; headers['referrer-policy'] = [ { key: 'Referrer-Policy', value: 'same-origin' } ]; headers['content-security-policy'] = [ { key: 'Content-Security-Policy', value: \"default-src 'none'; base-uri 'self'; img-src 'self'; script-src 'self'; style-src 'self' https:; object-src 'none'; frame-ancestors 'none'; font-src 'self' https:; form-action 'self'; manifest-src 'self'; connect-src 'self'\" } ]; callback(null, response); };" + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersServiceRole60E3862B", + "Arn" + ] + }, + "Runtime": "nodejs12.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersServiceRoleDefaultPolicy3AE9A74C", + "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersServiceRole60E3862B" + ], + "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 more tighter permissions." + } + ] + } + } + }, + "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersVersionBECBEC80": { + "Type": "AWS::Lambda::Version", + "Properties": { + "FunctionName": { + "Ref": "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeaders67E61E6E" + } + } + }, + "cfapilambdaoverrideCloudFrontToApiGatewayCloudfrontLoggingBucket3A71B9E0": { + "Type": "AWS::S3::Bucket", + "Properties": { + "AccessControl": "LogDeliveryWrite", + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W35", + "reason": "This S3 bucket is used as the access logging bucket for CloudFront Distribution" + } + ] + } + } + }, + "cfapilambdaoverrideCloudFrontToApiGatewayCloudfrontLoggingBucketPolicyC3092436": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "cfapilambdaoverrideCloudFrontToApiGatewayCloudfrontLoggingBucket3A71B9E0" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": "*", + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "cfapilambdaoverrideCloudFrontToApiGatewayCloudfrontLoggingBucket3A71B9E0", + "Arn" + ] + }, + "/*" + ] + ] + }, + "Sid": "HttpsOnly" + } + ], + "Version": "2012-10-17" + } + } + }, + "cfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistribution94A35932": { + "Type": "AWS::CloudFront::Distribution", + "Properties": { + "DistributionConfig": { + "CacheBehaviors": [ + { + "CachePolicyId": { + "Ref": "NoCachePolicy1F71EC46" + }, + "Compress": true, + "PathPattern": "/dynamic", + "TargetOriginId": "testcfapilambdaoverridestackcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin27CE3F449", + "ViewerProtocolPolicy": "allow-all" + } + ], + "DefaultCacheBehavior": { + "CachePolicyId": { + "Ref": "SomeCachePolicy40B9E4D4" + }, + "Compress": true, + "LambdaFunctionAssociations": [ + { + "EventType": "origin-response", + "LambdaFunctionARN": { + "Ref": "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeadersVersionBECBEC80" + } + } + ], + "TargetOriginId": "testcfapilambdaoverridestackcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin19A7DB81E", + "ViewerProtocolPolicy": "redirect-to-https" + }, + "Enabled": true, + "HttpVersion": "http2", + "IPV6Enabled": true, + "Logging": { + "Bucket": { + "Fn::GetAtt": [ + "cfapilambdaoverrideCloudFrontToApiGatewayCloudfrontLoggingBucket3A71B9E0", + "DomainName" + ] + } + }, + "Origins": [ + { + "CustomOriginConfig": { + "OriginProtocolPolicy": "https-only" + }, + "DomainName": { + "Fn::Select": [ + 0, + { + "Fn::Split": [ + "/", + { + "Fn::Select": [ + 1, + { + "Fn::Split": [ + "://", + { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5" + }, + "/" + ] + ] + } + ] + } + ] + } + ] + } + ] + }, + "Id": "testcfapilambdaoverridestackcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin19A7DB81E", + "OriginPath": { + "Fn::Join": [ + "", + [ + "/", + { + "Ref": "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5" + } + ] + ] + } + }, + { + "CustomOriginConfig": { + "OriginProtocolPolicy": "https-only" + }, + "DomainName": { + "Fn::Select": [ + 0, + { + "Fn::Split": [ + "/", + { + "Fn::Select": [ + 1, + { + "Fn::Split": [ + "://", + { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5" + }, + "/" + ] + ] + } + ] + } + ] + } + ] + } + ] + }, + "Id": "testcfapilambdaoverridestackcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin27CE3F449", + "OriginPath": { + "Fn::Join": [ + "", + [ + "/", + { + "Ref": "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5" + }, + "/dynamic" + ] + ] + } + } + ] + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W70", + "reason": "Since the distribution uses the CloudFront domain name, CloudFront automatically sets the security policy to TLSv1 regardless of the value of MinimumProtocolVersion" + } + ] + } + } + } + }, + "Outputs": { + "cfapilambdaoverrideLambdaRestApiEndpointF8A561AB": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5" + }, + "/" + ] + ] + } + } + }, + "Parameters": { + "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3Bucket1F467BCC": { + "Type": "String", + "Description": "S3 bucket for asset \"42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c\"" + }, + "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3VersionKey9E4F7872": { + "Type": "String", + "Description": "S3 key for asset version \"42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c\"" + }, + "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cArtifactHash00A70A91": { + "Type": "String", + "Description": "Artifact hash for asset \"42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c\"" + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts new file mode 100644 index 000000000..0161cd60f --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts @@ -0,0 +1,99 @@ +/** + * Copyright 2020 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. + */ + +/// !cdk-integ * +import { App, Stack } from "@aws-cdk/core"; +import { CloudFrontToApiGatewayToLambda } from "../lib"; +import * as lambda from '@aws-cdk/aws-lambda'; +import * as cloudfront from '@aws-cdk/aws-cloudfront'; +import * as apigateway from '@aws-cdk/aws-apigateway'; +import * as cdk from '@aws-cdk/core'; +import { Duration } from "@aws-cdk/core/lib/duration"; +import * as origins from '@aws-cdk/aws-cloudfront-origins'; + +// Setup +const app = new App(); +const stack = new Stack(app, 'test-cf-api-lambda-override-stack'); +stack.templateOptions.description = 'Integration Test for aws-cloudfront-apigateway-lambda'; + +const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_10_X, + handler: 'index.handler' +}; + +// Some Caching for static content +const someCachePolicy = new cloudfront.CachePolicy(stack, 'SomeCachePolicy', { + cachePolicyName: 'SomeCachePolicy', + defaultTtl: Duration.hours(8), + minTtl: Duration.hours(5), + maxTtl: Duration.hours(10), +}); + +// Disable Caching for dynamic content +const noCachePolicy = new cloudfront.CachePolicy(stack, 'NoCachePolicy', { + cachePolicyName: 'NoCachePolicy', + defaultTtl: Duration.minutes(0), + minTtl: Duration.minutes(0), + maxTtl: Duration.minutes(0), +}); + +const construct = new CloudFrontToApiGatewayToLambda(stack, 'cf-api-lambda-override', { + lambdaFunctionProps: lambdaProps, + apiGatewayProps: { + proxy: false, + defaultMethodOptions: { + authorizationType: apigateway.AuthorizationType.NONE, + }, + }, + cloudFrontDistributionProps: { + defaultBehavior: { + cachePolicy: someCachePolicy + } + } +}); + +const apiEndPoint = construct.apiGateway; +const apiEndPointUrlWithoutProtocol = cdk.Fn.select(1, cdk.Fn.split("://", apiEndPoint.url)); +const apiEndPointDomainName = cdk.Fn.select(0, cdk.Fn.split("/", apiEndPointUrlWithoutProtocol)); + +const staticResource = construct.apiGateway.root.addResource('static'); +const staticMethod = staticResource.addMethod('GET', new apigateway.HttpIntegration('http://amazon.com')); + +const dynamicResource = construct.apiGateway.root.addResource('dynamic'); +const dynamicMethod = dynamicResource.addMethod('GET'); + +// Add behavior +construct.cloudFrontWebDistribution.addBehavior('/dynamic', new origins.HttpOrigin(apiEndPointDomainName, { + originPath: `/${apiEndPoint.deploymentStage.stageName}/dynamic` + }), { + cachePolicy: noCachePolicy +}); +// Suppress CFN_NAG warnings +suppressWarnings(staticMethod); +suppressWarnings(dynamicMethod); + +function suppressWarnings(method: apigateway.Method) { + const child = method.node.findChild('Resource') as apigateway.CfnMethod; + child.cfnOptions.metadata = { + cfn_nag: { + rules_to_suppress: [{ + id: 'W59', + reason: `AWS::ApiGateway::Method AuthorizationType is set to 'NONE' because API Gateway behind CloudFront does not support AWS_IAM authentication` + }] + } + }; +} + +// Synth +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/lib/index.ts index 0ddd74310..680add064 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/lib/index.ts @@ -33,7 +33,7 @@ export interface CloudFrontToApiGatewayProps { * * @default - Default props are used */ - readonly cloudFrontDistributionProps?: cloudfront.CloudFrontWebDistributionProps | any, + readonly cloudFrontDistributionProps?: cloudfront.DistributionProps | any, /** * Optional user provided props to turn on/off the automatic injection of best practice HTTP * security headers in all responses from cloudfront @@ -44,7 +44,7 @@ export interface CloudFrontToApiGatewayProps { } export class CloudFrontToApiGateway extends Construct { - public readonly cloudFrontWebDistribution: cloudfront.CloudFrontWebDistribution; + public readonly cloudFrontWebDistribution: cloudfront.Distribution; public readonly apiGateway: api.RestApi; public readonly edgeLambdaFunctionVersion?: lambda.Version; public readonly cloudFrontLoggingBucket?: s3.Bucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json index c64867ad2..6cd700a0f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-cloudfront-apigateway", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS Cloudfront to AWS API Gateway integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-s3": "~1.67.0" + "@aws-cdk/aws-s3": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/__snapshots__/test.cloudfront-apigateway.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/__snapshots__/test.cloudfront-apigateway.test.js.snap index e5c764e37..5c2397d40 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/__snapshots__/test.cloudfront-apigateway.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/__snapshots__/test.cloudfront-apigateway.test.js.snap @@ -620,7 +620,7 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "testcloudfrontapigatewayCloudFrontDistributionCFDistribution2270C4C1": Object { + "testcloudfrontapigatewayCloudFrontDistribution159820CC": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ @@ -634,21 +634,8 @@ Object { "Properties": Object { "DistributionConfig": Object { "DefaultCacheBehavior": Object { - "AllowedMethods": Array [ - "GET", - "HEAD", - ], - "CachedMethods": Array [ - "GET", - "HEAD", - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": Object { - "Cookies": Object { - "Forward": "none", - }, - "QueryString": false, - }, "LambdaFunctionAssociations": Array [ Object { "EventType": "origin-response", @@ -657,10 +644,9 @@ Object { }, }, ], - "TargetOriginId": "origin1", + "TargetOriginId": "testcloudfrontapigatewayCloudFrontDistributionOrigin1FA7A74D5", "ViewerProtocolPolicy": "redirect-to-https", }, - "DefaultRootObject": "index.html", "Enabled": true, "HttpVersion": "http2", "IPV6Enabled": true, @@ -671,21 +657,11 @@ Object { "DomainName", ], }, - "IncludeCookies": false, }, "Origins": Array [ Object { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "CustomOriginConfig": Object { - "HTTPPort": 80, - "HTTPSPort": 443, - "OriginKeepaliveTimeout": 5, "OriginProtocolPolicy": "https-only", - "OriginReadTimeout": 30, - "OriginSSLProtocols": Array [ - "TLSv1.2", - ], }, "DomainName": Object { "Fn::Select": Array [ @@ -731,7 +707,7 @@ Object { }, ], }, - "Id": "origin1", + "Id": "testcloudfrontapigatewayCloudFrontDistributionOrigin1FA7A74D5", "OriginPath": Object { "Fn::Join": Array [ "", @@ -745,10 +721,6 @@ Object { }, }, ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": Object { - "CloudFrontDefaultCertificate": true, - }, }, }, "Type": "AWS::CloudFront::Distribution", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json index 1eadc8db8..e6f20f42d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json @@ -804,26 +804,13 @@ } } }, - "testcloudfrontapigatewayCloudFrontDistributionCFDistribution2270C4C1": { + "testcloudfrontapigatewayCloudFrontDistribution159820CC": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "DefaultCacheBehavior": { - "AllowedMethods": [ - "GET", - "HEAD" - ], - "CachedMethods": [ - "GET", - "HEAD" - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": { - "Cookies": { - "Forward": "none" - }, - "QueryString": false - }, "LambdaFunctionAssociations": [ { "EventType": "origin-response", @@ -832,10 +819,9 @@ } } ], - "TargetOriginId": "origin1", + "TargetOriginId": "testcloudfrontapigatewaystacktestcloudfrontapigatewayCloudFrontDistributionOrigin1D5DE2087", "ViewerProtocolPolicy": "redirect-to-https" }, - "DefaultRootObject": "index.html", "Enabled": true, "HttpVersion": "http2", "IPV6Enabled": true, @@ -845,22 +831,12 @@ "testcloudfrontapigatewayCloudfrontLoggingBucket9811F6E8", "DomainName" ] - }, - "IncludeCookies": false + } }, "Origins": [ { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "CustomOriginConfig": { - "HTTPPort": 80, - "HTTPSPort": 443, - "OriginKeepaliveTimeout": 5, - "OriginProtocolPolicy": "https-only", - "OriginReadTimeout": 30, - "OriginSSLProtocols": [ - "TLSv1.2" - ] + "OriginProtocolPolicy": "https-only" }, "DomainName": { "Fn::Select": [ @@ -906,7 +882,7 @@ } ] }, - "Id": "origin1", + "Id": "testcloudfrontapigatewaystacktestcloudfrontapigatewayCloudFrontDistributionOrigin1D5DE2087", "OriginPath": { "Fn::Join": [ "", @@ -919,11 +895,7 @@ ] } } - ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": { - "CloudFrontDefaultCertificate": true - } + ] } }, "Metadata": { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts index 1d3775d37..5cac59dce 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts @@ -38,7 +38,7 @@ export interface CloudFrontToS3Props { * * @default - Default props are used */ - readonly cloudFrontDistributionProps?: cloudfront.CloudFrontWebDistributionProps | any, + readonly cloudFrontDistributionProps?: cloudfront.DistributionProps | any, /** * Optional user provided props to turn on/off the automatic injection of best practice HTTP * security headers in all responses from cloudfront @@ -49,7 +49,7 @@ export interface CloudFrontToS3Props { } export class CloudFrontToS3 extends Construct { - public readonly cloudFrontWebDistribution: cloudfront.CloudFrontWebDistribution; + public readonly cloudFrontWebDistribution: cloudfront.Distribution; public readonly edgeLambdaFunctionVersion?: lambda.Version; public readonly cloudFrontLoggingBucket?: s3.Bucket; public readonly s3Bucket?: s3.Bucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json index 8d62037c5..4ca66a3cc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-cloudfront-s3", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS Cloudfront to AWS S3 integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,17 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-certificatemanager": "~1.68.0", + "@aws-cdk/aws-cloudfront-origins": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-lambda": "~1.67.0" + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-certificatemanager": "~1.68.0", + "@aws-cdk/aws-cloudfront-origins": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/__snapshots__/test.cloudfront-s3.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/__snapshots__/test.cloudfront-s3.test.js.snap index a3ed92b99..c3a266a58 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/__snapshots__/test.cloudfront-s3.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/__snapshots__/test.cloudfront-s3.test.js.snap @@ -3,7 +3,7 @@ exports[`snapshot test CloudFrontToS3 default params 1`] = ` Object { "Resources": Object { - "testcloudfronts3CloudFrontDistributionCFDistribution61FCC088": Object { + "testcloudfronts3CloudFrontDistribution0565DEE8": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ @@ -17,21 +17,8 @@ Object { "Properties": Object { "DistributionConfig": Object { "DefaultCacheBehavior": Object { - "AllowedMethods": Array [ - "GET", - "HEAD", - ], - "CachedMethods": Array [ - "GET", - "HEAD", - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": Object { - "Cookies": Object { - "Forward": "none", - }, - "QueryString": false, - }, "LambdaFunctionAssociations": Array [ Object { "EventType": "origin-response", @@ -40,7 +27,7 @@ Object { }, }, ], - "TargetOriginId": "origin1", + "TargetOriginId": "testcloudfronts3CloudFrontDistributionOrigin124051039", "ViewerProtocolPolicy": "redirect-to-https", }, "DefaultRootObject": "index.html", @@ -54,19 +41,16 @@ Object { "DomainName", ], }, - "IncludeCookies": false, }, "Origins": Array [ Object { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "DomainName": Object { "Fn::GetAtt": Array [ "testcloudfronts3S3BucketE0C5F76E", "RegionalDomainName", ], }, - "Id": "origin1", + "Id": "testcloudfronts3CloudFrontDistributionOrigin124051039", "S3OriginConfig": Object { "OriginAccessIdentity": Object { "Fn::Join": Array [ @@ -74,7 +58,7 @@ Object { Array [ "origin-access-identity/cloudfront/", Object { - "Ref": "testcloudfronts3CloudFrontOriginAccessIdentity2C681839", + "Ref": "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058", }, ], ], @@ -82,18 +66,14 @@ Object { }, }, ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": Object { - "CloudFrontDefaultCertificate": true, - }, }, }, "Type": "AWS::CloudFront::Distribution", }, - "testcloudfronts3CloudFrontOriginAccessIdentity2C681839": Object { + "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058": Object { "Properties": Object { "CloudFrontOriginAccessIdentityConfig": Object { - "Comment": "Access S3 bucket content only through CloudFront", + "Comment": "Identity for testcloudfronts3CloudFrontDistributionOrigin124051039", }, }, "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", @@ -262,19 +242,10 @@ Object { ], "Effect": "Allow", "Principal": Object { - "AWS": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::cloudfront:user/CloudFront Origin Access Identity ", - Object { - "Ref": "testcloudfronts3CloudFrontOriginAccessIdentity2C681839", - }, - ], + "CanonicalUser": Object { + "Fn::GetAtt": Array [ + "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058", + "S3CanonicalUserId", ], }, }, @@ -301,32 +272,6 @@ Object { }, ], }, - Object { - "Action": "s3:GetObject", - "Effect": "Allow", - "Principal": Object { - "CanonicalUser": Object { - "Fn::GetAtt": Array [ - "testcloudfronts3CloudFrontOriginAccessIdentity2C681839", - "S3CanonicalUserId", - ], - }, - }, - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "testcloudfronts3S3BucketE0C5F76E", - "Arn", - ], - }, - "/*", - ], - ], - }, - }, ], "Version": "2012-10-17", }, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json index ad328e5b9..c215907d2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json @@ -155,19 +155,10 @@ ], "Effect": "Allow", "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::cloudfront:user/CloudFront Origin Access Identity ", - { - "Ref": "testcloudfronts3CloudFrontOriginAccessIdentity2C681839" - } - ] + "CanonicalUser": { + "Fn::GetAtt": [ + "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058", + "S3CanonicalUserId" ] } }, @@ -195,30 +186,42 @@ ] }, { - "Action": "s3:GetObject", + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*" + ], "Effect": "Allow", "Principal": { "CanonicalUser": { "Fn::GetAtt": [ - "testcloudfronts3CloudFrontOriginAccessIdentity2C681839", + "testcloudfronts3CloudFrontDistributionOrigin2S3OriginC54B5C65", "S3CanonicalUserId" ] } }, - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "S3Bucket07682993", - "Arn" - ] - }, - "/*" + "Resource": [ + { + "Fn::GetAtt": [ + "S3Bucket07682993", + "Arn" ] - ] - } + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "S3Bucket07682993", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" @@ -235,14 +238,6 @@ } } }, - "testcloudfronts3CloudFrontOriginAccessIdentity2C681839": { - "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", - "Properties": { - "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Access S3 bucket content only through CloudFront" - } - } - }, "testcloudfronts3SetHttpSecurityHeadersServiceRole74D1E252": { "Type": "AWS::IAM::Role", "Properties": { @@ -451,26 +446,32 @@ } } }, - "testcloudfronts3CloudFrontDistributionCFDistribution61FCC088": { + "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058": { + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + "Properties": { + "CloudFrontOriginAccessIdentityConfig": { + "Comment": "Identity for testcloudfronts3existingbucketstacktestcloudfronts3CloudFrontDistributionOrigin1797491E4" + } + } + }, + "testcloudfronts3CloudFrontDistribution0565DEE8": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { + "CacheBehaviors": [ + { + "CachePolicyId": { + "Ref": "myCachePolicy16CE2FCF" + }, + "Compress": true, + "PathPattern": "/images/*.jpg", + "TargetOriginId": "testcloudfronts3existingbucketstacktestcloudfronts3CloudFrontDistributionOrigin2DE0DE37C", + "ViewerProtocolPolicy": "allow-all" + } + ], "DefaultCacheBehavior": { - "AllowedMethods": [ - "GET", - "HEAD" - ], - "CachedMethods": [ - "GET", - "HEAD" - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": { - "Cookies": { - "Forward": "none" - }, - "QueryString": false - }, "LambdaFunctionAssociations": [ { "EventType": "origin-response", @@ -479,7 +480,7 @@ } } ], - "TargetOriginId": "origin1", + "TargetOriginId": "testcloudfronts3existingbucketstacktestcloudfronts3CloudFrontDistributionOrigin1797491E4", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -492,20 +493,39 @@ "testcloudfronts3CloudfrontLoggingBucket985C0FE8", "DomainName" ] - }, - "IncludeCookies": false + } }, "Origins": [ { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "DomainName": { "Fn::GetAtt": [ "S3Bucket07682993", "RegionalDomainName" ] }, - "Id": "origin1", + "Id": "testcloudfronts3existingbucketstacktestcloudfronts3CloudFrontDistributionOrigin1797491E4", + "S3OriginConfig": { + "OriginAccessIdentity": { + "Fn::Join": [ + "", + [ + "origin-access-identity/cloudfront/", + { + "Ref": "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058" + } + ] + ] + } + } + }, + { + "DomainName": { + "Fn::GetAtt": [ + "S3Bucket07682993", + "RegionalDomainName" + ] + }, + "Id": "testcloudfronts3existingbucketstacktestcloudfronts3CloudFrontDistributionOrigin2DE0DE37C", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -513,18 +533,14 @@ [ "origin-access-identity/cloudfront/", { - "Ref": "testcloudfronts3CloudFrontOriginAccessIdentity2C681839" + "Ref": "testcloudfronts3CloudFrontDistributionOrigin2S3OriginC54B5C65" } ] ] } } } - ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": { - "CloudFrontDefaultCertificate": true - } + ] } }, "Metadata": { @@ -537,6 +553,37 @@ ] } } + }, + "testcloudfronts3CloudFrontDistributionOrigin2S3OriginC54B5C65": { + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + "Properties": { + "CloudFrontOriginAccessIdentityConfig": { + "Comment": "Identity for testcloudfronts3existingbucketstacktestcloudfronts3CloudFrontDistributionOrigin2DE0DE37C" + } + } + }, + "myCachePolicy16CE2FCF": { + "Type": "AWS::CloudFront::CachePolicy", + "Properties": { + "CachePolicyConfig": { + "DefaultTTL": 0, + "MaxTTL": 0, + "MinTTL": 0, + "Name": "MyPolicy", + "ParametersInCacheKeyAndForwardedToOrigin": { + "CookiesConfig": { + "CookieBehavior": "none" + }, + "EnableAcceptEncodingGzip": false, + "HeadersConfig": { + "HeaderBehavior": "none" + }, + "QueryStringsConfig": { + "QueryStringBehavior": "none" + } + } + } + } } } } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts index 79d9a443e..98ca1fa08 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts @@ -16,6 +16,9 @@ import { App, Stack } from "@aws-cdk/core"; import * as s3 from "@aws-cdk/aws-s3"; import * as defaults from "@aws-solutions-constructs/core"; import { CloudFrontToS3 } from "../lib"; +import * as origins from '@aws-cdk/aws-cloudfront-origins'; +import * as cloudfront from '@aws-cdk/aws-cloudfront'; +import { Duration } from "@aws-cdk/core/lib/duration"; // Setup const app = new App(); @@ -24,9 +27,22 @@ const stack = new Stack(app, 'test-cloudfront-s3-existing-bucket-stack'); let mybucket: s3.Bucket; [mybucket] = defaults.buildS3Bucket(stack, {}); -new CloudFrontToS3(stack, 'test-cloudfront-s3', { +const _construct = new CloudFrontToS3(stack, 'test-cloudfront-s3', { existingBucketObj: mybucket }); +// Add Cache Policy +const myCachePolicy = new cloudfront.CachePolicy(stack, 'myCachePolicy', { + cachePolicyName: 'MyPolicy', + defaultTtl: Duration.minutes(0), + minTtl: Duration.minutes(0), + maxTtl: Duration.minutes(0), +}); + +// Add behavior +_construct.cloudFrontWebDistribution.addBehavior('/images/*.jpg', new origins.S3Origin(mybucket), { + cachePolicy: myCachePolicy +}); + // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json index db14c760b..e9db44b8f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json @@ -156,19 +156,10 @@ ], "Effect": "Allow", "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::cloudfront:user/CloudFront Origin Access Identity ", - { - "Ref": "testcloudfronts3CloudFrontOriginAccessIdentity2C681839" - } - ] + "CanonicalUser": { + "Fn::GetAtt": [ + "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058", + "S3CanonicalUserId" ] } }, @@ -194,32 +185,6 @@ ] } ] - }, - { - "Action": "s3:GetObject", - "Effect": "Allow", - "Principal": { - "CanonicalUser": { - "Fn::GetAtt": [ - "testcloudfronts3CloudFrontOriginAccessIdentity2C681839", - "S3CanonicalUserId" - ] - } - }, - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testcloudfronts3S3BucketE0C5F76E", - "Arn" - ] - }, - "/*" - ] - ] - } } ], "Version": "2012-10-17" @@ -236,14 +201,6 @@ } } }, - "testcloudfronts3CloudFrontOriginAccessIdentity2C681839": { - "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", - "Properties": { - "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Access S3 bucket content only through CloudFront" - } - } - }, "testcloudfronts3SetHttpSecurityHeadersServiceRole74D1E252": { "Type": "AWS::IAM::Role", "Properties": { @@ -452,26 +409,21 @@ } } }, - "testcloudfronts3CloudFrontDistributionCFDistribution61FCC088": { + "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058": { + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + "Properties": { + "CloudFrontOriginAccessIdentityConfig": { + "Comment": "Identity for testcloudfronts3stacktestcloudfronts3CloudFrontDistributionOrigin1572F5BE9" + } + } + }, + "testcloudfronts3CloudFrontDistribution0565DEE8": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "DefaultCacheBehavior": { - "AllowedMethods": [ - "GET", - "HEAD" - ], - "CachedMethods": [ - "GET", - "HEAD" - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": { - "Cookies": { - "Forward": "none" - }, - "QueryString": false - }, "LambdaFunctionAssociations": [ { "EventType": "origin-response", @@ -480,7 +432,7 @@ } } ], - "TargetOriginId": "origin1", + "TargetOriginId": "testcloudfronts3stacktestcloudfronts3CloudFrontDistributionOrigin1572F5BE9", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -493,20 +445,17 @@ "testcloudfronts3CloudfrontLoggingBucket985C0FE8", "DomainName" ] - }, - "IncludeCookies": false + } }, "Origins": [ { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "DomainName": { "Fn::GetAtt": [ "testcloudfronts3S3BucketE0C5F76E", "RegionalDomainName" ] }, - "Id": "origin1", + "Id": "testcloudfronts3stacktestcloudfronts3CloudFrontDistributionOrigin1572F5BE9", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -514,18 +463,14 @@ [ "origin-access-identity/cloudfront/", { - "Ref": "testcloudfronts3CloudFrontOriginAccessIdentity2C681839" + "Ref": "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058" } ] ] } } } - ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": { - "CloudFrontDefaultCertificate": true - } + ] } }, "Metadata": { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json index ea8a9551b..89ad2693c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json @@ -156,19 +156,10 @@ ], "Effect": "Allow", "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::cloudfront:user/CloudFront Origin Access Identity ", - { - "Ref": "testcloudfronts3nosecurityheadersCloudFrontOriginAccessIdentity5321D214" - } - ] + "CanonicalUser": { + "Fn::GetAtt": [ + "testcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1S3Origin38CFDB89", + "S3CanonicalUserId" ] } }, @@ -194,32 +185,6 @@ ] } ] - }, - { - "Action": "s3:GetObject", - "Effect": "Allow", - "Principal": { - "CanonicalUser": { - "Fn::GetAtt": [ - "testcloudfronts3nosecurityheadersCloudFrontOriginAccessIdentity5321D214", - "S3CanonicalUserId" - ] - } - }, - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testcloudfronts3nosecurityheadersS3Bucket4D06173D", - "Arn" - ] - }, - "/*" - ] - ] - } } ], "Version": "2012-10-17" @@ -236,14 +201,6 @@ } } }, - "testcloudfronts3nosecurityheadersCloudFrontOriginAccessIdentity5321D214": { - "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", - "Properties": { - "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Access S3 bucket content only through CloudFront" - } - } - }, "testcloudfronts3nosecurityheadersCloudfrontLoggingBucket92A5E2A5": { "Type": "AWS::S3::Bucket", "Properties": { @@ -315,27 +272,22 @@ } } }, - "testcloudfronts3nosecurityheadersCloudFrontDistributionCFDistribution3F3C52A8": { + "testcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1S3Origin38CFDB89": { + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + "Properties": { + "CloudFrontOriginAccessIdentityConfig": { + "Comment": "Identity for testcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1BB2D7D46" + } + } + }, + "testcloudfronts3nosecurityheadersCloudFrontDistribution3BC8CDED": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "DefaultCacheBehavior": { - "AllowedMethods": [ - "GET", - "HEAD" - ], - "CachedMethods": [ - "GET", - "HEAD" - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": { - "Cookies": { - "Forward": "none" - }, - "QueryString": false - }, - "TargetOriginId": "origin1", + "TargetOriginId": "testcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1BB2D7D46", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -348,20 +300,17 @@ "testcloudfronts3nosecurityheadersCloudfrontLoggingBucket92A5E2A5", "DomainName" ] - }, - "IncludeCookies": false + } }, "Origins": [ { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "DomainName": { "Fn::GetAtt": [ "testcloudfronts3nosecurityheadersS3Bucket4D06173D", "RegionalDomainName" ] }, - "Id": "origin1", + "Id": "testcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1BB2D7D46", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -369,18 +318,14 @@ [ "origin-access-identity/cloudfront/", { - "Ref": "testcloudfronts3nosecurityheadersCloudFrontOriginAccessIdentity5321D214" + "Ref": "testcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1S3Origin38CFDB89" } ] ] } } } - ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": { - "CloudFrontDefaultCertificate": true - } + ] } }, "Metadata": { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts index e21f6a04f..53dae0aac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts @@ -16,6 +16,7 @@ import { CloudFrontToS3, CloudFrontToS3Props } from "../lib"; import * as cdk from "@aws-cdk/core"; import * as s3 from '@aws-cdk/aws-s3'; import '@aws-cdk/assert/jest'; +import * as acm from '@aws-cdk/aws-certificatemanager'; function deploy(stack: cdk.Stack) { return new CloudFrontToS3(stack, 'test-cloudfront-s3', {}); @@ -102,12 +103,12 @@ test('check existing bucket', () => { test('test cloudfront with custom domain names', () => { const stack = new cdk.Stack(); + const certificate = acm.Certificate.fromCertificateArn(stack, 'Cert', 'arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012'); + const props: CloudFrontToS3Props = { cloudFrontDistributionProps: { - aliasConfiguration: { - acmCertRef: '/acm/mycertificate', - names: ['mydomains'] - } + domainNames: ['mydomains'], + certificate } }; @@ -115,79 +116,65 @@ test('test cloudfront with custom domain names', () => { expect(stack).toHaveResourceLike("AWS::CloudFront::Distribution", { DistributionConfig: { - Aliases: [ - "mydomains" - ], - DefaultCacheBehavior: { - AllowedMethods: [ - "GET", - "HEAD" - ], - CachedMethods: [ - "GET", - "HEAD" - ], - Compress: true, - ForwardedValues: { - Cookies: { - Forward: "none" - }, - QueryString: false - }, - LambdaFunctionAssociations: [ - { - EventType: "origin-response", - LambdaFunctionARN: { - Ref: "testcloudfronts3SetHttpSecurityHeadersVersionF1C744BB" - } + Aliases: [ + "mydomains" + ], + DefaultCacheBehavior: { + CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6", + Compress: true, + LambdaFunctionAssociations: [ + { + EventType: "origin-response", + LambdaFunctionARN: { + Ref: "testcloudfronts3SetHttpSecurityHeadersVersionF1C744BB" } - ], - TargetOriginId: "origin1", - ViewerProtocolPolicy: "redirect-to-https" - }, - DefaultRootObject: "index.html", - Enabled: true, - HttpVersion: "http2", - IPV6Enabled: true, - Logging: { - Bucket: { + } + ], + TargetOriginId: "testcloudfronts3CloudFrontDistributionOrigin124051039", + ViewerProtocolPolicy: "redirect-to-https" + }, + DefaultRootObject: "index.html", + Enabled: true, + HttpVersion: "http2", + IPV6Enabled: true, + Logging: { + Bucket: { + "Fn::GetAtt": [ + "testcloudfronts3CloudfrontLoggingBucket985C0FE8", + "DomainName" + ] + } + }, + Origins: [ + { + DomainName: { "Fn::GetAtt": [ - "testcloudfronts3CloudfrontLoggingBucket985C0FE8", - "DomainName" + "testcloudfronts3S3BucketE0C5F76E", + "RegionalDomainName" ] }, - IncludeCookies: false - }, - Origins: [ - { - DomainName: { - "Fn::GetAtt": [ - "testcloudfronts3S3BucketE0C5F76E", - "RegionalDomainName" + Id: "testcloudfronts3CloudFrontDistributionOrigin124051039", + S3OriginConfig: { + OriginAccessIdentity: { + "Fn::Join": [ + "", + [ + "origin-access-identity/cloudfront/", + { + Ref: "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058" + } + ] ] - }, - Id: "origin1", - S3OriginConfig: { - OriginAccessIdentity: { - "Fn::Join": [ - "", - [ - "origin-access-identity/cloudfront/", - { - Ref: "testcloudfronts3CloudFrontOriginAccessIdentity2C681839" - } - ] - ] - } } } - ], - PriceClass: "PriceClass_100", - ViewerCertificate: { - AcmCertificateArn: "/acm/mycertificate", - SslSupportMethod: "sni-only" } + ], + ViewerCertificate: { + AcmCertificateArn: "arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012", + MinimumProtocolVersion: "TLSv1.2_2019", + SslSupportMethod: "sni-only" } + } }); }); diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json index 743ac7fab..054bcec70 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-cognito-apigateway-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS Cognito to AWS API Gateway to AWS Lambda integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/package.json b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/package.json index 1944a920c..ae8791b0a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for Amazon Dynamodb stream to AWS Lambda to AWS Elasticsearch with Kibana integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,22 +53,22 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-elasticsearch": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-dynamodb-stream-lambda": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-elasticsearch": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-dynamodb-stream-lambda": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -78,18 +78,18 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-elasticsearch": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-dynamodb-stream-lambda": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-elasticsearch": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-dynamodb-stream-lambda": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0" + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/test/__snapshots__/dynamodb-stream-lambda-elasticsearch-kibana.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/test/__snapshots__/dynamodb-stream-lambda-elasticsearch-kibana.test.js.snap index daee4153b..8256e9a2b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/test/__snapshots__/dynamodb-stream-lambda-elasticsearch-kibana.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/test/__snapshots__/dynamodb-stream-lambda-elasticsearch-kibana.test.js.snap @@ -234,20 +234,7 @@ Object { Object { "Action": "dynamodb:ListStreams", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "testdynamodbstreamlambdaelasticsearchstackDynamoDBStreamToLambdaDynamoTable9A779B83", - "Arn", - ], - }, - "/stream/*", - ], - ], - }, + "Resource": "*", }, Object { "Action": Array [ diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json index 5fe85b752..36f12a48a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json @@ -71,20 +71,7 @@ { "Action": "dynamodb:ListStreams", "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testdynamodbstreamlambdaelasticsearchkibanaDynamoDBStreamToLambdaDynamoTable90CA17D8", - "Arn" - ] - }, - "/stream/*" - ] - ] - } + "Resource": "*" }, { "Action": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/package.json index b823619e5..97dcbaa9c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-dynamodb-stream-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS DynamoDB Stream to AWS Lambda integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0" + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/__snapshots__/dynamodb-stream-lambda.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/__snapshots__/dynamodb-stream-lambda.test.js.snap index 296a7bc80..637c6254a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/__snapshots__/dynamodb-stream-lambda.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/__snapshots__/dynamodb-stream-lambda.test.js.snap @@ -228,20 +228,7 @@ Object { Object { "Action": "dynamodb:ListStreams", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "testlambdadynamodbstackDynamoTable8138E93B", - "Arn", - ], - }, - "/stream/*", - ], - ], - }, + "Resource": "*", }, Object { "Action": Array [ diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/dynamodb-stream-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/dynamodb-stream-lambda.test.ts index 3a092315a..22aa09ad8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/dynamodb-stream-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/dynamodb-stream-lambda.test.ts @@ -107,20 +107,7 @@ test('check lambda permission to read dynamodb stream', () => { { Action: "dynamodb:ListStreams", Effect: "Allow", - Resource: { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testlambdadynamodbstackDynamoTable8138E93B", - "Arn" - ] - }, - "/stream/*" - ] - ] - } + Resource: "*" }, { Action: [ diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/integ.no-arguments.expected.json index 5fa6a8b01..c38f348c7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/integ.no-arguments.expected.json @@ -71,20 +71,7 @@ { "Action": "dynamodb:ListStreams", "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testdynamodbstreamlambdaDynamoTable6EB2ED0F", - "Arn" - ] - }, - "/stream/*" - ] - ] - } + "Resource": "*" }, { "Action": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-events-rule-lambda/package.json index ea8e4279a..48278b50a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-events-rule-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for deploying AWS Events Rule that inveokes AWS Lambda", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/README.md b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/README.md index 48a13eca3..0f59b95f9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/README.md @@ -27,6 +27,9 @@ This AWS Solutions Construct implements an AWS Events rule and an AWS SNS Topic. Here is a minimal deployable pattern definition in Typescript: ``` typescript +import { Duration } from '@aws-cdk/core'; +import * as events from '@aws-cdk/aws-events'; +import * as iam from '@aws-cdk/aws-iam'; import { EventsRuleToSNSProps, EventsRuleToSNS } from "@aws-solutions-constructs/aws-events-rule-sns"; const props: EventsRuleToSNSProps = { @@ -35,7 +38,7 @@ const props: EventsRuleToSNSProps = { } }; -const constructStack = new EventsRuleToSNS(this, 'test-events-rule-sns', props); +const constructStack = new EventsRuleToSNS(this, 'test-construct', props); // Grant yourself permissions to use the Customer Managed KMS Key const policyStatement = new iam.PolicyStatement({ diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/package.json b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/package.json index 853c14d47..85ebc7879 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-events-rule-sns", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for deploying AWS Events Rule that invokes AWS SNS", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/README.md b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/README.md index 80014b038..4c122aa58 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/README.md @@ -27,8 +27,10 @@ This AWS Solutions Construct implements an AWS Events rule and an AWS SQS Queue. Here is a minimal deployable pattern definition in Typescript: ``` typescript -import { EventsRuleToSQSProps, EventsRuleToSQS } from "@aws-solutions-constructs/aws-events-rule-sqs"; +import { Duration } from '@aws-cdk/core'; +import * as events from '@aws-cdk/aws-events'; import * as iam from '@aws-cdk/aws-iam'; +import { EventsRuleToSQSProps, EventsRuleToSQS } from "@aws-solutions-constructs/aws-events-rule-sqs"; const props: EventsRuleToSQSProps = { eventRuleProps: { @@ -36,7 +38,7 @@ const props: EventsRuleToSQSProps = { } }; -const constructStack = new EventsRuleToSQS(this, 'test-events-rule-sqs', props); +const constructStack = new EventsRuleToSQS(this, 'test-construct', props); // Grant yourself permissions to use the Customer Managed KMS Key const policyStatement = new iam.PolicyStatement({ diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/package.json index f2cd41d4d..b3956ce03 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-events-rule-sqs", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for deploying AWS Events Rule that invokes AWS SQS", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-step-function/package.json b/source/patterns/@aws-solutions-constructs/aws-events-rule-step-function/package.json index 96626d4c8..656d8061f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-step-function/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-step-function/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-events-rule-step-function", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for deploying AWS Events Rule that invokes AWS Step Function", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,19 +53,19 @@ } }, "dependencies": { - "@aws-cdk/aws-stepfunctions": "~1.67.0", - "@aws-cdk/aws-stepfunctions-tasks": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-stepfunctions": "~1.68.0", + "@aws-cdk/aws-stepfunctions-tasks": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -75,15 +75,15 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-stepfunctions": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-stepfunctions": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/aws-stepfunctions-tasks": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-stepfunctions-tasks": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json index fc30f888e..a3f03eccc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-iot-kinesisfirehose-s3", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS IoT to AWS Kinesis Firehose to AWS S3 integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,18 +53,18 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesisfirehose": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-iot": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesisfirehose": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-iot": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -74,14 +74,14 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesisfirehose": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-iot": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesisfirehose": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-iot": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/__snapshots__/test.iot-kinesisfirehose-s3.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/__snapshots__/test.iot-kinesisfirehose-s3.test.js.snap index 0426da7c6..cca0198bd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/__snapshots__/test.iot-kinesisfirehose-s3.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/__snapshots__/test.iot-kinesisfirehose-s3.test.js.snap @@ -94,6 +94,30 @@ Object { }, }, "CompressionFormat": "GZIP", + "EncryptionConfiguration": Object { + "KMSEncryptionConfig": Object { + "AWSKMSKeyARN": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":kms:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":alias/aws/s3", + ], + ], + }, + }, + }, "RoleARN": Object { "Fn::GetAtt": Array [ "testiotfirehoses3KinesisFirehoseToS3KinesisFirehoseRole93DE9170", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json index 5b21a745f..5c3f0fc34 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json @@ -289,6 +289,30 @@ } }, "CompressionFormat": "GZIP", + "EncryptionConfiguration": { + "KMSEncryptionConfig": { + "AWSKMSKeyARN": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":kms:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, "RoleARN": { "Fn::GetAtt": [ "testiotfirehoses3KinesisFirehoseToS3KinesisFirehoseRole93DE9170", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json index 4dcd1e563..4226d8d96 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-iot-lambda-dynamodb", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS IoT to AWS Lambda to AWS DyanmoDB integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-iot": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-iot-lambda": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.67.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-iot": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-iot-lambda": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-iot": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-iot-lambda": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.67.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-iot": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-iot-lambda": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json index c9cb58525..511a7f6a4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-iot-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS IoT to AWS Lambda integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/aws-iot": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-iot": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iot": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", + "@aws-cdk/aws-iot": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json index b035d840a..17c1e892a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an Amazon Kinesis Data Firehose delivery stream and (1) an Amazon S3 bucket, and (2) an Amazon Kinesis Data Analytics application.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,19 +53,19 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesis": "~1.67.0", - "@aws-cdk/aws-kinesisanalytics": "~1.67.0", - "@aws-cdk/aws-kinesisfirehose": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesis": "~1.68.0", + "@aws-cdk/aws-kinesisanalytics": "~1.68.0", + "@aws-cdk/aws-kinesisfirehose": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -75,15 +75,15 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesis": "~1.67.0", - "@aws-cdk/aws-kinesisanalytics": "~1.67.0", - "@aws-cdk/aws-kinesisfirehose": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesis": "~1.68.0", + "@aws-cdk/aws-kinesisanalytics": "~1.68.0", + "@aws-cdk/aws-kinesisfirehose": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/__snapshots__/test.kinesisfirehose-analytics-s3.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/__snapshots__/test.kinesisfirehose-analytics-s3.test.js.snap index a2247db04..a4994bd3d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/__snapshots__/test.kinesisfirehose-analytics-s3.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/__snapshots__/test.kinesisfirehose-analytics-s3.test.js.snap @@ -127,6 +127,30 @@ Object { }, }, "CompressionFormat": "GZIP", + "EncryptionConfiguration": Object { + "KMSEncryptionConfig": Object { + "AWSKMSKeyARN": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":kms:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":alias/aws/s3", + ], + ], + }, + }, + }, "RoleARN": Object { "Fn::GetAtt": Array [ "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehoseRoleE7F8ADDA", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json index 14273ed75..03b881611 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json @@ -288,6 +288,30 @@ } }, "CompressionFormat": "GZIP", + "EncryptionConfiguration": { + "KMSEncryptionConfig": { + "AWSKMSKeyARN": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":kms:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, "RoleARN": { "Fn::GetAtt": [ "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehoseRoleE7F8ADDA", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/README.md b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/README.md index 6eddbea68..438f0a8ca 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/README.md @@ -18,7 +18,7 @@ | **Language** | **Package** | |:-------------|-----------------| -|![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python|`aws_solutions_constructs.aws_kinesisfirehose_s3`| +|![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python|`aws_solutions_constructs.aws-kinesis-firehose-s3`| |![Typescript Logo](https://docs.aws.amazon.com/cdk/api/latest/img/typescript32.png) Typescript|`@aws-solutions-constructs/aws-kinesisfirehose-s3`| |![Java Logo](https://docs.aws.amazon.com/cdk/api/latest/img/java32.png) Java|`software.amazon.awsconstructs.services.kinesisfirehoses3`| diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts index 17ae0afb3..8af316110 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts @@ -19,6 +19,7 @@ import * as iam from '@aws-cdk/aws-iam'; import { overrideProps } from '@aws-solutions-constructs/core'; import * as logs from '@aws-cdk/aws-logs'; import * as cdk from '@aws-cdk/core'; +import * as kms from '@aws-cdk/aws-kms'; /** * The properties for the KinesisFirehoseToS3 class. @@ -103,10 +104,12 @@ export class KinesisFirehoseToS3 extends Construct { // Attach policy to role firehosePolicy.attachToRole(this.kinesisFirehoseRole); + const awsManagedKey: kms.IKey = kms.Alias.fromAliasName(scope, 'aws-managed-key', 'alias/aws/s3'); + // Setup the default Kinesis Firehose props const defaultKinesisFirehoseProps: kinesisfirehose.CfnDeliveryStreamProps = defaults.DefaultCfnDeliveryStreamProps(bucket.bucketArn, this.kinesisFirehoseRole.roleArn, - this.kinesisFirehoseLogGroup.logGroupName, cwLogStream.logStreamName); + this.kinesisFirehoseLogGroup.logGroupName, cwLogStream.logStreamName, awsManagedKey); // Override with the input props if (props.kinesisFirehoseProps) { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json index fe37ff8a5..32f455b38 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-kinesisfirehose-s3", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an Amazon Kinesis Data Firehose delivery stream and an Amazon S3 bucket.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesisfirehose": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesisfirehose": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesisfirehose": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "constructs": "^3.0.4" + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesisfirehose": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "constructs": "^3.0.4", + "@aws-cdk/aws-kms": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/__snapshots__/test.kinesisfirehose-s3.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/__snapshots__/test.kinesisfirehose-s3.test.js.snap index d93d09215..eebe0aabe 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/__snapshots__/test.kinesisfirehose-s3.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/__snapshots__/test.kinesisfirehose-s3.test.js.snap @@ -26,6 +26,30 @@ Object { }, }, "CompressionFormat": "GZIP", + "EncryptionConfiguration": Object { + "KMSEncryptionConfig": Object { + "AWSKMSKeyARN": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":kms:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":alias/aws/s3", + ], + ], + }, + }, + }, "RoleARN": Object { "Fn::GetAtt": Array [ "testfirehoses3KinesisFirehoseRole9BC5362D", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json index 1fb6fbd95..eb52ec8fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json @@ -289,6 +289,30 @@ } }, "CompressionFormat": "GZIP", + "EncryptionConfiguration": { + "KMSEncryptionConfig": { + "AWSKMSKeyARN": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":kms:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, "RoleARN": { "Fn::GetAtt": [ "testfirehoses3KinesisFirehoseRole9BC5362D", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json index ee4200ba5..4e5bd0e29 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json @@ -147,6 +147,22 @@ } }, "CompressionFormat": "GZIP", + "EncryptionConfiguration": { + "KMSEncryptionConfig": { + "AWSKMSKeyARN": { + "Fn::Join": [ + "", + [ + "arn:aws:kms:us-west-2:", + { + "Ref": "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, "RoleARN": { "Fn::GetAtt": [ "testfirehoses3preexistingbucketstackKinesisFirehoseRole84325204", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts index 931584ca8..2df4b7eb8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts @@ -15,6 +15,7 @@ import { App, Stack } from "@aws-cdk/core"; import { KinesisFirehoseToS3 } from "../lib"; import * as s3 from "@aws-cdk/aws-s3"; +import * as cdk from "@aws-cdk/core"; // Setup const app = new App(); @@ -23,7 +24,16 @@ stack.templateOptions.description = 'Integration Test for aws-kinesisfirehose-s3 const mybucket: s3.IBucket = s3.Bucket.fromBucketName(stack, 'mybucket', 'cdktoolkit-stagingbucket-1cjqz1mn5psg3'); new KinesisFirehoseToS3(stack, 'test-firehose-s3-pre-existing-bucket-stack', { - existingBucketObj: mybucket + existingBucketObj: mybucket, + kinesisFirehoseProps: { + extendedS3DestinationConfiguration : { + encryptionConfiguration: { + kmsEncryptionConfig: { + awskmsKeyArn: `arn:aws:kms:us-west-2:${cdk.Aws.ACCOUNT_ID}:alias/aws/s3` + } + } + } + } }); // Synth diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.eslintignore b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.eslintignore new file mode 100644 index 000000000..0819e2e65 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.eslintignore @@ -0,0 +1,5 @@ +lib/*.js +test/*.js +*.d.ts +coverage +test/lambda/index.js \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.gitignore b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.gitignore new file mode 100644 index 000000000..8626f2274 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.gitignore @@ -0,0 +1,16 @@ +lib/*.js +test/*.js +!test/lambda/* +*.js.map +*.d.ts +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE +*.snk \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.npmignore b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.npmignore new file mode 100644 index 000000000..f66791629 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/.npmignore @@ -0,0 +1,21 @@ +# Exclude typescript source and config +*.ts +tsconfig.json +coverage +.nyc_output +*.tgz +*.snk +*.tsbuildinfo + +# Include javascript files and typescript declarations +!*.js +!*.d.ts + +# Exclude jsii outdir +dist + +# Include .jsii +!.jsii + +# Include .jsii +!.jsii \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/README.md b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/README.md new file mode 100644 index 000000000..b4f68d0e8 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/README.md @@ -0,0 +1,98 @@ +# aws-kinesisstreams-kinesisfirehose-s3 module + + +--- + +![Stability: Experimental](https://img.shields.io/badge/stability-Experimental-important.svg?style=for-the-badge) + +> All classes are under active development and subject to non-backward compatible changes or removal in any +> future version. These are not subject to the [Semantic Versioning](https://semver.org/) model. +> This means that while you may use them, you may need to update your source code when upgrading to a newer version of this package. + +--- + + +| **Reference Documentation**:| https://docs.aws.amazon.com/solutions/latest/constructs/| +|:-------------|:-------------| +
+ +| **Language** | **Package** | +|:-------------|-----------------| +|![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python|`aws_solutions_constructs.aws_kinesisstreams_kinesisfirehose_s3`| +|![Typescript Logo](https://docs.aws.amazon.com/cdk/api/latest/img/typescript32.png) Typescript|`@aws-solutions-constructs/aws-kinesis-streams-kinesis-firehose-s3`| +|![Java Logo](https://docs.aws.amazon.com/cdk/api/latest/img/java32.png) Java|`software.amazon.awsconstructs.services.kinesisstreamskinesisfirehoses3`| + +This AWS Solutions Construct implements an Amazon Kinesis Data Stream (KDS) connected to Amazon Kinesis Data Firehose (KDF) delivery stream connected to an Amazon S3 bucket. + +Here is a minimal deployable pattern definition in Typescript: + +``` javascript +import { KinesisStreamsToKinesisFirehoseToS3 } from '@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3'; + +new KinesisStreamsToKinesisFirehoseToS3(this, 'test-stream-firehose-s3', {}); + +``` + +## Initializer + +``` text +new KinesisStreamsToKinesisFirehoseToS3(scope: Construct, id: string, props: KinesisStreamsToKinesisFirehoseToS3Props); +``` + +_Parameters_ + +* scope [`Construct`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_core.Construct.html) +* id `string` +* props [`KinesisStreamsToKinesisFirehoseToS3Props`](#pattern-construct-props) + +## Pattern Construct Props + +| **Name** | **Type** | **Description** | +|:-------------|:----------------|-----------------| +|kinesisFirehoseProps?|[`kinesisfirehose.CfnDeliveryStreamProps`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-kinesisfirehose.CfnDeliveryStreamProps.html)|Optional user provided props to override the default props for Kinesis Firehose Delivery Stream| +|existingBucketObj?|[`s3.IBucket`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-s3.IBucket.html)|Existing instance of S3 Bucket object, if this is set then the bucketProps is ignored.| +|bucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-s3.BucketProps.html)|User provided props to override the default props for the S3 Bucket.| +|kinesisStreamProps?|[`kinesis.StreamProps`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-kinesis.StreamProps.html)|Optional user-provided props to override the default props for the Kinesis stream.| +|existingStreamObj?|[`kinesis.Stream`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-kinesis.Stream.html)|Existing instance of Kinesis Stream, if this is set then kinesisStreamProps is ignored.| +|createCloudWatchAlarms?|`boolean`|Whether to create recommended CloudWatch alarms| + +## Pattern Properties + +| **Name** | **Type** | **Description** | +|:-------------|:----------------|-----------------| +|kinesisFirehose|[`kinesisfirehose.CfnDeliveryStream`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-kinesisfirehose.CfnDeliveryStream.html)|Returns an instance of kinesisfirehose.CfnDeliveryStream created by the construct| +|s3Bucket?|[`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-s3.Bucket.html)|Returns an instance of s3.Bucket created by the construct| +|s3LoggingBucket?|[`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-s3.Bucket.html)|Returns an instance of s3.Bucket created by the construct as the logging bucket for the primary bucket.| +|kinesisFirehoseRole|[`iam.Role`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-iam.Role.html)|Returns an instance of the iam.Role created by the construct for Kinesis Data Firehose delivery stream| +|kinesisFirehoseLogGroup|[`logs.LogGroup`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-logs.LogGroup.html)|Returns an instance of the LogGroup created by the construct for Kinesis Data Firehose delivery stream| +|kinesisStream|[`kinesis.Stream`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-kinesis.Stream.html)|Returns an instance of the Kinesis stream created by the pattern.| +|kinesisStreamRole|[`iam.Role`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-iam.Role.html)|Returns an instance of the iam.Role created by the construct for Kinesis stream.| +|cloudwatchAlarms?|[`cloudwatch.Alarm[]`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-cloudwatch.Alarm.html)|Returns a list of cloudwatch.Alarm created by the construct| + +## Default settings + +Out of the box implementation of the Construct without any override will set the following defaults: + +### Amazon Kinesis Stream +* Configure least privilege access IAM role for Kinesis Stream +* Enable server-side encryption for Kinesis Stream using AWS Managed KMS Key +* Deploy best practices CloudWatch Alarms for the Kinesis Stream + +### Amazon Kinesis Firehose +* Enable CloudWatch logging for Kinesis Firehose +* Configure least privilege access IAM role for Amazon Kinesis Firehose + +### Amazon S3 Bucket +* Configure Access logging for S3 Bucket +* Enable server-side encryption for S3 Bucket using AWS managed KMS Key +* Enforce encryption of data in transit +* Turn on the versioning for S3 Bucket +* Don't allow public access for S3 Bucket +* Retain the S3 Bucket when deleting the CloudFormation stack +* Applies Lifecycle rule to move noncurrent object versions to Glacier storage after 90 days + +## Architecture +![Architecture Diagram](architecture.png) + +*** +© Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/architecture.png b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..b57949e3772cf9b0f8cb7c8255ed46950e7eeb57 GIT binary patch literal 53569 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 eKU13ZVS5_mCeZ { + const stack = new cdk.Stack(); + deploy(stack); + expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot(); +}); + +test('test kinesisFirehose override ', () => { + const stack = new cdk.Stack(); + + new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-stream-firehose-s3', { + kinesisFirehoseProps: { + extendedS3DestinationConfiguration: { + bufferingHints: { + intervalInSeconds: 600, + sizeInMBs: 55 + }, + } + } + }); + + expect(stack).toHaveResourceLike("AWS::KinesisFirehose::DeliveryStream", { + ExtendedS3DestinationConfiguration: { + BufferingHints: { + IntervalInSeconds: 600, + SizeInMBs: 55 + } + }}); +}); + +test('test kinesisFirehose.deliveryStreamType override ', () => { + const stack = new cdk.Stack(); + + new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-stream-firehose-s3', { + kinesisFirehoseProps: { + deliveryStreamType: 'DirectPut' + } + }); + + expect(stack).toHaveResourceLike("AWS::KinesisFirehose::DeliveryStream", { + DeliveryStreamType: 'KinesisStreamAsSource' + }); +}); + +test('test kinesisFirehose.kinesisStreamSourceConfiguration override ', () => { + const stack = new cdk.Stack(); + + const kinesisStream = defaults.buildKinesisStream(stack, { + existingStreamObj: undefined, + kinesisStreamProps: undefined + }); + + new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-stream-firehose-s3', { + kinesisFirehoseProps: { + kinesisStreamSourceConfiguration: { + kinesisStreamArn: kinesisStream.streamArn, + roleArn: new Role(stack, 'myRole', { + assumedBy: new ServicePrincipal('firehose.amazonaws.com') + }).roleArn + } + } + }); + + expect(stack).toHaveResourceLike("AWS::KinesisFirehose::DeliveryStream", { + KinesisStreamSourceConfiguration: { + KinesisStreamARN: { + "Fn::GetAtt": [ + "teststreamfirehoses3KinesisStream3165E68E", + "Arn" + ] + }, + RoleARN: { + "Fn::GetAtt": [ + "KinesisStreamsRole2BFD39A5", + "Arn" + ] + } + } + }); +}); + +test('test kinesisStreamProps override ', () => { + const stack = new cdk.Stack(); + + new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-stream-firehose-s3', { + kinesisStreamProps: { + shardCount: 3 + } + }); + + expect(stack).toHaveResourceLike("AWS::Kinesis::Stream", { + ShardCount: 3 + }); +}); + +test('Test All properties', () => { + const stack = new cdk.Stack(); + + const construct: KinesisStreamsToKinesisFirehoseToS3 = deploy(stack); + + expect(construct.kinesisFirehose !== null); + expect(construct.s3Bucket !== null); + expect(construct.kinesisFirehoseRole !== null); + expect(construct.kinesisFirehoseLogGroup !== null); + expect(construct.s3LoggingBucket !== null); + expect(construct.kinesisStream !== null); + expect(construct.cloudwatchAlarms !== null); +}); + +test('Test properties with no CW Alarms', () => { + const stack = new Stack(); + const props: KinesisStreamsToKinesisFirehoseToS3Props = { + createCloudWatchAlarms: false + }; + const app = new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-stream-firehose-s3', props); + + expect(app.cloudwatchAlarms === null); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/README.md index 1c8861e8f..db8650954 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/README.md @@ -18,7 +18,7 @@ | **Language** | **Package** | |:-------------|-----------------| -|![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python|`aws_solutions_constructs.aws_kinesisstreams_lambda`| +|![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python|`aws_solutions_constructs.aws-kinesis-streams-lambda`| |![Typescript Logo](https://docs.aws.amazon.com/cdk/api/latest/img/typescript32.png) Typescript|`@aws-solutions-constructs/aws-kinesisstreams-lambda`| |![Java Logo](https://docs.aws.amazon.com/cdk/api/latest/img/java32.png) Java|`software.amazon.awsconstructs.services.kinesisstreamslambda`| diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json index 2f09543cf..b2c6a2815 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-kinesisstreams-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an Amazon Kinesis Data Stream and an AWS Lambda function.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,19 +53,19 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesis": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesis": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -75,15 +75,15 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kinesis": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kinesis": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0" + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json index 4f6fd39f1..a06af40e1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-dynamodb", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS Lambda to AWS DynamoDB integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,14 +53,14 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -70,10 +70,10 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json index 52cf42e44..f404411ec 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS Lambda to AWS Elasticsearch with Kibana integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-elasticsearch": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-elasticsearch": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-elasticsearch": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-elasticsearch": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json index b09bff3ca..32690b232 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-s3", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon S3 bucket.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,14 +53,14 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -70,10 +70,10 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json index 0a3bcbebe..ec0523a33 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-sns", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon SNS topic.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json index 5645c350e..c8b2214bc 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-sqs-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK construct that provisions (1) an AWS Lambda function that is configured to send messages to a queue; (2) an Amazon SQS queue; and (3) an AWS Lambda function configured to consume messages from the queue.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-sqs": "~1.67.0", - "@aws-solutions-constructs/aws-sqs-lambda": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-sqs": "~1.68.0", + "@aws-solutions-constructs/aws-sqs-lambda": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-sqs": "~1.67.0", - "@aws-solutions-constructs/aws-sqs-lambda": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-sqs": "~1.68.0", + "@aws-solutions-constructs/aws-sqs-lambda": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json index 150e4760f..ee790eb45 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-sqs", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon SQS queue.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,14 +53,14 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -70,10 +70,10 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-step-function/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-step-function/package.json index 086680958..d6d41d2d6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-step-function/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-step-function/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-step-function", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an AWS Step Function.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-stepfunctions": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-stepfunctions": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0", "eslint-plugin-import": "^2.22.0" @@ -73,12 +73,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-stepfunctions": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-stepfunctions": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json index 76549df91..35255414d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-s3-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS S3 to AWS Lambda integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-s3-notifications": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-s3-notifications": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-s3-notifications": "~1.67.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-s3-notifications": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-step-function/package.json b/source/patterns/@aws-solutions-constructs/aws-s3-step-function/package.json index cb0e09f9e..d3ccfd265 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-step-function/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-step-function/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-s3-step-function", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS S3 to AWS Step Function integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,22 +53,22 @@ } }, "dependencies": { - "@aws-cdk/aws-stepfunctions": "~1.67.0", - "@aws-cdk/aws-stepfunctions-tasks": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/aws-cloudtrail": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-events-rule-step-function": "~1.67.0", + "@aws-cdk/aws-stepfunctions": "~1.68.0", + "@aws-cdk/aws-stepfunctions-tasks": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-cloudtrail": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-events-rule-step-function": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -78,18 +78,18 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-stepfunctions": "~1.67.0", - "@aws-cdk/aws-stepfunctions-tasks": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/aws-cloudtrail": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-solutions-constructs/aws-events-rule-step-function": "~1.67.0", + "@aws-cdk/aws-stepfunctions": "~1.68.0", + "@aws-cdk/aws-stepfunctions-tasks": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-cloudtrail": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-events-rule-step-function": "~1.68.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.67.0" + "@aws-cdk/aws-logs": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json index c09cd9080..be71ffed9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-sns-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK Constructs for AWS SNS to AWS Lambda integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json index 0b535e846..00f7aed82 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-sns-sqs", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an Amazon SNS topic and an Amazon SQS queue.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-sns-subscriptions": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-sns-subscriptions": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-sns-subscriptions": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-sns-subscriptions": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json index 34abd64f2..b4a96b48a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-sqs-lambda", - "version": "1.67.0", + "version": "1.68.0", "description": "CDK constructs for defining an interaction between an Amazon SQS queue and an AWS Lambda function.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-defaults.ts index f5eb8bc08..220ebb523 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-defaults.ts @@ -12,6 +12,7 @@ */ import * as cloudfront from '@aws-cdk/aws-cloudfront'; +import * as origins from '@aws-cdk/aws-cloudfront-origins'; import * as s3 from '@aws-cdk/aws-s3'; import * as api from '@aws-cdk/aws-apigateway'; import * as lambda from '@aws-cdk/aws-lambda'; @@ -20,91 +21,72 @@ import * as cdk from '@aws-cdk/core'; export function DefaultCloudFrontWebDistributionForApiGatewayProps(apiEndPoint: api.RestApi, loggingBucket: s3.Bucket, setHttpSecurityHeaders: boolean, - edgeLambda?: lambda.Version): cloudfront.CloudFrontWebDistributionProps { + edgeLambda?: lambda.Version): cloudfront.DistributionProps { const apiEndPointUrlWithoutProtocol = cdk.Fn.select(1, cdk.Fn.split("://", apiEndPoint.url)); const apiEndPointDomainName = cdk.Fn.select(0, cdk.Fn.split("/", apiEndPointUrlWithoutProtocol)); if (setHttpSecurityHeaders) { return { - originConfigs: [{ - customOriginSource: { - domainName: apiEndPointDomainName - }, - behaviors: [{ - isDefaultBehavior: true, - lambdaFunctionAssociations: [ - { - eventType: cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE, - lambdaFunction: edgeLambda - } + defaultBehavior: { + origin: new origins.HttpOrigin(apiEndPointDomainName, { + originPath: `/${apiEndPoint.deploymentStage.stageName}` + }), + edgeLambdas: [ + { + eventType: cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE, + functionVersion: edgeLambda + } ], - }], - originPath: `/${apiEndPoint.deploymentStage.stageName}` - }], - loggingConfig: { - bucket: loggingBucket - } - } as cloudfront.CloudFrontWebDistributionProps; + viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS + }, + enableLogging: true, + logBucket: loggingBucket, + } as cloudfront.DistributionProps; } else { return { - originConfigs: [{ - customOriginSource: { - domainName: apiEndPointDomainName - }, - behaviors: [{ - isDefaultBehavior: true - }], - originPath: `/${apiEndPoint.deploymentStage.stageName}` - }], - loggingConfig: { - bucket: loggingBucket - } - } as cloudfront.CloudFrontWebDistributionProps; + defaultBehavior: { + origin: new origins.HttpOrigin(apiEndPointDomainName, { + originPath: `/${apiEndPoint.deploymentStage.stageName}` + }), + viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS + }, + enableLogging: true, + logBucket: loggingBucket, + } as cloudfront.DistributionProps; } } export function DefaultCloudFrontWebDistributionForS3Props(sourceBucket: s3.Bucket, loggingBucket: s3.Bucket, - _originAccessIdentity: cloudfront.IOriginAccessIdentity, setHttpSecurityHeaders: boolean, edgeLambda?: lambda.Version): - cloudfront.CloudFrontWebDistributionProps { + cloudfront.DistributionProps { if (setHttpSecurityHeaders) { return { - originConfigs: [{ - s3OriginSource: { - s3BucketSource: sourceBucket, - originAccessIdentity: _originAccessIdentity - }, - behaviors: [{ - isDefaultBehavior: true, - lambdaFunctionAssociations: [ - { - eventType: cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE, - lambdaFunction: edgeLambda - } - ] - }] - }], - loggingConfig: { - bucket: loggingBucket - } - } as cloudfront.CloudFrontWebDistributionProps; + defaultBehavior: { + origin: new origins.S3Origin(sourceBucket), + edgeLambdas: [ + { + eventType: cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE, + functionVersion: edgeLambda + } + ], + viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS + }, + enableLogging: true, + logBucket: loggingBucket, + defaultRootObject: 'index.html' + } as cloudfront.DistributionProps; } else { return { - originConfigs: [ { - s3OriginSource: { - s3BucketSource: sourceBucket, - originAccessIdentity: _originAccessIdentity - }, - behaviors: [ { - isDefaultBehavior: true, - } ] - } ], - loggingConfig: { - bucket: loggingBucket - } - } as cloudfront.CloudFrontWebDistributionProps; + defaultBehavior: { + origin: new origins.S3Origin(sourceBucket), + viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS + }, + enableLogging: true, + logBucket: loggingBucket, + defaultRootObject: 'index.html' + } as cloudfront.DistributionProps; } } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts index ee140e76a..1b05eb741 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts @@ -23,7 +23,7 @@ import { deployLambdaFunction } from './lambda-helper'; import { createLoggingBucket } from './s3-bucket-helper'; // Override Cfn_Nag rule: Cloudfront TLS-1.2 rule (https://github.com/stelligent/cfn_nag/issues/384) -function updateSecurityPolicy(cfDistribution: cloudfront.CloudFrontWebDistribution) { +function updateSecurityPolicy(cfDistribution: cloudfront.Distribution) { const cfnCfDistribution = cfDistribution.node.defaultChild as cloudfront.CfnDistribution; cfnCfDistribution.cfnOptions.metadata = { cfn_nag: { @@ -85,18 +85,27 @@ function defaultLambdaEdgeFunction(scope: cdk.Construct): lambda.Function { handler: 'index.handler' }, 'SetHttpSecurityHeaders'); + // Switching from cloudfront.CloudFrontWebDistribution -> cloudfront.Distribution breaks the Lamba@Edge as it does not automatically update + // the lambda role AssumePolicy for 'edgelambda.amazonaws.com' + if (edgeLambdaFunc.role && edgeLambdaFunc.role instanceof iam.Role && edgeLambdaFunc.role.assumeRolePolicy) { + edgeLambdaFunc.role.assumeRolePolicy.addStatements(new iam.PolicyStatement({ + actions: [ 'sts:AssumeRole' ], + principals: [ new iam.ServicePrincipal('edgelambda.amazonaws.com') ], + })); + } + return edgeLambdaFunc; } export function CloudFrontDistributionForApiGateway(scope: cdk.Construct, apiEndPoint: api.RestApi, - cloudFrontDistributionProps?: cloudfront.CloudFrontWebDistributionProps | any, - httpSecurityHeaders?: boolean): [cloudfront.CloudFrontWebDistribution, + cloudFrontDistributionProps?: cloudfront.DistributionProps | any, + httpSecurityHeaders?: boolean): [cloudfront.Distribution, lambda.Version?, s3.Bucket?] { const _httpSecurityHeaders = (httpSecurityHeaders !== undefined && httpSecurityHeaders === false) ? false : true; - let defaultprops: cloudfront.CloudFrontWebDistributionProps; + let defaultprops: cloudfront.DistributionProps; let edgeLambdaVersion; let loggingBucket; @@ -119,7 +128,7 @@ export function CloudFrontDistributionForApiGateway(scope: cdk.Construct, const cfprops = cloudFrontDistributionProps ? overrideProps(defaultprops, cloudFrontDistributionProps) : defaultprops; // Create the Cloudfront Distribution - const cfDistribution: cloudfront.CloudFrontWebDistribution = new cloudfront.CloudFrontWebDistribution(scope, 'CloudFrontDistribution', cfprops); + const cfDistribution: cloudfront.Distribution = new cloudfront.Distribution(scope, 'CloudFrontDistribution', cfprops); updateSecurityPolicy(cfDistribution); return [cfDistribution, edgeLambdaVersion, loggingBucket]; @@ -127,24 +136,11 @@ export function CloudFrontDistributionForApiGateway(scope: cdk.Construct, export function CloudFrontDistributionForS3(scope: cdk.Construct, sourceBucket: s3.Bucket, - cloudFrontDistributionProps?: cloudfront.CloudFrontWebDistributionProps | any, - httpSecurityHeaders?: boolean): [cloudfront.CloudFrontWebDistribution, + cloudFrontDistributionProps?: cloudfront.DistributionProps | any, + httpSecurityHeaders?: boolean): [cloudfront.Distribution, lambda.Version?, s3.Bucket?] { - // Create CloudFront Origin Access Identity User - const cfnOrigAccessId = new cloudfront.CfnCloudFrontOriginAccessIdentity(scope, 'CloudFrontOriginAccessIdentity', { - cloudFrontOriginAccessIdentityConfig: { - comment: 'Access S3 bucket content only through CloudFront' - } - }); - - const oaiImported = cloudfront.OriginAccessIdentity.fromOriginAccessIdentityName( - scope, - 'OAIImported', - cfnOrigAccessId.ref - ); - - let defaultprops: cloudfront.CloudFrontWebDistributionProps; + let defaultprops: cloudfront.DistributionProps; let edgeLambdaVersion; let loggingBucket; const _httpSecurityHeaders = (httpSecurityHeaders !== undefined && httpSecurityHeaders === false) ? false : true; @@ -157,27 +153,18 @@ export function CloudFrontDistributionForS3(scope: cdk.Construct, if (cloudFrontDistributionProps && cloudFrontDistributionProps.loggingConfig) { defaultprops = DefaultCloudFrontWebDistributionForS3Props(sourceBucket, - cloudFrontDistributionProps.loggingConfig.bucket, oaiImported, _httpSecurityHeaders, - edgeLambdaVersion); + cloudFrontDistributionProps.loggingConfig.bucket, _httpSecurityHeaders, edgeLambdaVersion); } else { loggingBucket = createLoggingBucket(scope, 'CloudfrontLoggingBucket'); defaultprops = DefaultCloudFrontWebDistributionForS3Props(sourceBucket, loggingBucket, - oaiImported, _httpSecurityHeaders, - edgeLambdaVersion); + _httpSecurityHeaders, edgeLambdaVersion); } const cfprops = cloudFrontDistributionProps ? overrideProps(defaultprops, cloudFrontDistributionProps) : defaultprops; // Create the Cloudfront Distribution - const cfDistribution: cloudfront.CloudFrontWebDistribution = new cloudfront.CloudFrontWebDistribution(scope, 'CloudFrontDistribution', cfprops); + const cfDistribution: cloudfront.Distribution = new cloudfront.Distribution(scope, 'CloudFrontDistribution', cfprops); updateSecurityPolicy(cfDistribution); - // Add S3 Bucket Policy to allow s3:GetObject for CloudFront Origin Access Identity User - sourceBucket.addToResourcePolicy(new iam.PolicyStatement({ - actions: ['s3:GetObject'], - resources: [sourceBucket.arnForObjects('*')], - principals: [new iam.CanonicalUserPrincipal(cfnOrigAccessId.attrS3CanonicalUserId)] - })); - // Extract the CfnBucketPolicy from the sourceBucket const bucketPolicy = sourceBucket.policy as s3.BucketPolicy; const sourceBucketPolicy = bucketPolicy.node.findChild('Resource') as s3.CfnBucketPolicy; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/kinesis-firehose-s3-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/kinesis-firehose-s3-defaults.ts index 8e5410900..259f74612 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/kinesis-firehose-s3-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/kinesis-firehose-s3-defaults.ts @@ -12,9 +12,11 @@ */ import { CfnDeliveryStreamProps } from '@aws-cdk/aws-kinesisfirehose'; +import { IKey } from '@aws-cdk/aws-kms'; export function DefaultCfnDeliveryStreamProps(_bucketArn: string, _roleArn: string, - _logGroupName: string, _logStreamName: string): CfnDeliveryStreamProps { + _logGroupName: string, _logStreamName: string, _kms: IKey): CfnDeliveryStreamProps { + return { extendedS3DestinationConfiguration : { bucketArn: _bucketArn, @@ -28,6 +30,11 @@ export function DefaultCfnDeliveryStreamProps(_bucketArn: string, _roleArn: stri enabled: true, logGroupName: _logGroupName, logStreamName: _logStreamName + }, + encryptionConfiguration: { + kmsEncryptionConfig: { + awskmsKeyArn: _kms.keyArn + } } } } as CfnDeliveryStreamProps; diff --git a/source/patterns/@aws-solutions-constructs/core/package.json b/source/patterns/@aws-solutions-constructs/core/package.json index 87a082eab..94d101e98 100644 --- a/source/patterns/@aws-solutions-constructs/core/package.json +++ b/source/patterns/@aws-solutions-constructs/core/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/core", - "version": "1.67.0", + "version": "1.68.0", "description": "Core CDK Construct for patterns library", "main": "index.js", "types": "index.ts", @@ -52,28 +52,29 @@ } }, "dependencies": { - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-cloudfront-origins": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/aws-iot": "~1.67.0", - "@aws-cdk/aws-kinesis": "~1.67.0", - "@aws-cdk/aws-kinesisanalytics": "~1.67.0", - "@aws-cdk/aws-kinesisfirehose": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-elasticsearch": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/aws-stepfunctions": "~1.67.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-cloudfront-origins": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/aws-iot": "~1.68.0", + "@aws-cdk/aws-kinesis": "~1.68.0", + "@aws-cdk/aws-kinesisanalytics": "~1.68.0", + "@aws-cdk/aws-kinesisfirehose": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-elasticsearch": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-stepfunctions": "~1.68.0", + "@aws-cdk/aws-certificatemanager": "~1.68.0", "@types/deep-diff": "^1.0.0", "@types/npmlog": "^4.1.2", "deep-diff": "^1.0.2", @@ -81,7 +82,7 @@ "npmlog": "^4.1.2" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -98,27 +99,28 @@ "@types/deep-diff" ], "peerDependencies": { - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-cdk/aws-iot": "~1.67.0", - "@aws-cdk/aws-kinesis": "~1.67.0", - "@aws-cdk/aws-kinesisanalytics": "~1.67.0", - "@aws-cdk/aws-kinesisfirehose": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-lambda-event-sources": "~1.67.0", - "@aws-cdk/aws-logs": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/aws-sns": "~1.67.0", - "@aws-cdk/aws-sqs": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-kms": "~1.67.0", - "@aws-cdk/aws-events": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-elasticsearch": "~1.67.0", - "@aws-cdk/aws-cloudwatch": "~1.67.0", - "@aws-cdk/aws-stepfunctions": "~1.67.0", - "@aws-cdk/aws-cloudfront-origins": "~1.67.0" + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-cdk/aws-iot": "~1.68.0", + "@aws-cdk/aws-kinesis": "~1.68.0", + "@aws-cdk/aws-kinesisanalytics": "~1.68.0", + "@aws-cdk/aws-kinesisfirehose": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/aws-sns": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/aws-events": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-elasticsearch": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-stepfunctions": "~1.68.0", + "@aws-cdk/aws-cloudfront-origins": "~1.68.0", + "@aws-cdk/aws-certificatemanager": "~1.68.0" } } diff --git a/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/cloudfront-distribution-api-gateway-helper.test.js.snap b/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/cloudfront-distribution-api-gateway-helper.test.js.snap index 077097722..87e22b146 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/cloudfront-distribution-api-gateway-helper.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/cloudfront-distribution-api-gateway-helper.test.js.snap @@ -45,7 +45,7 @@ Object { }, }, "Resources": Object { - "CloudFrontDistributionCFDistribution599ADCC4": Object { + "CloudFrontDistributionBA64CE3A": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ @@ -59,21 +59,8 @@ Object { "Properties": Object { "DistributionConfig": Object { "DefaultCacheBehavior": Object { - "AllowedMethods": Array [ - "GET", - "HEAD", - ], - "CachedMethods": Array [ - "GET", - "HEAD", - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": Object { - "Cookies": Object { - "Forward": "none", - }, - "QueryString": false, - }, "LambdaFunctionAssociations": Array [ Object { "EventType": "origin-response", @@ -82,10 +69,9 @@ Object { }, }, ], - "TargetOriginId": "origin1", + "TargetOriginId": "CloudFrontDistributionOrigin176EC3A12", "ViewerProtocolPolicy": "redirect-to-https", }, - "DefaultRootObject": "index.html", "Enabled": true, "HttpVersion": "http2", "IPV6Enabled": true, @@ -96,21 +82,11 @@ Object { "DomainName", ], }, - "IncludeCookies": false, }, "Origins": Array [ Object { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "CustomOriginConfig": Object { - "HTTPPort": 80, - "HTTPSPort": 443, - "OriginKeepaliveTimeout": 5, "OriginProtocolPolicy": "https-only", - "OriginReadTimeout": 30, - "OriginSSLProtocols": Array [ - "TLSv1.2", - ], }, "DomainName": Object { "Fn::Select": Array [ @@ -156,7 +132,7 @@ Object { }, ], }, - "Id": "origin1", + "Id": "CloudFrontDistributionOrigin176EC3A12", "OriginPath": Object { "Fn::Join": Array [ "", @@ -170,10 +146,6 @@ Object { }, }, ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": Object { - "CloudFrontDefaultCertificate": true, - }, }, }, "Type": "AWS::CloudFront::Distribution", @@ -805,3 +777,636 @@ Object { }, } `; + +exports[`cloudfront distribution for ApiGateway without security headers 1`] = ` +Object { + "Outputs": Object { + "RestApiEndpoint0551178A": Object { + "Value": Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "RestApi0C43BF4B", + }, + ".execute-api.", + Object { + "Ref": "AWS::Region", + }, + ".", + Object { + "Ref": "AWS::URLSuffix", + }, + "/", + Object { + "Ref": "RestApiDeploymentStageprod3855DE66", + }, + "/", + ], + ], + }, + }, + }, + "Parameters": Object { + "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cArtifactHash00A70A91": Object { + "Description": "Artifact hash for asset \\"42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c\\"", + "Type": "String", + }, + "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3Bucket1F467BCC": Object { + "Description": "S3 bucket for asset \\"42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c\\"", + "Type": "String", + }, + "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3VersionKey9E4F7872": Object { + "Description": "S3 key for asset version \\"42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c\\"", + "Type": "String", + }, + }, + "Resources": Object { + "CloudFrontDistributionBA64CE3A": Object { + "Metadata": Object { + "cfn_nag": Object { + "rules_to_suppress": Array [ + Object { + "id": "W70", + "reason": "Since the distribution uses the CloudFront domain name, CloudFront automatically sets the security policy to TLSv1 regardless of the value of MinimumProtocolVersion", + }, + ], + }, + }, + "Properties": Object { + "DistributionConfig": Object { + "DefaultCacheBehavior": Object { + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", + "Compress": true, + "TargetOriginId": "CloudFrontDistributionOrigin176EC3A12", + "ViewerProtocolPolicy": "redirect-to-https", + }, + "Enabled": true, + "HttpVersion": "http2", + "IPV6Enabled": true, + "Logging": Object { + "Bucket": Object { + "Fn::GetAtt": Array [ + "CloudfrontLoggingBucket3C3EFAA7", + "DomainName", + ], + }, + }, + "Origins": Array [ + Object { + "CustomOriginConfig": Object { + "OriginProtocolPolicy": "https-only", + }, + "DomainName": Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "/", + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "://", + Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "RestApi0C43BF4B", + }, + ".execute-api.", + Object { + "Ref": "AWS::Region", + }, + ".", + Object { + "Ref": "AWS::URLSuffix", + }, + "/", + Object { + "Ref": "RestApiDeploymentStageprod3855DE66", + }, + "/", + ], + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + "Id": "CloudFrontDistributionOrigin176EC3A12", + "OriginPath": Object { + "Fn::Join": Array [ + "", + Array [ + "/", + Object { + "Ref": "RestApiDeploymentStageprod3855DE66", + }, + ], + ], + }, + }, + ], + }, + }, + "Type": "AWS::CloudFront::Distribution", + }, + "CloudfrontLoggingBucket3C3EFAA7": Object { + "DeletionPolicy": "Retain", + "Metadata": Object { + "cfn_nag": Object { + "rules_to_suppress": Array [ + Object { + "id": "W35", + "reason": "This S3 bucket is used as the access logging bucket for CloudFront Distribution", + }, + ], + }, + }, + "Properties": Object { + "AccessControl": "LogDeliveryWrite", + "BucketEncryption": Object { + "ServerSideEncryptionConfiguration": Array [ + Object { + "ServerSideEncryptionByDefault": Object { + "SSEAlgorithm": "AES256", + }, + }, + ], + }, + "PublicAccessBlockConfiguration": Object { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true, + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Retain", + }, + "CloudfrontLoggingBucketPolicy8FC0956D": Object { + "Properties": Object { + "Bucket": Object { + "Ref": "CloudfrontLoggingBucket3C3EFAA7", + }, + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "*", + "Condition": Object { + "Bool": Object { + "aws:SecureTransport": "false", + }, + }, + "Effect": "Deny", + "Principal": "*", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "CloudfrontLoggingBucket3C3EFAA7", + "Arn", + ], + }, + "/*", + ], + ], + }, + "Sid": "HttpsOnly", + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::S3::BucketPolicy", + }, + "LambdaFunctionBF21E41F": Object { + "DependsOn": Array [ + "LambdaFunctionServiceRoleC555A460", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3Bucket1F467BCC", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3VersionKey9E4F7872", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198cS3VersionKey9E4F7872", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Handler": "index.handler", + "Role": Object { + "Fn::GetAtt": Array [ + "LambdaFunctionServiceRoleC555A460", + "Arn", + ], + }, + "Runtime": "nodejs12.x", + }, + "Type": "AWS::Lambda::Function", + }, + "LambdaFunctionServiceRoleC555A460": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "RestApi0C43BF4B": Object { + "Properties": Object { + "Name": "RestApi", + }, + "Type": "AWS::ApiGateway::RestApi", + }, + "RestApiANYA7C1DC94": Object { + "Properties": Object { + "AuthorizationType": "NONE", + "HttpMethod": "ANY", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:", + Object { + "Ref": "AWS::Region", + }, + ":lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "LambdaFunctionBF21E41F", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "ResourceId": Object { + "Fn::GetAtt": Array [ + "RestApi0C43BF4B", + "RootResourceId", + ], + }, + "RestApiId": Object { + "Ref": "RestApi0C43BF4B", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "RestApiANYApiPermissionRestApiANY3A99B4EE": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "LambdaFunctionBF21E41F", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":", + Object { + "Ref": "RestApi0C43BF4B", + }, + "/", + Object { + "Ref": "RestApiDeploymentStageprod3855DE66", + }, + "/*/", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "RestApiANYApiPermissionTestRestApiANY79BD91F2": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "LambdaFunctionBF21E41F", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":", + Object { + "Ref": "RestApi0C43BF4B", + }, + "/test-invoke-stage/*/", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "RestApiAccount7C83CF5A": Object { + "DependsOn": Array [ + "RestApi0C43BF4B", + ], + "Properties": Object { + "CloudWatchRoleArn": Object { + "Fn::GetAtt": Array [ + "RestApiCloudWatchRoleE3ED6605", + "Arn", + ], + }, + }, + "Type": "AWS::ApiGateway::Account", + }, + "RestApiCloudWatchRoleE3ED6605": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "apigateway.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "RestApiDeployment180EC5037625dd9448e05124ef5f1cc2b6c3180a": Object { + "DependsOn": Array [ + "RestApiproxyANY1786B242", + "RestApiproxyC95856DD", + "RestApiANYA7C1DC94", + ], + "Properties": Object { + "Description": "Automatically created by the RestApi construct", + "RestApiId": Object { + "Ref": "RestApi0C43BF4B", + }, + }, + "Type": "AWS::ApiGateway::Deployment", + }, + "RestApiDeploymentStageprod3855DE66": Object { + "Properties": Object { + "DeploymentId": Object { + "Ref": "RestApiDeployment180EC5037625dd9448e05124ef5f1cc2b6c3180a", + }, + "RestApiId": Object { + "Ref": "RestApi0C43BF4B", + }, + "StageName": "prod", + }, + "Type": "AWS::ApiGateway::Stage", + }, + "RestApiproxyANY1786B242": Object { + "Properties": Object { + "AuthorizationType": "NONE", + "HttpMethod": "ANY", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:", + Object { + "Ref": "AWS::Region", + }, + ":lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "LambdaFunctionBF21E41F", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "ResourceId": Object { + "Ref": "RestApiproxyC95856DD", + }, + "RestApiId": Object { + "Ref": "RestApi0C43BF4B", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "RestApiproxyANYApiPermissionRestApiANYproxy9C9912F9": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "LambdaFunctionBF21E41F", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":", + Object { + "Ref": "RestApi0C43BF4B", + }, + "/", + Object { + "Ref": "RestApiDeploymentStageprod3855DE66", + }, + "/*/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "RestApiproxyANYApiPermissionTestRestApiANYproxyCB7BC56D": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "LambdaFunctionBF21E41F", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":", + Object { + "Ref": "RestApi0C43BF4B", + }, + "/test-invoke-stage/*/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "RestApiproxyC95856DD": Object { + "Properties": Object { + "ParentId": Object { + "Fn::GetAtt": Array [ + "RestApi0C43BF4B", + "RootResourceId", + ], + }, + "PathPart": "{proxy+}", + "RestApiId": Object { + "Ref": "RestApi0C43BF4B", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + }, +} +`; diff --git a/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/cloudfront-distribution-s3-helper.test.js.snap b/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/cloudfront-distribution-s3-helper.test.js.snap index 7768e6ecf..0afa8d577 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/cloudfront-distribution-s3-helper.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/cloudfront-distribution-s3-helper.test.js.snap @@ -3,7 +3,7 @@ exports[`cloudfront distribution with default params 1`] = ` Object { "Resources": Object { - "CloudFrontDistributionCFDistribution599ADCC4": Object { + "CloudFrontDistributionBA64CE3A": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ @@ -17,21 +17,8 @@ Object { "Properties": Object { "DistributionConfig": Object { "DefaultCacheBehavior": Object { - "AllowedMethods": Array [ - "GET", - "HEAD", - ], - "CachedMethods": Array [ - "GET", - "HEAD", - ], + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "ForwardedValues": Object { - "Cookies": Object { - "Forward": "none", - }, - "QueryString": false, - }, "LambdaFunctionAssociations": Array [ Object { "EventType": "origin-response", @@ -40,7 +27,7 @@ Object { }, }, ], - "TargetOriginId": "origin1", + "TargetOriginId": "CloudFrontDistributionOrigin176EC3A12", "ViewerProtocolPolicy": "redirect-to-https", }, "DefaultRootObject": "index.html", @@ -54,19 +41,16 @@ Object { "DomainName", ], }, - "IncludeCookies": false, }, "Origins": Array [ Object { - "ConnectionAttempts": 3, - "ConnectionTimeout": 10, "DomainName": Object { "Fn::GetAtt": Array [ "S3Bucket07682993", "RegionalDomainName", ], }, - "Id": "origin1", + "Id": "CloudFrontDistributionOrigin176EC3A12", "S3OriginConfig": Object { "OriginAccessIdentity": Object { "Fn::Join": Array [ @@ -74,7 +58,7 @@ Object { Array [ "origin-access-identity/cloudfront/", Object { - "Ref": "CloudFrontOriginAccessIdentity", + "Ref": "CloudFrontDistributionOrigin1S3Origin3D9CA0E9", }, ], ], @@ -82,18 +66,14 @@ Object { }, }, ], - "PriceClass": "PriceClass_100", - "ViewerCertificate": Object { - "CloudFrontDefaultCertificate": true, - }, }, }, "Type": "AWS::CloudFront::Distribution", }, - "CloudFrontOriginAccessIdentity": Object { + "CloudFrontDistributionOrigin1S3Origin3D9CA0E9": Object { "Properties": Object { "CloudFrontOriginAccessIdentityConfig": Object { - "Comment": "Access S3 bucket content only through CloudFront", + "Comment": "Identity for CloudFrontDistributionOrigin176EC3A12", }, }, "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", @@ -262,19 +242,10 @@ Object { ], "Effect": "Allow", "Principal": Object { - "AWS": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::cloudfront:user/CloudFront Origin Access Identity ", - Object { - "Ref": "CloudFrontOriginAccessIdentity", - }, - ], + "CanonicalUser": Object { + "Fn::GetAtt": Array [ + "CloudFrontDistributionOrigin1S3Origin3D9CA0E9", + "S3CanonicalUserId", ], }, }, @@ -301,32 +272,6 @@ Object { }, ], }, - Object { - "Action": "s3:GetObject", - "Effect": "Allow", - "Principal": Object { - "CanonicalUser": Object { - "Fn::GetAtt": Array [ - "CloudFrontOriginAccessIdentity", - "S3CanonicalUserId", - ], - }, - }, - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "S3Bucket07682993", - "Arn", - ], - }, - "/*", - ], - ], - }, - }, ], "Version": "2012-10-17", }, diff --git a/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/kinesis-firehose-s3-defaults.test.js.snap b/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/kinesis-firehose-s3-defaults.test.js.snap index bc3b0eeab..c6b9fe0bc 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/kinesis-firehose-s3-defaults.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/core/test/__snapshots__/kinesis-firehose-s3-defaults.test.js.snap @@ -17,6 +17,30 @@ Object { "LogStreamName": "log_stream", }, "CompressionFormat": "GZIP", + "EncryptionConfiguration": Object { + "KMSEncryptionConfig": Object { + "AWSKMSKeyARN": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":kms:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":alias/aws/s3", + ], + ], + }, + }, + }, "RoleARN": "role_arn", }, }, diff --git a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-api-gateway-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-api-gateway-helper.test.ts index 2d976ace5..4c2e087d8 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-api-gateway-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-api-gateway-helper.test.ts @@ -20,7 +20,7 @@ import * as defaults from '../index'; import * as s3 from '@aws-cdk/aws-s3'; import { CloudFrontDistributionForApiGateway } from '../lib/cloudfront-distribution-helper'; import '@aws-cdk/assert/jest'; -import { OriginProtocolPolicy } from '@aws-cdk/aws-cloudfront'; +import * as origins from '@aws-cdk/aws-cloudfront-origins'; test('cloudfront distribution for ApiGateway with default params', () => { const stack = new Stack(); @@ -39,6 +39,23 @@ test('cloudfront distribution for ApiGateway with default params', () => { expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot(); }); +test('cloudfront distribution for ApiGateway without security headers', () => { + const stack = new Stack(); + + const lambdaFunctionProps: lambda.FunctionProps = { + runtime: lambda.Runtime.NODEJS_12_X, + handler: 'index.handler', + code: lambda.Code.asset(`${__dirname}/lambda`) + }; + + const func = new lambda.Function(stack, 'LambdaFunction', lambdaFunctionProps); + const _api = new api.LambdaRestApi(stack, 'RestApi', { + handler: func + }); + CloudFrontDistributionForApiGateway(stack, _api, {}, false); + expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot(); +}); + test('test cloudfront for Api Gateway with user provided logging bucket', () => { const stack = new Stack(); @@ -66,25 +83,19 @@ test('test cloudfront for Api Gateway with user provided logging bucket', () => expect(stack).toHaveResourceLike("AWS::CloudFront::Distribution", { DistributionConfig: { DefaultCacheBehavior: { - AllowedMethods: [ - "GET", - "HEAD" - ], - CachedMethods: [ - "GET", - "HEAD" - ], + CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6", Compress: true, - ForwardedValues: { - Cookies: { - Forward: "none" - }, - QueryString: false - }, - TargetOriginId: "origin1", + LambdaFunctionAssociations: [ + { + EventType: "origin-response", + LambdaFunctionARN: { + Ref: "SetHttpSecurityHeadersVersion660E2F72" + } + } + ], + TargetOriginId: "CloudFrontDistributionOrigin176EC3A12", ViewerProtocolPolicy: "redirect-to-https" }, - DefaultRootObject: "index.html", Enabled: true, HttpVersion: "http2", IPV6Enabled: true, @@ -94,20 +105,12 @@ test('test cloudfront for Api Gateway with user provided logging bucket', () => "MyCloudfrontLoggingBucket9AA652E8", "DomainName" ] - }, - IncludeCookies: false + } }, Origins: [ { CustomOriginConfig: { - HTTPPort: 80, - HTTPSPort: 443, - OriginKeepaliveTimeout: 5, - OriginProtocolPolicy: "https-only", - OriginReadTimeout: 30, - OriginSSLProtocols: [ - "TLSv1.2" - ] + OriginProtocolPolicy: "https-only" }, DomainName: { "Fn::Select": [ @@ -153,13 +156,20 @@ test('test cloudfront for Api Gateway with user provided logging bucket', () => } ] }, - Id: "origin1" + Id: "CloudFrontDistributionOrigin176EC3A12", + OriginPath: { + "Fn::Join": [ + "", + [ + "/", + { + Ref: "RestApi1DeploymentStageprod4FFC9BB4" + } + ] + ] + } } - ], - PriceClass: "PriceClass_100", - ViewerCertificate: { - CloudFrontDefaultCertificate: true - } + ] } }); }); @@ -179,106 +189,92 @@ test('test cloudfront for Api Gateway override properties', () => { handler: func }); - const props: cloudfront.CloudFrontWebDistributionProps = { - originConfigs: [ { - customOriginSource: { - domainName: _api.url, - originProtocolPolicy: OriginProtocolPolicy.HTTP_ONLY - }, - behaviors: [ { - isDefaultBehavior: true, - allowedMethods: cloudfront.CloudFrontAllowedMethods.ALL, - cachedMethods: cloudfront.CloudFrontAllowedCachedMethods.GET_HEAD_OPTIONS - } ] - } ] + const props: cloudfront.DistributionProps = { + defaultBehavior: { + origin: new origins.HttpOrigin(_api.url, { + protocolPolicy: cloudfront.OriginProtocolPolicy.HTTP_ONLY + }), + allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL, + cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS + }, }; CloudFrontDistributionForApiGateway(stack, _api, props); expect(stack).toHaveResourceLike("AWS::CloudFront::Distribution", { DistributionConfig: { - DefaultCacheBehavior: { - AllowedMethods: [ - "DELETE", - "GET", - "HEAD", - "OPTIONS", - "PATCH", - "POST", - "PUT" - ], - CachedMethods: [ - "GET", - "HEAD", - "OPTIONS" - ], - Compress: true, - ForwardedValues: { - Cookies: { - Forward: "none" - }, - QueryString: false - }, - TargetOriginId: "origin1", - ViewerProtocolPolicy: "redirect-to-https" - }, - DefaultRootObject: "index.html", - Enabled: true, - HttpVersion: "http2", - IPV6Enabled: true, - Logging: { - Bucket: { - "Fn::GetAtt": [ - "CloudfrontLoggingBucket3C3EFAA7", - "DomainName" - ] - }, - IncludeCookies: false - }, - Origins: [ + DefaultCacheBehavior: { + AllowedMethods: [ + "GET", + "HEAD", + "OPTIONS", + "PUT", + "PATCH", + "POST", + "DELETE" + ], + CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6", + CachedMethods: [ + "GET", + "HEAD", + "OPTIONS" + ], + Compress: true, + LambdaFunctionAssociations: [ { - CustomOriginConfig: { - HTTPPort: 80, - HTTPSPort: 443, - OriginKeepaliveTimeout: 5, - OriginProtocolPolicy: "http-only", - OriginReadTimeout: 30, - OriginSSLProtocols: [ - "TLSv1.2" - ] - }, - DomainName: { - "Fn::Join": [ - "", - [ - "https://", - { - Ref: "RestApi1480AC499" - }, - ".execute-api.", - { - Ref: "AWS::Region" - }, - ".", - { - Ref: "AWS::URLSuffix" - }, - "/", - { - Ref: "RestApi1DeploymentStageprod4FFC9BB4" - }, - "/" - ] - ] - }, - Id: "origin1" + EventType: "origin-response", + LambdaFunctionARN: { + Ref: "SetHttpSecurityHeadersVersion660E2F72" + } } ], - PriceClass: "PriceClass_100", - ViewerCertificate: { - CloudFrontDefaultCertificate: true + TargetOriginId: "CloudFrontDistributionOrigin176EC3A12", + ViewerProtocolPolicy: "redirect-to-https" + }, + Enabled: true, + HttpVersion: "http2", + IPV6Enabled: true, + Logging: { + Bucket: { + "Fn::GetAtt": [ + "CloudfrontLoggingBucket3C3EFAA7", + "DomainName" + ] } - } + }, + Origins: [ + { + CustomOriginConfig: { + OriginProtocolPolicy: "http-only" + }, + DomainName: { + "Fn::Join": [ + "", + [ + "https://", + { + Ref: "RestApi1480AC499" + }, + ".execute-api.", + { + Ref: "AWS::Region" + }, + ".", + { + Ref: "AWS::URLSuffix" + }, + "/", + { + Ref: "RestApi1DeploymentStageprod4FFC9BB4" + }, + "/" + ] + ] + }, + Id: "CloudFrontDistributionOrigin176EC3A12" + } + ] + } }); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts index eeb28ef61..878b2481f 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts @@ -18,6 +18,8 @@ import { CloudFrontDistributionForS3 } from '../lib/cloudfront-distribution-help import { buildS3Bucket } from '../lib/s3-bucket-helper'; import '@aws-cdk/assert/jest'; import { Bucket } from '@aws-cdk/aws-s3'; +import * as origins from '@aws-cdk/aws-cloudfront-origins'; +import * as acm from '@aws-cdk/aws-certificatemanager'; test('cloudfront distribution with default params', () => { const stack = new Stack(); @@ -102,19 +104,10 @@ test('test cloudfront check bucket policy', () => { ], Effect: "Allow", Principal: { - AWS: { - "Fn::Join": [ - "", - [ - "arn:", - { - Ref: "AWS::Partition" - }, - ":iam::cloudfront:user/CloudFront Origin Access Identity ", - { - Ref: "CloudFrontOriginAccessIdentity" - } - ] + CanonicalUser: { + "Fn::GetAtt": [ + "CloudFrontDistributionOrigin1S3Origin3D9CA0E9", + "S3CanonicalUserId" ] } }, @@ -140,32 +133,6 @@ test('test cloudfront check bucket policy', () => { ] } ] - }, - { - Action: "s3:GetObject", - Effect: "Allow", - Principal: { - CanonicalUser: { - "Fn::GetAtt": [ - "CloudFrontOriginAccessIdentity", - "S3CanonicalUserId" - ] - } - }, - Resource: { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "S3Bucket07682993", - "Arn" - ] - }, - "/*" - ] - ] - } } ], Version: "2012-10-17" @@ -182,22 +149,9 @@ test('test cloudfront with no security headers ', () => { expect(stack).toHaveResourceLike("AWS::CloudFront::Distribution", { DistributionConfig: { DefaultCacheBehavior: { - AllowedMethods: [ - "GET", - "HEAD" - ], - CachedMethods: [ - "GET", - "HEAD" - ], + CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6", Compress: true, - ForwardedValues: { - Cookies: { - Forward: "none" - }, - QueryString: false - }, - TargetOriginId: "origin1", + TargetOriginId: "CloudFrontDistributionOrigin176EC3A12", ViewerProtocolPolicy: "redirect-to-https" }, DefaultRootObject: "index.html", @@ -210,8 +164,7 @@ test('test cloudfront with no security headers ', () => { "CloudfrontLoggingBucket3C3EFAA7", "DomainName" ] - }, - IncludeCookies: false + } }, Origins: [ { @@ -221,26 +174,22 @@ test('test cloudfront with no security headers ', () => { "RegionalDomainName" ] }, - Id: "origin1", + Id: "CloudFrontDistributionOrigin176EC3A12", S3OriginConfig: { - OriginAccessIdentity: { - "Fn::Join": [ - "", - [ - "origin-access-identity/cloudfront/", - { - Ref: "CloudFrontOriginAccessIdentity" - } - ] + OriginAccessIdentity: { + "Fn::Join": [ + "", + [ + "origin-access-identity/cloudfront/", + { + Ref: "CloudFrontDistributionOrigin1S3Origin3D9CA0E9" + } ] - } + ] + } } } - ], - PriceClass: "PriceClass_100", - ViewerCertificate: { - CloudFrontDefaultCertificate: true - } + ] } }); }); @@ -248,91 +197,76 @@ test('test cloudfront with no security headers ', () => { test('test cloudfront override cloudfront custom domain names ', () => { const stack = new Stack(); const [sourceBucket] = buildS3Bucket(stack, {}); + const certificate = acm.Certificate.fromCertificateArn(stack, 'Cert', 'arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012'); const myprops = { - aliasConfiguration: { - acmCertRef: '/acm/mycertificate', - names: ['mydomains'] - } + domainNames: ['mydomains'], + certificate }; CloudFrontDistributionForS3(stack, sourceBucket, myprops); expect(stack).toHaveResourceLike("AWS::CloudFront::Distribution", { DistributionConfig: { - Aliases: [ - "mydomains" - ], - DefaultCacheBehavior: { - AllowedMethods: [ - "GET", - "HEAD" - ], - CachedMethods: [ - "GET", - "HEAD" - ], - Compress: true, - ForwardedValues: { - Cookies: { - Forward: "none" - }, - QueryString: false - }, - LambdaFunctionAssociations: [ - { - EventType: "origin-response", - LambdaFunctionARN: { - Ref: "SetHttpSecurityHeadersVersion660E2F72" - } + Aliases: [ + "mydomains" + ], + DefaultCacheBehavior: { + CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6", + Compress: true, + LambdaFunctionAssociations: [ + { + EventType: "origin-response", + LambdaFunctionARN: { + Ref: "SetHttpSecurityHeadersVersion660E2F72" } - ], - TargetOriginId: "origin1", - ViewerProtocolPolicy: "redirect-to-https" - }, - DefaultRootObject: "index.html", - Enabled: true, - HttpVersion: "http2", - IPV6Enabled: true, - Logging: { - Bucket: { + } + ], + TargetOriginId: "CloudFrontDistributionOrigin176EC3A12", + ViewerProtocolPolicy: "redirect-to-https" + }, + DefaultRootObject: "index.html", + Enabled: true, + HttpVersion: "http2", + IPV6Enabled: true, + Logging: { + Bucket: { + "Fn::GetAtt": [ + "CloudfrontLoggingBucket3C3EFAA7", + "DomainName" + ] + } + }, + Origins: [ + { + DomainName: { "Fn::GetAtt": [ - "CloudfrontLoggingBucket3C3EFAA7", - "DomainName" + "S3Bucket07682993", + "RegionalDomainName" ] }, - IncludeCookies: false - }, - Origins: [ - { - DomainName: { - "Fn::GetAtt": [ - "S3Bucket07682993", - "RegionalDomainName" + Id: "CloudFrontDistributionOrigin176EC3A12", + S3OriginConfig: { + OriginAccessIdentity: { + "Fn::Join": [ + "", + [ + "origin-access-identity/cloudfront/", + { + Ref: "CloudFrontDistributionOrigin1S3Origin3D9CA0E9" + } + ] ] - }, - Id: "origin1", - S3OriginConfig: { - OriginAccessIdentity: { - "Fn::Join": [ - "", - [ - "origin-access-identity/cloudfront/", - { - Ref: "CloudFrontOriginAccessIdentity" - } - ] - ] - } } } - ], - PriceClass: "PriceClass_100", - ViewerCertificate: { - AcmCertificateArn: "/acm/mycertificate", - SslSupportMethod: "sni-only" } + ], + ViewerCertificate: { + AcmCertificateArn: "arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012", + MinimumProtocolVersion: "TLSv1.2_2019", + SslSupportMethod: "sni-only" } + } }); }); @@ -352,22 +286,93 @@ test('test cloudfront override cloudfront logging bucket ', () => { expect(stack).toHaveResourceLike("AWS::CloudFront::Distribution", { DistributionConfig: { + DefaultCacheBehavior: { + CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6", + Compress: true, + LambdaFunctionAssociations: [ + { + EventType: "origin-response", + LambdaFunctionARN: { + Ref: "SetHttpSecurityHeadersVersion660E2F72" + } + } + ], + TargetOriginId: "CloudFrontDistributionOrigin176EC3A12", + ViewerProtocolPolicy: "redirect-to-https" + }, + DefaultRootObject: "index.html", + Enabled: true, + HttpVersion: "http2", + IPV6Enabled: true, + Logging: { + Bucket: { + "Fn::GetAtt": [ + "loggingbucket6D73BD53", + "DomainName" + ] + } + }, + Origins: [ + { + DomainName: { + "Fn::GetAtt": [ + "S3Bucket07682993", + "RegionalDomainName" + ] + }, + Id: "CloudFrontDistributionOrigin176EC3A12", + S3OriginConfig: { + OriginAccessIdentity: { + "Fn::Join": [ + "", + [ + "origin-access-identity/cloudfront/", + { + Ref: "CloudFrontDistributionOrigin1S3Origin3D9CA0E9" + } + ] + ] + } + } + } + ] + } + }); +}); + +test('test cloudfront override properties', () => { + const stack = new Stack(); + const [sourceBucket] = buildS3Bucket(stack, {}); + const props: cloudfront.DistributionProps = { + defaultBehavior: { + origin: new origins.S3Origin(sourceBucket), + viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL, + cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS + }, + }; + + CloudFrontDistributionForS3(stack, sourceBucket, props); + + expect(stack).toHaveResourceLike("AWS::CloudFront::Distribution", { + DistributionConfig: { DefaultCacheBehavior: { AllowedMethods: [ "GET", - "HEAD" + "HEAD", + "OPTIONS", + "PUT", + "PATCH", + "POST", + "DELETE" ], + CachePolicyId: "658327ea-f89d-4fab-a63d-7e88639e58f6", CachedMethods: [ "GET", - "HEAD" + "HEAD", + "OPTIONS" ], Compress: true, - ForwardedValues: { - Cookies: { - Forward: "none" - }, - QueryString: false - }, LambdaFunctionAssociations: [ { EventType: "origin-response", @@ -376,7 +381,7 @@ test('test cloudfront override cloudfront logging bucket ', () => { } } ], - TargetOriginId: "origin1", + TargetOriginId: "CloudFrontDistributionOrigin176EC3A12", ViewerProtocolPolicy: "redirect-to-https" }, DefaultRootObject: "index.html", @@ -386,11 +391,10 @@ test('test cloudfront override cloudfront logging bucket ', () => { Logging: { Bucket: { "Fn::GetAtt": [ - "loggingbucket6D73BD53", + "CloudfrontLoggingBucket3C3EFAA7", "DomainName" ] - }, - IncludeCookies : true + } }, Origins: [ { @@ -400,130 +404,22 @@ test('test cloudfront override cloudfront logging bucket ', () => { "RegionalDomainName" ] }, - Id: "origin1", + Id: "CloudFrontDistributionOrigin176EC3A12", S3OriginConfig: { - OriginAccessIdentity: { - "Fn::Join": [ - "", - [ - "origin-access-identity/cloudfront/", - { - Ref: "CloudFrontOriginAccessIdentity" - } - ] + OriginAccessIdentity: { + "Fn::Join": [ + "", + [ + "origin-access-identity/cloudfront/", + { + Ref: "CloudFrontDistributionOrigin1S3Origin3D9CA0E9" + } ] - } - } - } - ], - PriceClass: "PriceClass_100", - ViewerCertificate: { - CloudFrontDefaultCertificate: true - } - } - }); -}); - -test('test cloudfront override properties', () => { - const stack = new Stack(); - const [sourceBucket] = buildS3Bucket(stack, {}); - // Create CloudFront Origin Access Identity User - const cfnOrigAccessId = new cloudfront.CfnCloudFrontOriginAccessIdentity(stack, 'CloudFrontOriginAccessIdentity1', { - cloudFrontOriginAccessIdentityConfig: { - comment: 'Access S3 bucket content only through CloudFront' - } - }); - - const oaiImported = cloudfront.OriginAccessIdentity.fromOriginAccessIdentityName( - stack, - 'OAIImported1', - cfnOrigAccessId.ref - ); - - const props: cloudfront.CloudFrontWebDistributionProps = { - originConfigs: [ { - s3OriginSource: { - s3BucketSource: sourceBucket, - originAccessIdentity: oaiImported - }, - behaviors: [ { - isDefaultBehavior: true, - allowedMethods: cloudfront.CloudFrontAllowedMethods.ALL, - cachedMethods: cloudfront.CloudFrontAllowedCachedMethods.GET_HEAD_OPTIONS - } ] - } ] - }; - - CloudFrontDistributionForS3(stack, sourceBucket, props); - - expect(stack).toHaveResourceLike("AWS::CloudFront::Distribution", { - DistributionConfig: { - DefaultCacheBehavior: { - AllowedMethods: [ - "DELETE", - "GET", - "HEAD", - "OPTIONS", - "PATCH", - "POST", - "PUT" - ], - CachedMethods: [ - "GET", - "HEAD", - "OPTIONS" - ], - Compress: true, - ForwardedValues: { - Cookies: { - Forward: "none" - }, - QueryString: false - }, - TargetOriginId: "origin1", - ViewerProtocolPolicy: "redirect-to-https" - }, - DefaultRootObject: "index.html", - Enabled: true, - HttpVersion: "http2", - IPV6Enabled: true, - Logging: { - Bucket: { - "Fn::GetAtt": [ - "CloudfrontLoggingBucket3C3EFAA7", - "DomainName" ] - }, - IncludeCookies: false - }, - Origins: [ - { - DomainName: { - "Fn::GetAtt": [ - "S3Bucket07682993", - "RegionalDomainName" - ] - }, - Id: "origin1", - S3OriginConfig: { - OriginAccessIdentity: { - "Fn::Join": [ - "", - [ - "origin-access-identity/cloudfront/", - { - Ref: "CloudFrontOriginAccessIdentity1" - } - ] - ] - } - } } - ], - PriceClass: "PriceClass_100", - ViewerCertificate: { - CloudFrontDefaultCertificate: true } } + ] + } }); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/test/kinesis-firehose-s3-defaults.test.ts b/source/patterns/@aws-solutions-constructs/core/test/kinesis-firehose-s3-defaults.test.ts index 1c9c9edf3..67b6adf34 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/kinesis-firehose-s3-defaults.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/kinesis-firehose-s3-defaults.test.ts @@ -17,11 +17,15 @@ import * as kinesisfirehose from '@aws-cdk/aws-kinesisfirehose'; import * as defaults from '../index'; import { overrideProps } from '../lib/utils'; import '@aws-cdk/assert/jest'; +import * as kms from '@aws-cdk/aws-kms'; test('snapshot test kinesisfirehose default params', () => { const stack = new Stack(); + + const awsManagedKey: kms.IKey = kms.Alias.fromAliasName(stack, 'aws-managed-key', 'alias/aws/s3'); + new kinesisfirehose.CfnDeliveryStream(stack, 'KinesisFirehose', - defaults.DefaultCfnDeliveryStreamProps('bucket_arn', 'role_arn', 'log_group', 'log_stream')); + defaults.DefaultCfnDeliveryStreamProps('bucket_arn', 'role_arn', 'log_group', 'log_stream', awsManagedKey)); expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot(); }); @@ -36,8 +40,9 @@ test('test kinesisanalytics override buffer conditions', () => { }, } }; + const awsManagedKey: kms.IKey = kms.Alias.fromAliasName(stack, 'aws-managed-key', 'alias/aws/s3'); - const defaultProps = defaults.DefaultCfnDeliveryStreamProps('bucket_arn', 'role_arn', 'log_group', 'log_stream'); + const defaultProps = defaults.DefaultCfnDeliveryStreamProps('bucket_arn', 'role_arn', 'log_group', 'log_stream', awsManagedKey); const outProps = overrideProps(defaultProps, inProps); @@ -56,6 +61,30 @@ test('test kinesisanalytics override buffer conditions', () => { LogStreamName: "log_stream" }, CompressionFormat: "GZIP", + EncryptionConfiguration: { + KMSEncryptionConfig: { + AWSKMSKeyARN: { + "Fn::Join": [ + "", + [ + "arn:", + { + Ref: "AWS::Partition" + }, + ":kms:", + { + Ref: "AWS::Region" + }, + ":", + { + Ref: "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, RoleARN: "role_arn" } }); diff --git a/source/tools/cdk-integ-tools/package.json b/source/tools/cdk-integ-tools/package.json index 066923f27..f95b26497 100644 --- a/source/tools/cdk-integ-tools/package.json +++ b/source/tools/cdk-integ-tools/package.json @@ -31,9 +31,9 @@ "typescript": "~3.7.4" }, "dependencies": { - "@aws-cdk/cloudformation-diff": "~1.67.0", - "@aws-cdk/cx-api": "~1.67.0", - "aws-cdk": "~1.67.0", + "@aws-cdk/cloudformation-diff": "~1.68.0", + "@aws-cdk/cx-api": "~1.68.0", + "aws-cdk": "~1.68.0", "fs-extra": "^8.1.0", "yargs": "^15.1.0" }, diff --git a/source/use_cases/aws-s3-static-website/package.json b/source/use_cases/aws-s3-static-website/package.json index 2613104c4..64cb11647 100644 --- a/source/use_cases/aws-s3-static-website/package.json +++ b/source/use_cases/aws-s3-static-website/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-s3-static-website", - "version": "1.67.0", + "version": "1.68.0", "description": "Use case pattern for deploying a S3 static website.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -28,19 +28,19 @@ "build+lint+test": "npm run build && npm run lint && npm test && npm run integ-assert" }, "dependencies": { - "@aws-solutions-constructs/aws-cloudfront-s3": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/custom-resources": "~1.67.0", - "@aws-cdk/aws-cloudformation": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-solutions-constructs/aws-cloudfront-s3": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/custom-resources": "~1.68.0", + "@aws-cdk/aws-cloudformation": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "source-map-support": "^0.5.16" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, diff --git a/source/use_cases/aws-serverless-image-handler/package.json b/source/use_cases/aws-serverless-image-handler/package.json index a507ead81..1e3e15b98 100644 --- a/source/use_cases/aws-serverless-image-handler/package.json +++ b/source/use_cases/aws-serverless-image-handler/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-serverless-image-handler", - "version": "1.67.0", + "version": "1.68.0", "description": "Use case pattern for deploying a serverless image handler API.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,18 +53,18 @@ } }, "dependencies": { - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-s3": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0" + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-s3": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -74,14 +74,14 @@ ] }, "peerDependencies": { - "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-s3": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0" + "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-s3": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0" } } diff --git a/source/use_cases/aws-serverless-web-app/package.json b/source/use_cases/aws-serverless-web-app/package.json index cc054af80..9215656d5 100644 --- a/source/use_cases/aws-serverless-web-app/package.json +++ b/source/use_cases/aws-serverless-web-app/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-serverless-web-app", - "version": "1.67.0", + "version": "1.68.0", "description": "Use case pattern for deploying a serverless web app.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -28,24 +28,24 @@ "build+lint+test": "npm run build && npm run lint && npm test && npm run integ-assert" }, "dependencies": { - "@aws-solutions-constructs/aws-cloudfront-s3": "~1.67.0", - "@aws-solutions-constructs/aws-cognito-apigateway-lambda": "~1.67.0", - "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.67.0", - "@aws-cdk/core": "~1.67.0", - "@aws-cdk/aws-lambda": "~1.67.0", - "@aws-cdk/aws-cloudfront": "~1.67.0", - "@aws-cdk/aws-s3": "~1.67.0", - "@aws-cdk/custom-resources": "~1.67.0", - "@aws-cdk/aws-cloudformation": "~1.67.0", - "@aws-cdk/aws-iam": "~1.67.0", - "@aws-cdk/aws-cognito": "~1.67.0", - "@aws-cdk/aws-apigateway": "~1.67.0", - "@aws-cdk/aws-dynamodb": "~1.67.0", - "@aws-solutions-constructs/core": "~1.67.0", + "@aws-solutions-constructs/aws-cloudfront-s3": "~1.68.0", + "@aws-solutions-constructs/aws-cognito-apigateway-lambda": "~1.68.0", + "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.68.0", + "@aws-cdk/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.68.0", + "@aws-cdk/aws-s3": "~1.68.0", + "@aws-cdk/custom-resources": "~1.68.0", + "@aws-cdk/aws-cloudformation": "~1.68.0", + "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-cognito": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.68.0", + "@aws-solutions-constructs/core": "~1.68.0", "source-map-support": "^0.5.16" }, "devDependencies": { - "@aws-cdk/assert": "~1.67.0", + "@aws-cdk/assert": "~1.68.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, From ea473e62593bfcf8fd21ff7a13c0a24085ac6cd5 Mon Sep 17 00:00:00 2001 From: Hitendra Nishar Date: Wed, 21 Oct 2020 20:11:13 -0400 Subject: [PATCH 3/3] Update to version v1.69.0 --- CHANGELOG.md | 8 +- source/lerna.json | 2 +- source/package.json | 2 +- .../aws-apigateway-dynamodb/package.json | 28 +++--- .../aws-apigateway-iot/package.json | 24 ++--- .../package.json | 28 +++--- .../aws-apigateway-lambda/package.json | 28 +++--- .../package.json | 24 ++--- .../aws-apigateway-sqs/package.json | 32 +++---- .../package.json | 44 ++++----- .../aws-cloudfront-apigateway/package.json | 32 +++---- .../aws-cloudfront-s3/package.json | 32 +++---- .../package.json | 32 +++---- .../package.json | 52 +++++----- .../aws-dynamodb-stream-lambda/package.json | 32 +++---- .../aws-events-rule-lambda/package.json | 24 ++--- .../aws-events-rule-sns/README.md | 10 +- .../aws-events-rule-sns/lib/index.ts | 8 +- .../aws-events-rule-sns/package.json | 28 +++--- .../events-rule-sns-topic.test.js.snap | 2 +- .../test/events-rule-sns-topic.test.ts | 14 +-- .../test/integ.events-rule-no-arguments.ts | 6 +- .../aws-events-rule-sqs/README.md | 10 +- .../aws-events-rule-sqs/lib/index.ts | 12 +-- .../aws-events-rule-sqs/package.json | 28 +++--- .../events-rule-sqs-queue.test.js.snap | 2 +- .../test/events-rule-sqs-queue.test.ts | 14 +-- .../test/integ.events-rule-existing-queue.ts | 6 +- .../test/integ.events-rule-no-arguments.ts | 6 +- .../package.json | 40 ++++---- .../aws-iot-kinesisfirehose-s3/package.json | 36 +++---- .../aws-iot-lambda-dynamodb/package.json | 32 +++---- .../aws-iot-lambda/package.json | 24 ++--- .../package.json | 40 ++++---- .../aws-kinesisfirehose-s3/package.json | 32 +++---- .../package.json | 48 +++++----- .../aws-kinesisstreams-lambda/package.json | 40 ++++---- .../aws-lambda-dynamodb/package.json | 20 ++-- .../package.json | 32 +++---- .../aws-lambda-s3/package.json | 20 ++-- .../aws-lambda-sns/package.json | 24 ++--- .../aws-lambda-sqs-lambda/package.json | 28 +++--- .../aws-lambda-sqs/package.json | 20 ++-- .../aws-lambda-step-function/package.json | 28 +++--- .../aws-s3-lambda/package.json | 32 +++---- .../aws-s3-step-function/package.json | 52 +++++----- .../aws-sns-lambda/package.json | 32 +++---- .../aws-sns-sqs/package.json | 32 +++---- .../aws-sqs-lambda/package.json | 28 +++--- .../core/package.json | 96 +++++++++---------- source/tools/cdk-integ-tools/package.json | 6 +- .../aws-s3-static-website/package.json | 22 ++--- .../aws-serverless-image-handler/package.json | 40 ++++---- .../aws-serverless-web-app/package.json | 32 +++---- 54 files changed, 706 insertions(+), 700 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5528a0aea..b2a2c77f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.69.0] - 2020-10-21 + +### Changed +- Upgraded all patterns to CDK v1.69.0 +- BREAKING CHANGE: Updated `aws-events-rule-sns` and `aws-events-rule-sqs` patterns to use pascal case for class and interface names + ## [1.68.0] - 2020-10-16 ### Added @@ -229,4 +235,4 @@ General Availability of the AWS Solutions Constructs!! 🎉🎉🥂🥂🍾🍾 - aws-s3-lambda pattern added - aws-sns-lambda pattern added - aws-sqs-lambda pattern added -- core pattern added +- core pattern added \ No newline at end of file diff --git a/source/lerna.json b/source/lerna.json index 1b9557132..837d4df3f 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "1.68.0" + "version": "1.69.0" } diff --git a/source/package.json b/source/package.json index bed71d9ed..1e4bc6540 100644 --- a/source/package.json +++ b/source/package.json @@ -1,6 +1,6 @@ { "name": "aws-solutions-constructs", - "version": "1.68.0", + "version": "1.69.0", "description": "AWS Solutions Constructs Library", "repository": { "type": "git", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json index adacc3e47..54bc0bff2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-dynamodb", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS API Gateway and Amazon DynamoDB integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json index ddbba1812..5e8279da8 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-iot", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs to proxy communication to IotCore using a APIGateway(REST).", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-iam": "~1.68.0" + "@aws-cdk/aws-iam": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json index 0566f81ad..16275ab22 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-kinesisstreams", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS API Gateway and Amazon Kinesis Data Streams integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json index 05c5b2b90..97f86484c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an API Gateway and a Lambda function.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-iam": "~1.68.0" + "@aws-cdk/aws-iam": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json index f541716f8..0186125bb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-sagemakerendpoint", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS API Gateway and Amazon SageMaker Endpoint integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json index 0557d1713..c101fe785 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-apigateway-sqs", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon S3 bucket.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json index 21b6a6e9d..237670a67 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS Cloudfront to AWS API Gateway to AWS Lambda integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,20 +53,20 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/aws-cloudfront-apigateway": "~1.68.0", - "@aws-cdk/aws-cloudfront-origins": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/aws-cloudfront-apigateway": "~1.69.0", + "@aws-cdk/aws-cloudfront-origins": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -76,16 +76,16 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-solutions-constructs/aws-cloudfront-apigateway": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-solutions-constructs/aws-cloudfront-apigateway": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-cloudfront-origins": "~1.68.0" + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-cloudfront-origins": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json index 6cd700a0f..28ed6e655 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-cloudfront-apigateway", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS Cloudfront to AWS API Gateway integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-s3": "~1.68.0" + "@aws-cdk/aws-s3": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json index 4ca66a3cc..4c2d5c2ab 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-cloudfront-s3", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS Cloudfront to AWS S3 integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-certificatemanager": "~1.68.0", - "@aws-cdk/aws-cloudfront-origins": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-certificatemanager": "~1.69.0", + "@aws-cdk/aws-cloudfront-origins": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-certificatemanager": "~1.68.0", - "@aws-cdk/aws-cloudfront-origins": "~1.68.0" + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-certificatemanager": "~1.69.0", + "@aws-cdk/aws-cloudfront-origins": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json index 054bcec70..a537824fd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-cognito-apigateway-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS Cognito to AWS API Gateway to AWS Lambda integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/package.json b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/package.json index ae8791b0a..3f9894b5f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-dynamodb-stream-lambda-elasticsearch-kibana", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for Amazon Dynamodb stream to AWS Lambda to AWS Elasticsearch with Kibana integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,22 +53,22 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-elasticsearch": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-dynamodb-stream-lambda": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-elasticsearch": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-dynamodb-stream-lambda": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -78,18 +78,18 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-elasticsearch": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-dynamodb-stream-lambda": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-elasticsearch": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-dynamodb-stream-lambda": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0" + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/package.json index 97dcbaa9c..a7795f949 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-dynamodb-stream-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS DynamoDB Stream to AWS Lambda integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0" + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-events-rule-lambda/package.json index 48278b50a..217403b12 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-events-rule-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for deploying AWS Events Rule that inveokes AWS Lambda", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/README.md b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/README.md index 0f59b95f9..2f719172a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/README.md @@ -30,15 +30,15 @@ Here is a minimal deployable pattern definition in Typescript: import { Duration } from '@aws-cdk/core'; import * as events from '@aws-cdk/aws-events'; import * as iam from '@aws-cdk/aws-iam'; -import { EventsRuleToSNSProps, EventsRuleToSNS } from "@aws-solutions-constructs/aws-events-rule-sns"; +import { EventsRuleToSnsProps, EventsRuleToSns } from "@aws-solutions-constructs/aws-events-rule-sns"; -const props: EventsRuleToSNSProps = { +const props: EventsRuleToSnsProps = { eventRuleProps: { schedule: events.Schedule.rate(Duration.minutes(5)), } }; -const constructStack = new EventsRuleToSNS(this, 'test-construct', props); +const constructStack = new EventsRuleToSns(this, 'test-construct', props); // Grant yourself permissions to use the Customer Managed KMS Key const policyStatement = new iam.PolicyStatement({ @@ -54,14 +54,14 @@ constructStack.encryptionKey?.addToResourcePolicy(policyStatement); ## Initializer ``` text -new EventsRuleToSNS(scope: Construct, id: string, props: EventsRuleToSNSProps); +new EventsRuleToSns(scope: Construct, id: string, props: EventsRuleToSnsProps); ``` _Parameters_ * scope [`Construct`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_core.Construct.html) * id `string` -* props [`EventsRuleToSNSProps`](#pattern-construct-props) +* props [`EventsRuleToSnsProps`](#pattern-construct-props) ## Pattern Construct Props diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/lib/index.ts index eed17e600..6b1431eea 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/lib/index.ts @@ -19,7 +19,7 @@ import { Construct } from '@aws-cdk/core'; import { overrideProps } from '@aws-solutions-constructs/core'; import { ServicePrincipal } from '@aws-cdk/aws-iam'; -export interface EventsRuleToSNSProps { +export interface EventsRuleToSnsProps { /** * User provided props to override the default props for the SNS Topic. * @@ -59,7 +59,7 @@ export interface EventsRuleToSNSProps { readonly encryptionKeyProps?: kms.KeyProps } -export class EventsRuleToSNS extends Construct { +export class EventsRuleToSns extends Construct { public readonly snsTopic: sns.Topic; public readonly eventsRule: events.Rule; public readonly encryptionKey?: kms.Key; @@ -68,11 +68,11 @@ export class EventsRuleToSNS extends Construct { * @summary Constructs a new instance of the EventRuleToSns class. * @param {cdk.App} scope - represents the scope for all the resources. * @param {string} id - this is a a scope-unique id. - * @param {EventsRuleToSNSProps} props - user provided props for the construct. + * @param {EventsRuleToSnsProps} props - user provided props for the construct. * @since 1.62.0 * @access public */ - constructor(scope: Construct, id: string, props: EventsRuleToSNSProps) { + constructor(scope: Construct, id: string, props: EventsRuleToSnsProps) { super(scope, id); let enableEncryptionParam = props.enableEncryptionWithCustomerManagedKey; diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/package.json b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/package.json index 85ebc7879..d8a1fa154 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-events-rule-sns", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for deploying AWS Events Rule that invokes AWS SNS", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/__snapshots__/events-rule-sns-topic.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/__snapshots__/events-rule-sns-topic.test.js.snap index 5984badfe..2c689695f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/__snapshots__/events-rule-sns-topic.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/__snapshots__/events-rule-sns-topic.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`snapshot test EventsRuleToSNS default params 1`] = ` +exports[`snapshot test EventsRuleToSns default params 1`] = ` Object { "Resources": Object { "testEncryptionKeyB55BFDBC": Object { diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/events-rule-sns-topic.test.ts b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/events-rule-sns-topic.test.ts index 30b8fc94d..a116b1dc3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/events-rule-sns-topic.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/events-rule-sns-topic.test.ts @@ -16,18 +16,18 @@ import * as cdk from "@aws-cdk/core"; import * as events from "@aws-cdk/aws-events"; import * as defaults from '@aws-solutions-constructs/core'; import '@aws-cdk/assert/jest'; -import { EventsRuleToSNS, EventsRuleToSNSProps } from "../lib"; +import { EventsRuleToSns, EventsRuleToSnsProps } from "../lib"; function deployNewStack(stack: cdk.Stack) { - const props: EventsRuleToSNSProps = { + const props: EventsRuleToSnsProps = { eventRuleProps: { schedule: events.Schedule.rate(cdk.Duration.minutes(5)) } }; - return new EventsRuleToSNS(stack, 'test', props); + return new EventsRuleToSns(stack, 'test', props); } -test('snapshot test EventsRuleToSNS default params', () => { +test('snapshot test EventsRuleToSns default params', () => { const stack = new cdk.Stack(); deployNewStack(stack); expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot(); @@ -154,7 +154,7 @@ test('check events rule properties', () => { test('check properties', () => { const stack = new cdk.Stack(); - const construct: EventsRuleToSNS = deployNewStack(stack); + const construct: EventsRuleToSns = deployNewStack(stack); expect(construct.eventsRule !== null); expect(construct.snsTopic !== null); @@ -180,14 +180,14 @@ test('check the sns topic properties with existing KMS key', () => { description: 'my-key' }); - const props: EventsRuleToSNSProps = { + const props: EventsRuleToSnsProps = { eventRuleProps: { schedule: events.Schedule.rate(cdk.Duration.minutes(5)) }, encryptionKey: key }; - new EventsRuleToSNS(stack, 'test-events-rule-sqs', props); + new EventsRuleToSns(stack, 'test-events-rule-sqs', props); expect(stack).toHaveResource('AWS::SNS::Topic', { KmsMasterKeyId: { diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/integ.events-rule-no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/integ.events-rule-no-arguments.ts index 6e9b9c3b6..fc3006300 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/integ.events-rule-no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sns/test/integ.events-rule-no-arguments.ts @@ -12,19 +12,19 @@ */ import { Duration } from '@aws-cdk/core'; -import { EventsRuleToSNS, EventsRuleToSNSProps } from '../lib'; +import { EventsRuleToSns, EventsRuleToSnsProps } from '../lib'; import * as events from '@aws-cdk/aws-events'; import { App, Stack } from '@aws-cdk/core'; const app = new App(); const stack = new Stack(app, 'test-rule-sns'); -const props: EventsRuleToSNSProps = { +const props: EventsRuleToSnsProps = { eventRuleProps: { schedule: events.Schedule.rate(Duration.minutes(5)) } }; -new EventsRuleToSNS(stack, 'test-construct', props); +new EventsRuleToSns(stack, 'test-construct', props); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/README.md b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/README.md index 4c122aa58..3d5f79259 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/README.md @@ -30,15 +30,15 @@ Here is a minimal deployable pattern definition in Typescript: import { Duration } from '@aws-cdk/core'; import * as events from '@aws-cdk/aws-events'; import * as iam from '@aws-cdk/aws-iam'; -import { EventsRuleToSQSProps, EventsRuleToSQS } from "@aws-solutions-constructs/aws-events-rule-sqs"; +import { EventsRuleToSqsProps, EventsRuleToSqs } from "@aws-solutions-constructs/aws-events-rule-sqs"; -const props: EventsRuleToSQSProps = { +const props: EventsRuleToSqsProps = { eventRuleProps: { schedule: events.Schedule.rate(Duration.minutes(5)) } }; -const constructStack = new EventsRuleToSQS(this, 'test-construct', props); +const constructStack = new EventsRuleToSqs(this, 'test-construct', props); // Grant yourself permissions to use the Customer Managed KMS Key const policyStatement = new iam.PolicyStatement({ @@ -54,14 +54,14 @@ constructStack.encryptionKey?.addToResourcePolicy(policyStatement); ## Initializer ``` text -new EventsRuleToSQS(scope: Construct, id: string, props: EventsRuleToSQSProps); +new EventsRuleToSqs(scope: Construct, id: string, props: EventsRuleToSqsProps); ``` _Parameters_ * scope [`Construct`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_core.Construct.html) * id `string` -* props [`EventsRuleToSQSProps`](#pattern-construct-props) +* props [`EventsRuleToSqsProps`](#pattern-construct-props) ## Pattern Construct Props diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/lib/index.ts index 3c9766d09..658d2375e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/lib/index.ts @@ -20,9 +20,9 @@ import { Construct } from '@aws-cdk/core'; import { overrideProps } from '@aws-solutions-constructs/core'; /** - * @summary The properties for the EventsRuleToSQS Construct + * @summary The properties for the EventsRuleToSqs Construct */ -export interface EventsRuleToSQSProps { +export interface EventsRuleToSqsProps { /** * User provided eventRuleProps to override the defaults * @@ -86,21 +86,21 @@ export interface EventsRuleToSQSProps { readonly encryptionKeyProps?: kms.KeyProps } -export class EventsRuleToSQS extends Construct { +export class EventsRuleToSqs extends Construct { public readonly sqsQueue: sqs.Queue; public readonly deadLetterQueue?: sqs.DeadLetterQueue; public readonly eventsRule: events.Rule; public readonly encryptionKey?: kms.IKey; /** - * @summary Constructs a new instance of the EventsRuleToSQS class. + * @summary Constructs a new instance of the EventsRuleToSqs class. * @param {cdk.App} scope - represents the scope for all the resources. * @param {string} id - this is a a scope-unique id. - * @param {EventsRuleToSQSProps} props - user provided props for the construct + * @param {EventsRuleToSqsProps} props - user provided props for the construct * @since 1.62.0 * @access public */ - constructor(scope: Construct, id: string, props: EventsRuleToSQSProps) { + constructor(scope: Construct, id: string, props: EventsRuleToSqsProps) { super(scope, id); // Setup the dead letter queue, if applicable diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/package.json index b3956ce03..2145232a6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-events-rule-sqs", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for deploying AWS Events Rule that invokes AWS SQS", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/__snapshots__/events-rule-sqs-queue.test.js.snap b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/__snapshots__/events-rule-sqs-queue.test.js.snap index af71151b8..00803ad65 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/__snapshots__/events-rule-sqs-queue.test.js.snap +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/__snapshots__/events-rule-sqs-queue.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`snapshot test EventsRuleToSQS default params 1`] = ` +exports[`snapshot test EventsRuleToSqs default params 1`] = ` Object { "Resources": Object { "testeventsrulesqsEncryptionKey19AB0C02": Object { diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/events-rule-sqs-queue.test.ts b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/events-rule-sqs-queue.test.ts index f387695fc..fd1959c99 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/events-rule-sqs-queue.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/events-rule-sqs-queue.test.ts @@ -12,22 +12,22 @@ */ import * as cdk from '@aws-cdk/core'; -import { EventsRuleToSQS, EventsRuleToSQSProps } from '../lib'; +import { EventsRuleToSqs, EventsRuleToSqsProps } from '../lib'; import * as events from "@aws-cdk/aws-events"; import { SynthUtils } from '@aws-cdk/assert'; import '@aws-cdk/assert/jest'; import * as defaults from '@aws-solutions-constructs/core'; function deployNewStack(stack: cdk.Stack) { - const props: EventsRuleToSQSProps = { + const props: EventsRuleToSqsProps = { eventRuleProps: { schedule: events.Schedule.rate(cdk.Duration.minutes(5)) } }; - return new EventsRuleToSQS(stack, 'test-events-rule-sqs', props); + return new EventsRuleToSqs(stack, 'test-events-rule-sqs', props); } -test('snapshot test EventsRuleToSQS default params', () => { +test('snapshot test EventsRuleToSqs default params', () => { const stack = new cdk.Stack(); deployNewStack(stack); expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot(); @@ -61,14 +61,14 @@ test('check the sqs queue properties with existing KMS key', () => { description: 'my-key' }); - const props: EventsRuleToSQSProps = { + const props: EventsRuleToSqsProps = { eventRuleProps: { schedule: events.Schedule.rate(cdk.Duration.minutes(5)) }, encryptionKey: key }; - new EventsRuleToSQS(stack, 'test-events-rule-sqs', props); + new EventsRuleToSqs(stack, 'test-events-rule-sqs', props); expect(stack).toHaveResource('AWS::SQS::Queue', { KmsMasterKeyId: { @@ -312,7 +312,7 @@ test('check if the dead letter queue policy is setup', () => { test('check properties', () => { const stack = new cdk.Stack(); - const construct: EventsRuleToSQS = deployNewStack(stack); + const construct: EventsRuleToSqs = deployNewStack(stack); expect(construct.eventsRule !== null); expect(construct.sqsQueue !== null); diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/integ.events-rule-existing-queue.ts b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/integ.events-rule-existing-queue.ts index 8bb9c9cf4..238ebf3ea 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/integ.events-rule-existing-queue.ts +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/integ.events-rule-existing-queue.ts @@ -12,7 +12,7 @@ */ import { Duration } from '@aws-cdk/core'; -import { EventsRuleToSQSProps, EventsRuleToSQS } from '../lib'; +import { EventsRuleToSqsProps, EventsRuleToSqs } from '../lib'; import * as events from '@aws-cdk/aws-events'; import { App, Stack } from '@aws-cdk/core'; import * as sqs from '@aws-cdk/aws-sqs'; @@ -28,12 +28,12 @@ const existingQueueObj = new sqs.Queue(stack, 'MyQueue', { }), }); -const props: EventsRuleToSQSProps = { +const props: EventsRuleToSqsProps = { eventRuleProps: { schedule: events.Schedule.rate(Duration.minutes(5)) }, existingQueueObj }; -new EventsRuleToSQS(stack, 'construct', props); +new EventsRuleToSqs(stack, 'construct', props); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/integ.events-rule-no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/integ.events-rule-no-arguments.ts index 8f929caa3..1e5777f36 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/integ.events-rule-no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-sqs/test/integ.events-rule-no-arguments.ts @@ -12,18 +12,18 @@ */ import { Duration } from '@aws-cdk/core'; -import { EventsRuleToSQSProps, EventsRuleToSQS } from '../lib'; +import { EventsRuleToSqsProps, EventsRuleToSqs } from '../lib'; import * as events from '@aws-cdk/aws-events'; import { App, Stack } from '@aws-cdk/core'; const app = new App(); const stack = new Stack(app, 'test-rule-sqs'); -const props: EventsRuleToSQSProps = { +const props: EventsRuleToSqsProps = { eventRuleProps: { schedule: events.Schedule.rate(Duration.minutes(5)) } }; -new EventsRuleToSQS(stack, 'construct', props); +new EventsRuleToSqs(stack, 'construct', props); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-events-rule-step-function/package.json b/source/patterns/@aws-solutions-constructs/aws-events-rule-step-function/package.json index 656d8061f..68d78e603 100644 --- a/source/patterns/@aws-solutions-constructs/aws-events-rule-step-function/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-events-rule-step-function/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-events-rule-step-function", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for deploying AWS Events Rule that invokes AWS Step Function", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,19 +53,19 @@ } }, "dependencies": { - "@aws-cdk/aws-stepfunctions": "~1.68.0", - "@aws-cdk/aws-stepfunctions-tasks": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-stepfunctions": "~1.69.0", + "@aws-cdk/aws-stepfunctions-tasks": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -75,15 +75,15 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-stepfunctions": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-stepfunctions": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/aws-stepfunctions-tasks": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/aws-stepfunctions-tasks": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json index a3f03eccc..8bf96a7a6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-iot-kinesisfirehose-s3", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS IoT to AWS Kinesis Firehose to AWS S3 integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,18 +53,18 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-iot": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-iot": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -74,14 +74,14 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-iot": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-iot": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json index 4226d8d96..f6c1d70f8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-iot-lambda-dynamodb", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS IoT to AWS Lambda to AWS DyanmoDB integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-iot": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-iot-lambda": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-iot": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-iot-lambda": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-iot": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-iot-lambda": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.68.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-iot": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-iot-lambda": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json index 511a7f6a4..f5bc85ab8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-iot-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS IoT to AWS Lambda integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/aws-iot": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iot": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iot": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", + "@aws-cdk/aws-iot": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json index 17c1e892a..291bb04f1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an Amazon Kinesis Data Firehose delivery stream and (1) an Amazon S3 bucket, and (2) an Amazon Kinesis Data Analytics application.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,19 +53,19 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-kinesisanalytics": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-kinesisanalytics": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -75,15 +75,15 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-kinesisanalytics": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-kinesisanalytics": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json index 32f455b38..032265ce0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-kinesisfirehose-s3", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an Amazon Kinesis Data Firehose delivery stream and an Amazon S3 bucket.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-kms": "~1.68.0" + "@aws-cdk/aws-kms": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json index e41cbad93..1d084b604 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an Amazon Kinesis Data Stream (KDS), Amazon Kinesis Data Firehose (KDF) delivery stream and an Amazon S3 bucket.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,21 +53,21 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", - "@aws-solutions-constructs/aws-kinesisstreams-lambda": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.69.0", + "@aws-solutions-constructs/aws-kinesisstreams-lambda": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -77,17 +77,17 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-solutions-constructs/aws-kinesisstreams-lambda": "~1.68.0" + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-solutions-constructs/aws-kinesisfirehose-s3": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-solutions-constructs/aws-kinesisstreams-lambda": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json index b2c6a2815..bad1f058f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-kinesisstreams-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an Amazon Kinesis Data Stream and an AWS Lambda function.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,19 +53,19 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -75,15 +75,15 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0" + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json index a06af40e1..4ba1aaeff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-dynamodb", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS Lambda to AWS DynamoDB integration.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,14 +53,14 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -70,10 +70,10 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json index f404411ec..961ff7741 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-elasticsearch-kibana", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS Lambda to AWS Elasticsearch with Kibana integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-elasticsearch": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-elasticsearch": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-elasticsearch": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-elasticsearch": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json index 32690b232..7c9de93d4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-s3", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon S3 bucket.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,14 +53,14 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -70,10 +70,10 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json index ec0523a33..642cd1a94 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-sns", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon SNS topic.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,15 +53,15 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -71,11 +71,11 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json index c8b2214bc..553dfeabe 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-sqs-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK construct that provisions (1) an AWS Lambda function that is configured to send messages to a queue; (2) an Amazon SQS queue; and (3) an AWS Lambda function configured to consume messages from the queue.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-sqs": "~1.68.0", - "@aws-solutions-constructs/aws-sqs-lambda": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-sqs": "~1.69.0", + "@aws-solutions-constructs/aws-sqs-lambda": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-sqs": "~1.68.0", - "@aws-solutions-constructs/aws-sqs-lambda": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-sqs": "~1.69.0", + "@aws-solutions-constructs/aws-sqs-lambda": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json index ee790eb45..cd827a1af 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-sqs", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an Amazon SQS queue.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,14 +53,14 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -70,10 +70,10 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-step-function/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-step-function/package.json index d6d41d2d6..5ea133fd9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-step-function/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-step-function/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-lambda-step-function", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an AWS Lambda function and an AWS Step Function.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-stepfunctions": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-stepfunctions": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0", "eslint-plugin-import": "^2.22.0" @@ -73,12 +73,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-stepfunctions": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-stepfunctions": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json index 35255414d..12adbcdf4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-s3-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS S3 to AWS Lambda integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-s3-notifications": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-s3-notifications": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-s3-notifications": "~1.68.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-s3-notifications": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-step-function/package.json b/source/patterns/@aws-solutions-constructs/aws-s3-step-function/package.json index d3ccfd265..75e562529 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-step-function/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-step-function/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-s3-step-function", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS S3 to AWS Step Function integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,22 +53,22 @@ } }, "dependencies": { - "@aws-cdk/aws-stepfunctions": "~1.68.0", - "@aws-cdk/aws-stepfunctions-tasks": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/aws-cloudtrail": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-events-rule-step-function": "~1.68.0", + "@aws-cdk/aws-stepfunctions": "~1.69.0", + "@aws-cdk/aws-stepfunctions-tasks": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/aws-cloudtrail": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-events-rule-step-function": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -78,18 +78,18 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-stepfunctions": "~1.68.0", - "@aws-cdk/aws-stepfunctions-tasks": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/aws-cloudtrail": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-solutions-constructs/aws-events-rule-step-function": "~1.68.0", + "@aws-cdk/aws-stepfunctions": "~1.69.0", + "@aws-cdk/aws-stepfunctions-tasks": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/aws-cloudtrail": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-solutions-constructs/aws-events-rule-step-function": "~1.69.0", "constructs": "^3.0.4", - "@aws-cdk/aws-logs": "~1.68.0" + "@aws-cdk/aws-logs": "~1.69.0" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json index be71ffed9..674dffea8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-sns-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK Constructs for AWS SNS to AWS Lambda integration", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json index 00f7aed82..7e88dc47f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-sns-sqs", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an Amazon SNS topic and an Amazon SQS queue.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,17 +53,17 @@ } }, "dependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-sns-subscriptions": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-sns-subscriptions": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -73,13 +73,13 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-sns-subscriptions": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-sns-subscriptions": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json index b4a96b48a..93a62a202 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-sqs-lambda", - "version": "1.68.0", + "version": "1.69.0", "description": "CDK constructs for defining an interaction between an Amazon SQS queue and an AWS Lambda function.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,16 +53,16 @@ } }, "dependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -72,12 +72,12 @@ ] }, "peerDependencies": { - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "constructs": "^3.0.4" } } diff --git a/source/patterns/@aws-solutions-constructs/core/package.json b/source/patterns/@aws-solutions-constructs/core/package.json index 94d101e98..b003b691f 100644 --- a/source/patterns/@aws-solutions-constructs/core/package.json +++ b/source/patterns/@aws-solutions-constructs/core/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/core", - "version": "1.68.0", + "version": "1.69.0", "description": "Core CDK Construct for patterns library", "main": "index.js", "types": "index.ts", @@ -52,29 +52,29 @@ } }, "dependencies": { - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-cloudfront-origins": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/aws-iot": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-kinesisanalytics": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-elasticsearch": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/aws-stepfunctions": "~1.68.0", - "@aws-cdk/aws-certificatemanager": "~1.68.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-cloudfront-origins": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/aws-iot": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-kinesisanalytics": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-elasticsearch": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/aws-stepfunctions": "~1.69.0", + "@aws-cdk/aws-certificatemanager": "~1.69.0", "@types/deep-diff": "^1.0.0", "@types/npmlog": "^4.1.2", "deep-diff": "^1.0.2", @@ -82,7 +82,7 @@ "npmlog": "^4.1.2" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -99,28 +99,28 @@ "@types/deep-diff" ], "peerDependencies": { - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-cdk/aws-iot": "~1.68.0", - "@aws-cdk/aws-kinesis": "~1.68.0", - "@aws-cdk/aws-kinesisanalytics": "~1.68.0", - "@aws-cdk/aws-kinesisfirehose": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-lambda-event-sources": "~1.68.0", - "@aws-cdk/aws-logs": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/aws-sns": "~1.68.0", - "@aws-cdk/aws-sqs": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-kms": "~1.68.0", - "@aws-cdk/aws-events": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-elasticsearch": "~1.68.0", - "@aws-cdk/aws-cloudwatch": "~1.68.0", - "@aws-cdk/aws-stepfunctions": "~1.68.0", - "@aws-cdk/aws-cloudfront-origins": "~1.68.0", - "@aws-cdk/aws-certificatemanager": "~1.68.0" + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-cdk/aws-iot": "~1.69.0", + "@aws-cdk/aws-kinesis": "~1.69.0", + "@aws-cdk/aws-kinesisanalytics": "~1.69.0", + "@aws-cdk/aws-kinesisfirehose": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-lambda-event-sources": "~1.69.0", + "@aws-cdk/aws-logs": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/aws-sns": "~1.69.0", + "@aws-cdk/aws-sqs": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-kms": "~1.69.0", + "@aws-cdk/aws-events": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-elasticsearch": "~1.69.0", + "@aws-cdk/aws-cloudwatch": "~1.69.0", + "@aws-cdk/aws-stepfunctions": "~1.69.0", + "@aws-cdk/aws-cloudfront-origins": "~1.69.0", + "@aws-cdk/aws-certificatemanager": "~1.69.0" } } diff --git a/source/tools/cdk-integ-tools/package.json b/source/tools/cdk-integ-tools/package.json index f95b26497..492edb888 100644 --- a/source/tools/cdk-integ-tools/package.json +++ b/source/tools/cdk-integ-tools/package.json @@ -31,9 +31,9 @@ "typescript": "~3.7.4" }, "dependencies": { - "@aws-cdk/cloudformation-diff": "~1.68.0", - "@aws-cdk/cx-api": "~1.68.0", - "aws-cdk": "~1.68.0", + "@aws-cdk/cloudformation-diff": "~1.69.0", + "@aws-cdk/cx-api": "~1.69.0", + "aws-cdk": "~1.69.0", "fs-extra": "^8.1.0", "yargs": "^15.1.0" }, diff --git a/source/use_cases/aws-s3-static-website/package.json b/source/use_cases/aws-s3-static-website/package.json index 64cb11647..9ebe249c6 100644 --- a/source/use_cases/aws-s3-static-website/package.json +++ b/source/use_cases/aws-s3-static-website/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-s3-static-website", - "version": "1.68.0", + "version": "1.69.0", "description": "Use case pattern for deploying a S3 static website.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -28,19 +28,19 @@ "build+lint+test": "npm run build && npm run lint && npm test && npm run integ-assert" }, "dependencies": { - "@aws-solutions-constructs/aws-cloudfront-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/custom-resources": "~1.68.0", - "@aws-cdk/aws-cloudformation": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-cloudfront-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/custom-resources": "~1.69.0", + "@aws-cdk/aws-cloudformation": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "source-map-support": "^0.5.16" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, diff --git a/source/use_cases/aws-serverless-image-handler/package.json b/source/use_cases/aws-serverless-image-handler/package.json index 1e3e15b98..a1f595afb 100644 --- a/source/use_cases/aws-serverless-image-handler/package.json +++ b/source/use_cases/aws-serverless-image-handler/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-serverless-image-handler", - "version": "1.68.0", + "version": "1.69.0", "description": "Use case pattern for deploying a serverless image handler API.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -53,18 +53,18 @@ } }, "dependencies": { - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-s3": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0" + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-s3": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" }, @@ -74,14 +74,14 @@ ] }, "peerDependencies": { - "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-s3": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0" + "@aws-solutions-constructs/aws-cloudfront-apigateway-lambda": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-s3": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0" } } diff --git a/source/use_cases/aws-serverless-web-app/package.json b/source/use_cases/aws-serverless-web-app/package.json index 9215656d5..d56cd85d4 100644 --- a/source/use_cases/aws-serverless-web-app/package.json +++ b/source/use_cases/aws-serverless-web-app/package.json @@ -1,6 +1,6 @@ { "name": "@aws-solutions-constructs/aws-serverless-web-app", - "version": "1.68.0", + "version": "1.69.0", "description": "Use case pattern for deploying a serverless web app.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -28,24 +28,24 @@ "build+lint+test": "npm run build && npm run lint && npm test && npm run integ-assert" }, "dependencies": { - "@aws-solutions-constructs/aws-cloudfront-s3": "~1.68.0", - "@aws-solutions-constructs/aws-cognito-apigateway-lambda": "~1.68.0", - "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.68.0", - "@aws-cdk/core": "~1.68.0", - "@aws-cdk/aws-lambda": "~1.68.0", - "@aws-cdk/aws-cloudfront": "~1.68.0", - "@aws-cdk/aws-s3": "~1.68.0", - "@aws-cdk/custom-resources": "~1.68.0", - "@aws-cdk/aws-cloudformation": "~1.68.0", - "@aws-cdk/aws-iam": "~1.68.0", - "@aws-cdk/aws-cognito": "~1.68.0", - "@aws-cdk/aws-apigateway": "~1.68.0", - "@aws-cdk/aws-dynamodb": "~1.68.0", - "@aws-solutions-constructs/core": "~1.68.0", + "@aws-solutions-constructs/aws-cloudfront-s3": "~1.69.0", + "@aws-solutions-constructs/aws-cognito-apigateway-lambda": "~1.69.0", + "@aws-solutions-constructs/aws-lambda-dynamodb": "~1.69.0", + "@aws-cdk/core": "~1.69.0", + "@aws-cdk/aws-lambda": "~1.69.0", + "@aws-cdk/aws-cloudfront": "~1.69.0", + "@aws-cdk/aws-s3": "~1.69.0", + "@aws-cdk/custom-resources": "~1.69.0", + "@aws-cdk/aws-cloudformation": "~1.69.0", + "@aws-cdk/aws-iam": "~1.69.0", + "@aws-cdk/aws-cognito": "~1.69.0", + "@aws-cdk/aws-apigateway": "~1.69.0", + "@aws-cdk/aws-dynamodb": "~1.69.0", + "@aws-solutions-constructs/core": "~1.69.0", "source-map-support": "^0.5.16" }, "devDependencies": { - "@aws-cdk/assert": "~1.68.0", + "@aws-cdk/assert": "~1.69.0", "@types/jest": "^24.0.23", "@types/node": "^10.3.0" },