@aws-cdk/aws-redshift-alpha 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.jsii +6985 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +2 -0
  4. package/README.md +247 -0
  5. package/lib/cluster.d.ts +454 -0
  6. package/lib/cluster.js +231 -0
  7. package/lib/database-options.d.ts +30 -0
  8. package/lib/database-options.js +3 -0
  9. package/lib/database-secret.d.ts +35 -0
  10. package/lib/database-secret.js +32 -0
  11. package/lib/endpoint.d.ts +31 -0
  12. package/lib/endpoint.js +28 -0
  13. package/lib/index.d.ts +8 -0
  14. package/lib/index.js +22 -0
  15. package/lib/parameter-group.d.ts +72 -0
  16. package/lib/parameter-group.js +52 -0
  17. package/lib/private/database-query-provider/handler-name.d.ts +5 -0
  18. package/lib/private/database-query-provider/handler-name.js +10 -0
  19. package/lib/private/database-query-provider/index.d.ts +2 -0
  20. package/lib/private/database-query-provider/index.js +21 -0
  21. package/lib/private/database-query-provider/privileges.d.ts +6 -0
  22. package/lib/private/database-query-provider/privileges.js +57 -0
  23. package/lib/private/database-query-provider/table.d.ts +6 -0
  24. package/lib/private/database-query-provider/table.js +56 -0
  25. package/lib/private/database-query-provider/user.d.ts +9 -0
  26. package/lib/private/database-query-provider/user.js +69 -0
  27. package/lib/private/database-query-provider/util.d.ts +4 -0
  28. package/lib/private/database-query-provider/util.js +41 -0
  29. package/lib/private/database-query.d.ts +24 -0
  30. package/lib/private/database-query.js +78 -0
  31. package/lib/private/handler-props.d.ts +26 -0
  32. package/lib/private/handler-props.js +3 -0
  33. package/lib/private/privileges.d.ts +48 -0
  34. package/lib/private/privileges.js +64 -0
  35. package/lib/redshift-canned-metrics.generated.d.ts +192 -0
  36. package/lib/redshift-canned-metrics.generated.js +161 -0
  37. package/lib/subnet-group.d.ts +74 -0
  38. package/lib/subnet-group.js +49 -0
  39. package/lib/table.d.ts +241 -0
  40. package/lib/table.js +104 -0
  41. package/lib/user.d.ts +174 -0
  42. package/lib/user.js +102 -0
  43. package/package.json +124 -0
  44. package/rosetta/cluster.ts-fixture +21 -0
  45. package/rosetta/default.ts-fixture +12 -0
