From cf1ab774963bc16ff9b0cc57cdd28916b083daf6 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Fri, 3 Nov 2023 15:22:27 -0400 Subject: [PATCH] Remove aws-kinesisfirehose-s3-and-kinesisanalytics --- sonar-project.properties | 1 - .../.eslintignore | 5 - .../.gitignore | 15 - .../.npmignore | 21 - .../README.md | 205 ------- .../architecture.png | Bin 120293 -> 0 bytes .../lib/index.ts | 127 ----- .../package.json | 106 ---- .../integ.customLoggingBucket.expected.json | 535 ------------------ .../test/integ.customLoggingBucket.ts | 65 --- .../test/integ.no-arguments.expected.json | 534 ----------------- .../test/integ.no-arguments.ts | 61 -- .../test/integ.noLoggingBucket.expected.json | 421 -------------- .../test/integ.noLoggingBucket.ts | 68 --- ...isfirehose-s3-and-kinesisanalytics.test.ts | 215 ------- .../test/lambda/index.js | 8 - 16 files changed, 2387 deletions(-) delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.eslintignore delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.gitignore delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.npmignore delete mode 100755 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/README.md delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/architecture.png delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.expected.json delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/lambda/index.js diff --git a/sonar-project.properties b/sonar-project.properties index f6b2fc410..1527677dd 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -60,7 +60,6 @@ sonar.javascript.lcov.reportPaths= \ source/patterns/@aws-solutions-constructs/aws-iot-lambda/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-iot-s3/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-iot-sqs/coverage/lcov.info, \ - source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/coverage/lcov.info, \ diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.eslintignore b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.eslintignore deleted file mode 100644 index 0819e2e65..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -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-kinesisfirehose-s3-and-kinesisanalytics/.gitignore b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.gitignore deleted file mode 100644 index 6773cabd2..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -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-kinesisfirehose-s3-and-kinesisanalytics/.npmignore b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.npmignore deleted file mode 100644 index f66791629..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.npmignore +++ /dev/null @@ -1,21 +0,0 @@ -# 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-kinesisfirehose-s3-and-kinesisanalytics/README.md b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/README.md deleted file mode 100755 index ffce80da8..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/README.md +++ /dev/null @@ -1,205 +0,0 @@ -# aws-kinesisfirehose-s3-and-kinesisanalytics 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_kinesisfirehose_s3_and_kinesisanalytics`| -|![Typescript Logo](https://docs.aws.amazon.com/cdk/api/latest/img/typescript32.png) Typescript|`@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics`| -|![Java Logo](https://docs.aws.amazon.com/cdk/api/latest/img/java32.png) Java|`software.amazon.awsconstructs.services.kinesisfirehoses3kinesisanalytics`| - -## Overview -This AWS Solutions Construct implements an Amazon Kinesis Firehose delivery stream connected to an Amazon S3 bucket, and an Amazon Kinesis Analytics application. - -Here is a minimal deployable pattern definition: - -Typescript -``` typescript -import { Construct } from 'constructs'; -import { Stack, StackProps } from 'aws-cdk-lib'; -import { KinesisFirehoseToAnalyticsAndS3 } from '@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics'; - -new KinesisFirehoseToAnalyticsAndS3(this, 'FirehoseToS3AndAnalyticsPattern', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ticker_symbol', - sqlType: 'VARCHAR(4)', - mapping: '$.ticker_symbol' - }, { - name: 'sector', - sqlType: 'VARCHAR(16)', - mapping: '$.sector' - }, { - name: 'change', - sqlType: 'REAL', - mapping: '$.change' - }, { - name: 'price', - sqlType: 'REAL', - mapping: '$.price' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - } -}); -``` - -Python -```python -from aws_solutions_constructs.aws_kinesis_firehose_s3_kinesis_analytics import KinesisFirehoseToAnalyticsAndS3 -from aws_cdk import ( - aws_kinesisanalytics as kinesisanalytics, - Stack -) -from constructs import Construct - -KinesisFirehoseToAnalyticsAndS3(self, 'FirehoseToS3AndAnalyticsPattern', - kinesis_analytics_props=kinesisanalytics.CfnApplicationProps( - inputs=[kinesisanalytics.CfnApplication.InputProperty( - input_schema=kinesisanalytics.CfnApplication.InputSchemaProperty( - record_columns=[kinesisanalytics.CfnApplication.RecordColumnProperty( - name='ticker_symbol', - sql_type='VARCHAR(4)', - mapping='$.ticker_symbol' - ), kinesisanalytics.CfnApplication.RecordColumnProperty( - name='sector', - sql_type='VARCHAR(16)', - mapping='$.sector' - ), kinesisanalytics.CfnApplication.RecordColumnProperty( - name='change', - sql_type='REAL', - mapping='$.change' - ), kinesisanalytics.CfnApplication.RecordColumnProperty( - name='price', - sql_type='REAL', - mapping='$.price' - )], - record_format=kinesisanalytics.CfnApplication.RecordFormatProperty( - record_format_type='JSON' - ), - record_encoding='UTF-8' - ), - name_prefix='SOURCE_SQL_STREAM' - )] - ) - ) -``` - -Java -``` java -import software.constructs.Construct; -import java.util.List; - -import software.amazon.awscdk.Stack; -import software.amazon.awscdk.StackProps; -import software.amazon.awscdk.services.kinesisanalytics.*; -import software.amazon.awscdk.services.kinesisanalytics.CfnApplication.*; -import software.amazon.awsconstructs.services.kinesisfirehoses3kinesisanalytics.*; - -new KinesisFirehoseToAnalyticsAndS3(this, "FirehoseToS3AndAnalyticsPattern", - new KinesisFirehoseToAnalyticsAndS3Props.Builder() - .kinesisAnalyticsProps(new CfnApplicationProps.Builder() - .inputs(List.of(new InputProperty.Builder() - .inputSchema(new InputSchemaProperty.Builder() - .recordColumns(List.of( - new RecordColumnProperty.Builder() - .name("ticker_symbol") - .sqlType("VARCHAR(4)") - .mapping("$.ticker_symbol") - .build(), - new RecordColumnProperty.Builder() - .name("sector") - .sqlType("VARCHAR(16)") - .mapping("$.sector") - .build(), - new RecordColumnProperty.Builder() - .name("change") - .sqlType("REAL") - .mapping("$.change") - .build(), - new RecordColumnProperty.Builder() - .name("price") - .sqlType("REAL") - .mapping("$.price") - .build())) - .recordFormat(new RecordFormatProperty.Builder() - .recordFormatType("JSON") - .build()) - .recordEncoding("UTF-8") - .build()) - .namePrefix("SOURCE_SQL_STREAM") - .build())) - .build()) - .build()); -``` - -## Pattern Construct Props - -| **Name** | **Type** | **Description** | -|:-------------|:----------------|-----------------| -|kinesisFirehoseProps?|[`kinesisFirehose.CfnDeliveryStreamProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisfirehose.CfnDeliveryStreamProps.html)|Optional user-provided props to override the default props for the Kinesis Firehose delivery stream.| -|kinesisAnalyticsProps?|[`kinesisAnalytics.CfnApplicationProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisanalytics.CfnApplicationProps.html)|Optional user-provided props to override the default props for the Kinesis Analytics application.| -|existingBucketObj?|[`s3.IBucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.IBucket.html)|Existing instance of S3 Bucket object. If this is provided, then also providing bucketProps is an error. | -|bucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html)|User provided props to override the default props for the S3 Bucket.| -|logGroupProps?|[`logs.LogGroupProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_logs.LogGroupProps.html)|User provided props to override the default props for for the CloudWatchLogs LogGroup.| -|loggingBucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html)|Optional user provided props to override the default props for the S3 Logging Bucket.| -|logS3AccessLogs?| boolean|Whether to turn on Access Logging for the S3 bucket. Creates an S3 bucket with associated storage costs for the logs. Enabling Access Logging is a best practice. default - true| - -## Pattern Properties - -| **Name** | **Type** | **Description** | -|:-------------|:----------------|-----------------| -|kinesisAnalytics|[`kinesisAnalytics.CfnApplication`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisanalytics.CfnApplication.html)|Returns an instance of the Kinesis Analytics application created by the pattern.| -|kinesisFirehose|[`kinesisFirehose.CfnDeliveryStream`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisfirehose.CfnDeliveryStream.html)|Returns an instance of the Kinesis Firehose delivery stream created by the pattern.| -|kinesisFirehoseRole|[`iam.Role`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.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/v2/docs/aws-cdk-lib.aws_logs.LogGroup.html)|Returns an instance of the LogGroup created by the construct for Kinesis Data Firehose delivery stream| -|s3Bucket?|[`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html)|Returns an instance of the S3 bucket created by the pattern.| -|s3LoggingBucket?|[`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html)|Returns an instance of s3.Bucket created by the construct as the logging bucket for the primary bucket.| -|s3BucketInterface|[`s3.IBucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.IBucket.html)|Returns an instance of s3.IBucket created by the construct.| - -## Default settings - -Out of the box implementation of the Construct without any override will set the following defaults: - -### 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 - -### Amazon Kinesis Data Analytics -* Configure least privilege access IAM role for Amazon Kinesis Analytics - -## Architecture -![Architecture Diagram](architecture.png) - -*** -© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/architecture.png b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/architecture.png deleted file mode 100644 index 9f9e472d87360ba4a06b8496c403448a98b61774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120293 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

N?1#z#K31Yc@5g z+#>M{g5UZS6DPMJYN&{ZS2N&?4lS)a4G(sD(l|!=Qxa zAb1Z?znL(9nx))Zn;Y2Qw)GwoRs6>9wa_*Lrr-@Q6b*VN9>~l4&HwZ%({H{`3%w1p z1pyj?I<`6Gh$>#pi%HjUGO^;Vo>a&;Llw+Qh}ZCe9Bg+A8^v4yQ{|-l^~aSa*2M#9 z(`tWW{{p%bULD<-@xq~3VG7W{X*=6=qyrux`GCQPa;~l*k|pA>iTyPMv(u0Lwm(0Y zbrSU#%?F3T&+$!uz2h-H8Tlzy3ir-Ns3?1+)@UxBdjZb{`E(?+dv7*!aqf8=%y2lRsHWzT|m;G>}tb#LM}Gqh= zPy~n9tvVjw^L|9>{wMDR8 z1WQ%&tA?V!wzmcwvycT<(irLzx$z)E=Qc`h1?Q@T2K?RP&!$9}(F z6Nkf1o0iLPH6B4Lr|84pl8}_Ow1Vu(gEN!>u8xt|Ug|gQ$a~MwkK?TSn#lUX<4i3}1Q$sPXk^VZpnvHV=8yCAtl#jpDDRs)t8M$(bqs2(8ZeoOt& zXp*>%I7L=~aNCV*>?eUP|4z>zX(;{Q4^{t7|9G!{_1=M9bEWb4$#I)6^uNN~$!R=zMN;ea{>7jH^-kKFKd#u~{ zy?TFX(T^0OgxG_iRmz*Vl@D)cUr`QNRa1f-TmQUk$LfhHN-7RyW|othE>X_Qg!Y65 zGfL>sYY(1uvJMztXo`o&@x0A$I$A*+*TH^54|Mn4!34?wzb;tA(kO)s?ha2&(5*%KxgwdqdND4d=x9Fs@`NRc;G zVph{+W#|NeqPk?_2u#^H!JqxEtAmJfjsMJYw6)za0r@zFOFZIDWckDCM{wsR*Bto%<7*0531(^ zY%a6JEmO~-<+#2;0~}Zsr?1Qm_0e8VxI$OM4YpA|S(n(|Lr;@nR^nEd2pE<8>Pz#X zfNJ$emsN^$<-p%uCo|KL_Ls~1Mqbx${rT^lFQBDn!HN*KHe|BOCQOc@t@)-z?GyPyG=0Em%i7P;tup@e_U6!+AE&5#V$#ENM=oOi+7FKyS8 z1$_I!86RNTe0s=S2zj~ohquiNdKAk!m%QK93f;oW2Q~|jgq&> zQxEZ#5OoidI0A8j(*tf^718>vk`bc-+Y{$qlDSyPZp(!(6xUVjZy30Qi2_R8#m~;o z5l0}fLDQBrW9^P=W!b_FMgWF6Ivx{zlMj(Kb+w_yJ#EC7MEsuK9pXIG)HB;$UN=vom9_lrLOH`o^+}?a87sHoui50> z3z$0&Mbx7L!(xP9xG{a5pqF!N*hNiysYbiaK8z1ZR} zMY@y$df-*N5Pnc0)gY*`k}^P!(MW?4e}&dl;Z#|he<&=!yZ1+d0L%U&t@3pd`es3( zMa75!*_a~bMO4V%fkKKQ#sN`h^R7h1uTbRQ-+z_zD{Mi0D47;xTz*?Y*MchRuK1Mp zxrXoRqY2!u{2XkH+T-mobgdTK;eqUNfdzC4u#~|rN0?FI?BpT|fvdRyV_rHq8xo`0 zLX566f3@@JMF=39nxJP;@LXP&mkD@ISFUD&M+VBm!N@vk94!v*to@Ht0%bSKc*wtE z2~zATV+!W;EK;T>O{GZiFnpm?4mEYEfRWz@Z%wDYKi@V4jTCDjXLF#(MzTG_HB?g8 zIIuK@leoTF-L57p4+&aI$>|)t}4cP&<2pTAwBhFz*i+HB5Dws#s z0UZ3yMH$5v;%yQ=N?iM=ljn2i#5Qhp#jr|~ilqAktHVDv(#(6iq9Ugk(RhZ(G0S`D zj7L2vOOW!+UNhzyf)z+0&)yuD&uhP3G5YL=@VQa6mtFc3XGkimzWu{2YwMRp2W`1! zfp;sQ-j?u>H&oYLDw7v(KTeMRR~D9d`$lsTDA&m1-r1?_U( z@T-1n7E�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 z�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 Q0r&ymy{}QMZvE>204gbGQUCw| diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts deleted file mode 100644 index 7c144a724..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -// Imports -import * as kinesisFirehose from 'aws-cdk-lib/aws-kinesisfirehose'; -import * as kinesisAnalytics from 'aws-cdk-lib/aws-kinesisanalytics'; -import { KinesisFirehoseToS3, KinesisFirehoseToS3Props } from '@aws-solutions-constructs/aws-kinesisfirehose-s3'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as logs from 'aws-cdk-lib/aws-logs'; -import * as iam from 'aws-cdk-lib/aws-iam'; -import * as defaults from '@aws-solutions-constructs/core'; -// Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate -import { Construct } from 'constructs'; - -/** - * The properties for the KinesisFirehoseToAnalyticsAndS3 class. - */ -export interface KinesisFirehoseToAnalyticsAndS3Props { - /** - * Optional user-provided props to override the default props for the Kinesis Firehose delivery stream. - * - * @default - Default props are used. - */ - readonly kinesisFirehoseProps?: kinesisFirehose.CfnDeliveryStreamProps | any, - /** - * Optional user-provided props to override the default props for the Kinesis Analytics application. - * - * @default - Default props are used. - */ - readonly kinesisAnalyticsProps?: kinesisAnalytics.CfnApplicationProps, - /** - * Existing instance of S3 Bucket object, providing both this and `bucketProps` will cause an error. - * - * @default - None - */ - readonly existingBucketObj?: s3.IBucket, - /** - * User provided props to override the default props for the S3 Bucket. - * - * @default - Default props are used - */ - readonly bucketProps?: s3.BucketProps, - /** - * User provided props to override the default props for the CloudWatchLogs LogGroup. - * - * @default - Default props are used - */ - readonly logGroupProps?: logs.LogGroupProps - /** - * Optional user provided props to override the default props for the S3 Logging Bucket. - * - * @default - Default props are used - */ - readonly loggingBucketProps?: s3.BucketProps; - /** - * Whether to turn on Access Logs for the S3 bucket with the associated storage costs. - * Enabling Access Logging is a best practice. - * - * @default - true - */ - readonly logS3AccessLogs?: boolean; -} - -/** - * @summary The KinesisFirehoseToAnalyticsAndS3 class. - */ -export class KinesisFirehoseToAnalyticsAndS3 extends Construct { - public readonly kinesisAnalytics: kinesisAnalytics.CfnApplication; - public readonly kinesisFirehose: kinesisFirehose.CfnDeliveryStream; - public readonly kinesisFirehoseRole: iam.Role; - public readonly kinesisFirehoseLogGroup: logs.LogGroup; - public readonly s3Bucket?: s3.Bucket; - public readonly s3LoggingBucket?: s3.Bucket; - public readonly s3BucketInterface: s3.IBucket; - - /** - * @summary Constructs a new instance of the KinesisFirehoseToAnalyticsAndS3 class. - * @param {cdk.App} scope - represents the scope for all the resources. - * @param {string} id - this is a a scope-unique id. - * @param {KinesisFirehoseToAnalyticsAndS3Props} props - user provided props for the construct - * @since 0.8.0 - * @access public - */ - constructor(scope: Construct, id: string, props: KinesisFirehoseToAnalyticsAndS3Props) { - super(scope, id); - - // All our tests are based upon this behavior being on, so we're setting - // context here rather than assuming the client will set it - this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - - // Setup the kinesisfirehose-s3 pattern - const kinesisFirehoseToS3Props: KinesisFirehoseToS3Props = { - kinesisFirehoseProps: props.kinesisFirehoseProps, - existingBucketObj: props.existingBucketObj, - bucketProps: props.bucketProps, - logGroupProps: props.logGroupProps, - loggingBucketProps: props.loggingBucketProps, - logS3AccessLogs: props.logS3AccessLogs - }; - - // Add the kinesisfirehose-s3 pattern - const kfs = new KinesisFirehoseToS3(this, 'KinesisFirehoseToS3', kinesisFirehoseToS3Props); - - // Add the Kinesis Analytics application - this.kinesisAnalytics = defaults.buildKinesisAnalyticsApp(this, { - kinesisFirehose: kfs.kinesisFirehose, - kinesisAnalyticsProps: props.kinesisAnalyticsProps - }); - - this.kinesisFirehose = kfs.kinesisFirehose; - this.kinesisFirehoseLogGroup = kfs.kinesisFirehoseLogGroup; - this.kinesisFirehoseRole = kfs.kinesisFirehoseRole; - this.s3Bucket = kfs.s3Bucket; - this.s3LoggingBucket = kfs.s3LoggingBucket; - this.s3BucketInterface = kfs.s3BucketInterface; - } -} \ No newline at end of file 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 deleted file mode 100644 index 21cde97d4..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "name": "@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics", - "version": "0.0.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", - "repository": { - "type": "git", - "url": "https://github.com/awslabs/aws-solutions-constructs.git", - "directory": "source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics" - }, - "author": { - "name": "Amazon Web Services", - "url": "https://aws.amazon.com", - "organization": true - }, - "license": "Apache-2.0", - "scripts": { - "build": "tsc -b .", - "lint": "eslint -c ../eslintrc.yml --ext=.js,.ts . && tslint --project .", - "lint-fix": "eslint -c ../eslintrc.yml --ext=.js,.ts --fix .", - "test": "jest --coverage", - "clean": "tsc -b --clean", - "watch": "tsc -b -w", - "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert-v2", - "integ-no-clean": "cdk-integ --no-clean", - "jsii": "jsii", - "jsii-pacmak": "jsii-pacmak", - "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", - "snapshot-update": "npm run jsii && npm test -- -u && npm run integ-assert" - }, - "jsii": { - "outdir": "dist", - "targets": { - "java": { - "package": "software.amazon.awsconstructs.services.kinesisfirehoses3kinesisanalytics", - "maven": { - "groupId": "software.amazon.awsconstructs", - "artifactId": "kinesisfirehoses3kinesisanalytics" - } - }, - "dotnet": { - "namespace": "Amazon.SolutionsConstructs.AWS.KinesisFirehoseS3KinesisAnalytics", - "packageId": "Amazon.SolutionsConstructs.AWS.KinesisFirehoseS3KinesisAnalytics", - "signAssembly": true, - "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" - }, - "python": { - "distName": "aws-solutions-constructs.aws-kinesis-firehose-s3-kinesis-analytics", - "module": "aws_solutions_constructs.aws_kinesis_firehose_s3_kinesis_analytics" - } - } - }, - "dependencies": { - "@aws-cdk/aws-iam": "0.0.0", - "@aws-cdk/aws-kinesis": "0.0.0", - "@aws-cdk/aws-kinesisanalytics": "0.0.0", - "@aws-cdk/aws-kinesisfirehose": "0.0.0", - "@aws-cdk/aws-s3": "0.0.0", - "@aws-cdk/aws-logs": "0.0.0", - "@aws-cdk/core": "0.0.0", - "@aws-solutions-constructs/core": "0.0.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "0.0.0", - "constructs": "^3.2.0" - }, - "devDependencies": { - "@types/jest": "^27.4.0", - "@types/node": "^10.3.0" - }, - "jest": { - "moduleFileExtensions": [ - "js" - ], - "coverageReporters": [ - "text", - [ - "lcov", - { - "projectRoot": "../../../../" - } - ] - ] - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "0.0.0", - "@aws-cdk/aws-kinesis": "0.0.0", - "@aws-cdk/aws-kinesisanalytics": "0.0.0", - "@aws-cdk/aws-kinesisfirehose": "0.0.0", - "@aws-cdk/aws-s3": "0.0.0", - "@aws-cdk/core": "0.0.0", - "@aws-solutions-constructs/core": "0.0.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "0.0.0", - "constructs": "^3.2.0", - "@aws-cdk/aws-logs": "0.0.0" - }, - "keywords": [ - "aws", - "cdk", - "awscdk", - "AWS Solutions Constructs", - "Amazon S3", - "Amazon Kinesis Data Firehose", - "Amazon Kinesis Data Analytics" - ] -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json deleted file mode 100644 index c57d17329..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json +++ /dev/null @@ -1,535 +0,0 @@ -{ - "Resources": { - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "BucketName": "custom-logging-bucket", - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W35", - "reason": "This S3 bucket is used as the access logging bucket for another bucket" - } - ] - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketPolicy7DF00567": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "s3:PutObject", - "Condition": { - "ArnLike": { - "aws:SourceArn": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - } - }, - "StringEquals": { - "aws:SourceAccount": { - "Ref": "AWS::AccountId" - } - } - }, - "Effect": "Allow", - "Principal": { - "Service": "logging.s3.amazonaws.com" - }, - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A", - "Arn" - ] - }, - "/*" - ] - ] - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A" - } - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete" - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketPolicy55E9C081": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F": { - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" - }, - { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" - } - ] - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2": { - "Type": "AWS::Logs::LogStream", - "Properties": { - "LogGroupName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - } - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "firehose.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehosePolicy9CE17DCF": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - "s3:ListBucketMultipartUploads", - "s3:PutObject" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "logs:PutLogEvents", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":logs:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":log-group:", - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - }, - ":log-stream:", - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2" - } - ] - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehosePolicy9CE17DCF", - "Roles": [ - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC" - } - ] - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007": { - "Type": "AWS::KinesisFirehose::DeliveryStream", - "Properties": { - "DeliveryStreamEncryptionConfigurationInput": { - "KeyType": "AWS_OWNED_CMK" - }, - "DeliveryStreamName": "KinesisFirehosecustomLoggingBuckicss3KinesisFirehoseToS3E91CB2F9", - "ExtendedS3DestinationConfiguration": { - "BucketARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "BufferingHints": { - "IntervalInSeconds": 300, - "SizeInMBs": 5 - }, - "CloudWatchLoggingOptions": { - "Enabled": true, - "LogGroupName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - }, - "LogStreamName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2" - } - }, - "CompressionFormat": "GZIP", - "EncryptionConfiguration": { - "KMSEncryptionConfig": { - "AWSKMSKeyARN": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":kms:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":alias/aws/s3" - ] - ] - } - } - }, - "RoleARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC", - "Arn" - ] - } - } - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "kinesisanalytics.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "firehose:DescribeDeliveryStream", - "firehose:Get*" - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007", - "Arn" - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF", - "Roles": [ - { - "Ref": "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD" - } - ] - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalytics0C0663D4": { - "Type": "AWS::KinesisAnalytics::Application", - "Properties": { - "Inputs": [ - { - "InputSchema": { - "RecordColumns": [ - { - "Mapping": "$.ticker_symbol", - "Name": "ticker_symbol", - "SqlType": "VARCHAR(4)" - }, - { - "Mapping": "$.sector", - "Name": "sector", - "SqlType": "VARCHAR(16)" - }, - { - "Mapping": "$.change", - "Name": "change", - "SqlType": "REAL" - }, - { - "Mapping": "$.price", - "Name": "price", - "SqlType": "REAL" - } - ], - "RecordEncoding": "UTF-8", - "RecordFormat": { - "RecordFormatType": "JSON" - } - }, - "KinesisFirehoseInput": { - "ResourceARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007", - "Arn" - ] - }, - "RoleARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD", - "Arn" - ] - } - }, - "NamePrefix": "SOURCE_SQL_STREAM" - } - ] - }, - "DependsOn": [ - "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF" - ] - } - }, - "Parameters": { - "BootstrapVersion": { - "Type": "AWS::SSM::Parameter::Value", - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" - } - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5" - ], - { - "Ref": "BootstrapVersion" - } - ] - } - ] - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." - } - ] - } - } -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.ts deleted file mode 100644 index 1256be540..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -/// !cdk-integ * -import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; -import { BucketEncryption } from "aws-cdk-lib/aws-s3"; -import { KinesisFirehoseToAnalyticsAndS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; - -const app = new App(); - -// Empty arguments -const stack = new Stack(app, generateIntegStackName(__filename)); - -new KinesisFirehoseToAnalyticsAndS3(stack, 'test-kinesisfirehose-analytics-s3', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ticker_symbol', - sqlType: 'VARCHAR(4)', - mapping: '$.ticker_symbol' - }, { - name: 'sector', - sqlType: 'VARCHAR(16)', - mapping: '$.sector' - }, { - name: 'change', - sqlType: 'REAL', - mapping: '$.change' - }, { - name: 'price', - sqlType: 'REAL', - mapping: '$.price' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - }, - loggingBucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - bucketName: 'custom-logging-bucket', - encryption: BucketEncryption.S3_MANAGED, - versioned: true - } -}); - -app.synth(); \ No newline at end of file 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 deleted file mode 100644 index b7f3ed208..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json +++ /dev/null @@ -1,534 +0,0 @@ -{ - "Resources": { - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W35", - "reason": "This S3 bucket is used as the access logging bucket for another bucket" - } - ] - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucketPolicy2D8B2B71": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "s3:PutObject", - "Condition": { - "ArnLike": { - "aws:SourceArn": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - } - }, - "StringEquals": { - "aws:SourceAccount": { - "Ref": "AWS::AccountId" - } - } - }, - "Effect": "Allow", - "Principal": { - "Service": "logging.s3.amazonaws.com" - }, - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000", - "Arn" - ] - }, - "/*" - ] - ] - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000" - } - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete" - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketPolicyAD03F319": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroup7E569B76": { - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" - }, - { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" - } - ] - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroupfirehoselogstream98C70102": { - "Type": "AWS::Logs::LogStream", - "Properties": { - "LogGroupName": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroup7E569B76" - } - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehoseRoleE7F8ADDA": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "firehose.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehosePolicy8E134001": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - "s3:ListBucketMultipartUploads", - "s3:PutObject" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "logs:PutLogEvents", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":logs:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":log-group:", - { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroup7E569B76" - }, - ":log-stream:", - { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroupfirehoselogstream98C70102" - } - ] - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehosePolicy8E134001", - "Roles": [ - { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehoseRoleE7F8ADDA" - } - ] - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehose86F339C4": { - "Type": "AWS::KinesisFirehose::DeliveryStream", - "Properties": { - "DeliveryStreamEncryptionConfigurationInput": { - "KeyType": "AWS_OWNED_CMK" - }, - "DeliveryStreamName": "KinesisFirehosenoargumentstestfistackKinesisFirehoseToS38B072B5E", - "ExtendedS3DestinationConfiguration": { - "BucketARN": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - "BufferingHints": { - "IntervalInSeconds": 300, - "SizeInMBs": 5 - }, - "CloudWatchLoggingOptions": { - "Enabled": true, - "LogGroupName": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroup7E569B76" - }, - "LogStreamName": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroupfirehoselogstream98C70102" - } - }, - "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", - "Arn" - ] - } - } - } - }, - "testfirehoses3andanalyticsstackKinesisAnalyticsRole7217C4CC": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "kinesisanalytics.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testfirehoses3andanalyticsstackKinesisAnalyticsPolicy2594304F": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "firehose:DescribeDeliveryStream", - "firehose:Get*" - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehose86F339C4", - "Arn" - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testfirehoses3andanalyticsstackKinesisAnalyticsPolicy2594304F", - "Roles": [ - { - "Ref": "testfirehoses3andanalyticsstackKinesisAnalyticsRole7217C4CC" - } - ] - } - }, - "testfirehoses3andanalyticsstackKinesisAnalytics20F3845E": { - "Type": "AWS::KinesisAnalytics::Application", - "Properties": { - "Inputs": [ - { - "InputSchema": { - "RecordColumns": [ - { - "Mapping": "$.ticker_symbol", - "Name": "ticker_symbol", - "SqlType": "VARCHAR(4)" - }, - { - "Mapping": "$.sector", - "Name": "sector", - "SqlType": "VARCHAR(16)" - }, - { - "Mapping": "$.change", - "Name": "change", - "SqlType": "REAL" - }, - { - "Mapping": "$.price", - "Name": "price", - "SqlType": "REAL" - } - ], - "RecordEncoding": "UTF-8", - "RecordFormat": { - "RecordFormatType": "JSON" - } - }, - "KinesisFirehoseInput": { - "ResourceARN": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehose86F339C4", - "Arn" - ] - }, - "RoleARN": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisAnalyticsRole7217C4CC", - "Arn" - ] - } - }, - "NamePrefix": "SOURCE_SQL_STREAM" - } - ] - }, - "DependsOn": [ - "testfirehoses3andanalyticsstackKinesisAnalyticsPolicy2594304F" - ] - } - }, - "Parameters": { - "BootstrapVersion": { - "Type": "AWS::SSM::Parameter::Value", - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" - } - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5" - ], - { - "Ref": "BootstrapVersion" - } - ] - } - ] - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." - } - ] - } - } -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.ts deleted file mode 100644 index e1d327d7d..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -// Imports -import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; -import { KinesisFirehoseToAnalyticsAndS3, KinesisFirehoseToAnalyticsAndS3Props } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; - -// Setup -const app = new App(); -const stack = new Stack(app, generateIntegStackName(__filename)); - -// Definitions -const props: KinesisFirehoseToAnalyticsAndS3Props = { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ticker_symbol', - sqlType: 'VARCHAR(4)', - mapping: '$.ticker_symbol' - }, { - name: 'sector', - sqlType: 'VARCHAR(16)', - mapping: '$.sector' - }, { - name: 'change', - sqlType: 'REAL', - mapping: '$.change' - }, { - name: 'price', - sqlType: 'REAL', - mapping: '$.price' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - } -}; - -new KinesisFirehoseToAnalyticsAndS3(stack, 'test-firehose-s3-and-analytics-stack', props); - -// Synth -app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.expected.json deleted file mode 100644 index ad316b46d..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.expected.json +++ /dev/null @@ -1,421 +0,0 @@ -{ - "Resources": { - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W35", - "reason": "This S3 bucket is created for unit/ integration testing purposes only." - } - ] - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketPolicy55E9C081": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F": { - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" - }, - { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" - } - ] - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2": { - "Type": "AWS::Logs::LogStream", - "Properties": { - "LogGroupName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - } - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "firehose.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehosePolicy9CE17DCF": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - "s3:ListBucketMultipartUploads", - "s3:PutObject" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "logs:PutLogEvents", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":logs:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":log-group:", - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - }, - ":log-stream:", - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2" - } - ] - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehosePolicy9CE17DCF", - "Roles": [ - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC" - } - ] - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007": { - "Type": "AWS::KinesisFirehose::DeliveryStream", - "Properties": { - "DeliveryStreamEncryptionConfigurationInput": { - "KeyType": "AWS_OWNED_CMK" - }, - "DeliveryStreamName": "KinesisFirehosenoLoggingBucketteicss3KinesisFirehoseToS3EAC1AA77", - "ExtendedS3DestinationConfiguration": { - "BucketARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "BufferingHints": { - "IntervalInSeconds": 300, - "SizeInMBs": 5 - }, - "CloudWatchLoggingOptions": { - "Enabled": true, - "LogGroupName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - }, - "LogStreamName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2" - } - }, - "CompressionFormat": "GZIP", - "EncryptionConfiguration": { - "KMSEncryptionConfig": { - "AWSKMSKeyARN": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":kms:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":alias/aws/s3" - ] - ] - } - } - }, - "RoleARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC", - "Arn" - ] - } - } - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "kinesisanalytics.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "firehose:DescribeDeliveryStream", - "firehose:Get*" - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007", - "Arn" - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF", - "Roles": [ - { - "Ref": "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD" - } - ] - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalytics0C0663D4": { - "Type": "AWS::KinesisAnalytics::Application", - "Properties": { - "Inputs": [ - { - "InputSchema": { - "RecordColumns": [ - { - "Mapping": "$.ticker_symbol", - "Name": "ticker_symbol", - "SqlType": "VARCHAR(4)" - }, - { - "Mapping": "$.sector", - "Name": "sector", - "SqlType": "VARCHAR(16)" - }, - { - "Mapping": "$.change", - "Name": "change", - "SqlType": "REAL" - }, - { - "Mapping": "$.price", - "Name": "price", - "SqlType": "REAL" - } - ], - "RecordEncoding": "UTF-8", - "RecordFormat": { - "RecordFormatType": "JSON" - } - }, - "KinesisFirehoseInput": { - "ResourceARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007", - "Arn" - ] - }, - "RoleARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD", - "Arn" - ] - } - }, - "NamePrefix": "SOURCE_SQL_STREAM" - } - ] - }, - "DependsOn": [ - "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF" - ] - } - }, - "Parameters": { - "BootstrapVersion": { - "Type": "AWS::SSM::Parameter::Value", - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" - } - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5" - ], - { - "Ref": "BootstrapVersion" - } - ] - } - ] - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." - } - ] - } - } -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.ts deleted file mode 100644 index 143883d58..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -/// !cdk-integ * -import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; -import { KinesisFirehoseToAnalyticsAndS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; -import * as s3 from "aws-cdk-lib/aws-s3"; -import * as defaults from '@aws-solutions-constructs/core'; - -const app = new App(); - -// Empty arguments -const stack = new Stack(app, generateIntegStackName(__filename)); - -const construct = new KinesisFirehoseToAnalyticsAndS3(stack, 'test-kinesisfirehose-analytics-s3', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ticker_symbol', - sqlType: 'VARCHAR(4)', - mapping: '$.ticker_symbol' - }, { - name: 'sector', - sqlType: 'VARCHAR(16)', - mapping: '$.sector' - }, { - name: 'change', - sqlType: 'REAL', - mapping: '$.change' - }, { - name: 'price', - sqlType: 'REAL', - mapping: '$.price' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - }, - logS3AccessLogs: false -}); - -const s3Bucket = construct.s3Bucket as s3.Bucket; - -defaults.addCfnSuppressRules(s3Bucket, [ - { id: 'W35', - reason: 'This S3 bucket is created for unit/ integration testing purposes only.' }, -]); - -app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts deleted file mode 100644 index 89adcdd84..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts +++ /dev/null @@ -1,215 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -// Imports -import { Stack, RemovalPolicy } from 'aws-cdk-lib'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import { KinesisFirehoseToAnalyticsAndS3, KinesisFirehoseToAnalyticsAndS3Props } from '../lib'; -import { Template } from 'aws-cdk-lib/assertions'; - -// -------------------------------------------------------------- -// Test Case 2 - Test the getter methods -// -------------------------------------------------------------- -test('Test properties', () => { - // Initial Setup - const stack = new Stack(); - const props: KinesisFirehoseToAnalyticsAndS3Props = { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ts', - sqlType: 'TIMESTAMP', - mapping: '$.timestamp' - }, { - name: 'trip_id', - sqlType: 'VARCHAR(64)', - mapping: '$.trip_id' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - } - }; - const app = new KinesisFirehoseToAnalyticsAndS3(stack, 'test-kinesis-firehose-kinesis-analytics', props); - // Assertions - expect(app.kinesisAnalytics).toBeDefined(); - expect(app.kinesisFirehose).toBeDefined(); - expect(app.kinesisFirehoseRole).toBeDefined(); - expect(app.kinesisFirehoseLogGroup).toBeDefined(); - expect(app.s3Bucket).toBeDefined(); - expect(app.s3LoggingBucket).toBeDefined(); -}); - -// -------------------------------------------------------------- -// Test Case 3 - Override kinesisFirehose props -// -------------------------------------------------------------- -test('test kinesisFirehose override ', () => { - const stack = new Stack(); - - new KinesisFirehoseToAnalyticsAndS3(stack, 'test-firehose-s3', { - kinesisFirehoseProps: { - extendedS3DestinationConfiguration: { - bufferingHints: { - intervalInSeconds: 600, - sizeInMBs: 55 - }, - } - }, - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ts', - sqlType: 'TIMESTAMP', - mapping: '$.timestamp' - }, { - name: 'trip_id', - sqlType: 'VARCHAR(64)', - mapping: '$.trip_id' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - } - }); - - const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::KinesisFirehose::DeliveryStream", { - ExtendedS3DestinationConfiguration: { - BufferingHints: { - IntervalInSeconds: 600, - SizeInMBs: 55 - } - } - }); -}); - -// -------------------------------------------------------------- -// Test bad call with existingBucket and bucketProps -// -------------------------------------------------------------- -test("Confirm CheckS3Props is being called", () => { - // Stack - const stack = new Stack(); - - const testBucket = new s3.Bucket(stack, 'test-bucket', {}); - - const app = () => { - // Helper declaration - new KinesisFirehoseToAnalyticsAndS3(stack, "bad-s3-args", { - existingBucketObj: testBucket, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY - }, - }); - }; - // Assertion - expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); -}); - -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- -test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { - const stack = new Stack(); - - new KinesisFirehoseToAnalyticsAndS3(stack, 'kinsisfirehose-s3-analytics', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ts', - sqlType: 'TIMESTAMP', - mapping: '$.timestamp' - }, { - name: 'trip_id', - sqlType: 'VARCHAR(64)', - mapping: '$.trip_id' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - loggingBucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - autoDeleteObjects: true - } - }); - - const template = Template.fromStack(stack); - template.resourceCountIs("AWS::S3::Bucket", 2); - - template.hasResourceProperties("Custom::S3AutoDeleteObjects", { - ServiceToken: { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn" - ] - }, - BucketName: { - Ref: "kinsisfirehoses3analyticsKinesisFirehoseToS3S3LoggingBucket6EE455EF" - } - }); -}); - -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- -test('s3 bucket with one content bucket and no logging bucket', () => { - const stack = new Stack(); - - new KinesisFirehoseToAnalyticsAndS3(stack, 'kinsisfirehose-s3-analytics', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ts', - sqlType: 'TIMESTAMP', - mapping: '$.timestamp' - }, { - name: 'trip_id', - sqlType: 'VARCHAR(64)', - mapping: '$.trip_id' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - kinesisFirehoseProps: { - deliveryStreamType: 'KinesisStreamAsSource' - }, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - }, - logS3AccessLogs: false - }); - - const template = Template.fromStack(stack); - template.resourceCountIs("AWS::S3::Bucket", 1); -}); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/lambda/index.js b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/lambda/index.js deleted file mode 100644 index 5844e65a2..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/lambda/index.js +++ /dev/null @@ -1,8 +0,0 @@ -exports.handler = async function(event) { - console.log('request:', JSON.stringify(event, undefined, 2)); - return { - statusCode: 200, - headers: { 'Content-Type': 'text/plain' }, - body: `//stub//` - }; - }; \ No newline at end of file