package/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
package/NOTICE ADDED
@@ -0,0 +1,2 @@
1
+ AWS Cloud Development Kit (AWS CDK)
2
+ Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
package/README.md ADDED
@@ -0,0 +1,247 @@
1
+ # Amazon Redshift Construct Library
2
+ <!--BEGIN STABILITY BANNER-->
3
+
4
+ ---
5
+
6
+ ![cfn-resources: Stable](https://img.shields.io/badge/cfn--resources-stable-success.svg?style=for-the-badge)
7
+
8
+ > All classes with the `Cfn` prefix in this module ([CFN Resources]) are always stable and safe to use.
9
+ >
10
+ > [CFN Resources]: https://docs.aws.amazon.com/cdk/latest/guide/constructs.html#constructs_lib
11
+
12
+ ![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)
13
+
14
+ > The APIs of higher level constructs in this module are experimental and under active development.
15
+ > They are subject to non-backward compatible changes or removal in any future version. These are
16
+ > not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be
17
+ > announced in the release notes. This means that while you may use them, you may need to update
18
+ > your source code when upgrading to a newer version of this package.
19
+
20
+ ---
21
+
22
+ <!--END STABILITY BANNER-->
23
+
24
+ ## Starting a Redshift Cluster Database
25
+
26
+ To set up a Redshift cluster, define a `Cluster`. It will be launched in a VPC.
27
+ You can specify a VPC, otherwise one will be created. The nodes are always launched in private subnets and are encrypted by default.
28
+
29
+ ```ts
30
+ import * as ec2 from '@aws-cdk/aws-ec2';
31
+
32
+ const vpc = new ec2.Vpc(this, 'Vpc');
33
+ const cluster = new Cluster(this, 'Redshift', {
34
+ masterUser: {
35
+ masterUsername: 'admin',
36
+ },
37
+ vpc
38
+ });
39
+ ```
40
+
41
+ By default, the master password will be generated and stored in AWS Secrets Manager.
42
+
43
+ A default database named `default_db` will be created in the cluster. To change the name of this database set the `defaultDatabaseName` attribute in the constructor properties.
44
+
45
+ By default, the cluster will not be publicly accessible.
46
+ Depending on your use case, you can make the cluster publicly accessible with the `publiclyAccessible` property.
47
+
48
+ ## Connecting
49
+
50
+ To control who can access the cluster, use the `.connections` attribute. Redshift Clusters have
51
+ a default port, so you don't need to specify the port:
52
+
53
+ ```ts fixture=cluster
54
+ cluster.connections.allowDefaultPortFromAnyIpv4('Open to the world');
55
+ ```
56
+
57
+ The endpoint to access your database cluster will be available as the `.clusterEndpoint` attribute:
58
+
59
+ ```ts fixture=cluster
60
+ cluster.clusterEndpoint.socketAddress; // "HOSTNAME:PORT"
61
+ ```
62
+
63
+ ## Rotating credentials
64
+
65
+ When the master password is generated and stored in AWS Secrets Manager, it can be rotated automatically:
66
+
67
+ ```ts fixture=cluster
68
+ cluster.addRotationSingleUser(); // Will rotate automatically after 30 days
69
+ ```
70
+
71
+ The multi user rotation scheme is also available:
72
+
73
+ ```ts fixture=cluster
74
+ import * as secretsmanager from '@aws-cdk/aws-secretsmanager';
75
+
76
+ cluster.addRotationMultiUser('MyUser', {
77
+ secret: secretsmanager.Secret.fromSecretNameV2(this, 'Imported Secret', 'my-secret'),
78
+ });
79
+ ```
80
+
81
+ ## Database Resources
82
+
83
+ This module allows for the creation of non-CloudFormation database resources such as users
84
+ and tables. This allows you to manage identities, permissions, and stateful resources
85
+ within your Redshift cluster from your CDK application.
86
+
87
+ Because these resources are not available in CloudFormation, this library leverages
88
+ [custom
89
+ resources](https://docs.aws.amazon.com/cdk/api/latest/docs/custom-resources-readme.html)
90
+ to manage them. In addition to the IAM permissions required to make Redshift service
91
+ calls, the execution role for the custom resource handler requires database credentials to
92
+ create resources within the cluster.
93
+
94
+ These database credentials can be supplied explicitly through the `adminUser` properties
95
+ of the various database resource constructs. Alternatively, the credentials can be
96
+ automatically pulled from the Redshift cluster's default administrator
97
+ credentials. However, this option is only available if the password for the credentials
98
+ was generated by the CDK application (ie., no value vas provided for [the `masterPassword`
99
+ property](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-redshift.Login.html#masterpasswordspan-classapi-icon-api-icon-experimental-titlethis-api-element-is-experimental-it-may-change-without-noticespan)
100
+ of
101
+ [`Cluster.masterUser`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-redshift.Cluster.html#masteruserspan-classapi-icon-api-icon-experimental-titlethis-api-element-is-experimental-it-may-change-without-noticespan)).
102
+
103
+ ### Creating Users
104
+
105
+ Create a user within a Redshift cluster database by instantiating a `User` construct. This
106
+ will generate a username and password, store the credentials in a [AWS Secrets Manager
107
+ `Secret`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-secretsmanager.Secret.html),
108
+ and make a query to the Redshift cluster to create a new database user with the
109
+ credentials.
110
+
111
+ ```ts fixture=cluster
112
+ new User(this, 'User', {
113
+ cluster: cluster,
114
+ databaseName: 'databaseName',
115
+ });
116
+ ```
117
+
118
+ By default, the user credentials are encrypted with your AWS account's default Secrets
119
+ Manager encryption key. You can specify the encryption key used for this purpose by
120
+ supplying a key in the `encryptionKey` property.
121
+
122
+ ```ts fixture=cluster
123
+ import * as kms from '@aws-cdk/aws-kms';
124
+
125
+ const encryptionKey = new kms.Key(this, 'Key');
126
+ new User(this, 'User', {
127
+ encryptionKey: encryptionKey,
128
+ cluster: cluster,
129
+ databaseName: 'databaseName',
130
+ });
131
+ ```
132
+
133
+ By default, a username is automatically generated from the user construct ID and its path
134
+ in the construct tree. You can specify a particular username by providing a value for the
135
+ `username` property. Usernames must be valid identifiers; see: [Names and
136
+ identifiers](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html) in the *Amazon
137
+ Redshift Database Developer Guide*.
138
+
139
+ ```ts fixture=cluster
140
+ new User(this, 'User', {
141
+ username: 'myuser',
142
+ cluster: cluster,
143
+ databaseName: 'databaseName',
144
+ });
145
+ ```
146
+
147
+ The user password is generated by AWS Secrets Manager using the default configuration
148
+ found in
149
+ [`secretsmanager.SecretStringGenerator`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-secretsmanager.SecretStringGenerator.html),
150
+ except with password length `30` and some SQL-incompliant characters excluded. The
151
+ plaintext for the password will never be present in the CDK application; instead, a
152
+ [CloudFormation Dynamic
153
+ Reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html)
154
+ will be used wherever the password value is required.
155
+
156
+ ### Creating Tables
157
+
158
+ Create a table within a Redshift cluster database by instantiating a `Table`
159
+ construct. This will make a query to the Redshift cluster to create a new database table
160
+ with the supplied schema.
161
+
162
+ ```ts fixture=cluster
163
+ new Table(this, 'Table', {
164
+ tableColumns: [{ name: 'col1', dataType: 'varchar(4)' }, { name: 'col2', dataType: 'float' }],
165
+ cluster: cluster,
166
+ databaseName: 'databaseName',
167
+ });
168
+ ```
169
+
170
+ ### Granting Privileges
171
+
172
+ You can give a user privileges to perform certain actions on a table by using the
173
+ `Table.grant()` method.
174
+
175
+ ```ts fixture=cluster
176
+ const user = new User(this, 'User', {
177
+ cluster: cluster,
178
+ databaseName: 'databaseName',
179
+ });
180
+ const table = new Table(this, 'Table', {
181
+ tableColumns: [{ name: 'col1', dataType: 'varchar(4)' }, { name: 'col2', dataType: 'float' }],
182
+ cluster: cluster,
183
+ databaseName: 'databaseName',
184
+ });
185
+
186
+ table.grant(user, TableAction.DROP, TableAction.SELECT);
187
+ ```
188
+
189
+ Take care when managing privileges via the CDK, as attempting to manage a user's
190
+ privileges on the same table in multiple CDK applications could lead to accidentally
191
+ overriding these permissions. Consider the following two CDK applications which both refer
192
+ to the same user and table. In application 1, the resources are created and the user is
193
+ given `INSERT` permissions on the table:
194
+
195
+ ```ts fixture=cluster
196
+ const databaseName = 'databaseName';
197
+ const username = 'myuser'
198
+ const tableName = 'mytable'
199
+
200
+ const user = new User(this, 'User', {
201
+ username: username,
202
+ cluster: cluster,
203
+ databaseName: databaseName,
204
+ });
205
+ const table = new Table(this, 'Table', {
206
+ tableColumns: [{ name: 'col1', dataType: 'varchar(4)' }, { name: 'col2', dataType: 'float' }],
207
+ cluster: cluster,
208
+ databaseName: databaseName,
209
+ });
210
+ table.grant(user, TableAction.INSERT);
211
+ ```
212
+
213
+ In application 2, the resources are imported and the user is given `INSERT` permissions on
214
+ the table:
215
+
216
+ ```ts fixture=cluster
217
+ const databaseName = 'databaseName';
218
+ const username = 'myuser'
219
+ const tableName = 'mytable'
220
+
221
+ const user = User.fromUserAttributes(this, 'User', {
222
+ username: username,
223
+ password: SecretValue.plainText('NOT_FOR_PRODUCTION'),
224
+ cluster: cluster,
225
+ databaseName: databaseName,
226
+ });
227
+ const table = Table.fromTableAttributes(this, 'Table', {
228
+ tableName: tableName,
229
+ tableColumns: [{ name: 'col1', dataType: 'varchar(4)' }, { name: 'col2', dataType: 'float' }],
230
+ cluster: cluster,
231
+ databaseName: 'databaseName',
232
+ });
233
+ table.grant(user, TableAction.INSERT);
234
+ ```
235
+
236
+ Both applications attempt to grant the user the appropriate privilege on the table by
237
+ submitting a `GRANT USER` SQL query to the Redshift cluster. Note that the latter of these
238
+ two calls will have no effect since the user has already been granted the privilege.
239
+
240
+ Now, if application 1 were to remove the call to `grant`, a `REVOKE USER` SQL query is
241
+ submitted to the Redshift cluster. In general, application 1 does not know that
242
+ application 2 has also granted this permission and thus cannot decide not to issue the
243
+ revocation. This leads to the undesirable state where application 2 still contains the
244
+ call to `grant` but the user does not have the specified permission.
245
+
246
+ Note that this does not occur when duplicate privileges are granted within the same
247
+ application, as such privileges are de-duplicated before any SQL query is submitted.