@@ -4,6 +4,7 @@ import iam = require('@aws-cdk/aws-iam');
4
4
import rds = require( '@aws-cdk/aws-rds' ) ;
5
5
import ssm = require( '@aws-cdk/aws-ssm' ) ;
6
6
import s3 = require( '@aws-cdk/aws-s3' ) ;
7
+ import s3assets = require( '@aws-cdk/aws-s3-assets' ) ;
7
8
import fs = require( 'fs' ) ;
8
9
9
10
@@ -16,6 +17,10 @@ export class BaselineStack extends cdk.Stack {
16
17
public readonly chemblDBSecret : rds . DatabaseSecret ;
17
18
public readonly OpenTargetsSourceBucket : s3 . Bucket ;
18
19
public readonly Vpc : ec2 . Vpc ;
20
+ public readonly BindingDBSourceBucket : s3 . Bucket ;
21
+ public readonly BindingDb : rds . DatabaseInstance ;
22
+ public readonly BindingDBAccessSg : ec2 . SecurityGroup ;
23
+ public readonly BindingDBSecret : rds . DatabaseSecret ;
19
24
20
25
constructor ( scope : cdk . Construct , id : string , props ?: cdk . StackProps ) {
21
26
@@ -166,6 +171,119 @@ export class BaselineStack extends cdk.Stack {
166
171
openTargetsSourceFileTargetBucketLocation : [ openTargetsBucket . bucketName ]
167
172
} ) ;
168
173
174
+ //// Start Binding DB ////
175
+
176
+ const bindingDbAccessSg = new ec2 . SecurityGroup ( this , 'bindingDbAccessSg' , {
177
+ vpc : baselineVpc ,
178
+ allowAllOutbound : true ,
179
+ description : "Grants access to the BindingDB rds instance" ,
180
+ securityGroupName : "BindingDBAccessSecurityGroup"
181
+ } ) ;
182
+
183
+ this . BindingDBSourceBucket = new s3 . Bucket ( this , 'BindingDbSourceBucket' ) ;
184
+
185
+ this . BindingDBAccessSg = bindingDbAccessSg ;
186
+
187
+ const bindingDbSg = new ec2 . SecurityGroup ( this , 'bindingDbSg' , {
188
+ vpc : baselineVpc ,
189
+ allowAllOutbound : true ,
190
+ description : "Security group for binding dbs" ,
191
+ securityGroupName : "BindingDbSecurityGroup"
192
+ } ) ;
193
+
194
+
195
+
196
+
197
+ bindingDbAccessSg . addIngressRule ( bindingDbAccessSg , ec2 . Port . allTraffic ( ) , "Recursive SG rule for Glue" ) ;
198
+
199
+ bindingDbSg . addIngressRule ( bindingDbAccessSg , ec2 . Port . tcp ( 1512 ) , "Gives BindingDB access security group access to oracle port" ) ;
200
+
201
+ importInstance . addSecurityGroup ( bindingDbAccessSg ) ;
202
+
203
+
204
+ const bindingDBSecret = new rds . DatabaseSecret ( this , 'bindingDbSecret' , {
205
+ username : 'master' ,
206
+ } ) ;
207
+ this . BindingDBSecret = bindingDBSecret ;
208
+
209
+ bindingDBSecret . grantRead ( importInstanceRole ) ;
210
+ this . BindingDBSourceBucket . grantReadWrite ( importInstanceRole ) ;
211
+
212
+
213
+ const bindingDbOptionGroup = new rds . OptionGroup ( this , 'bindingDbRdsOptionGroup' , {
214
+ engine : rds . DatabaseInstanceEngine . oracleSe2 ( {
215
+ version : rds . OracleEngineVersion . VER_19 , // different version class for each engine type
216
+ } ) ,
217
+ description : "Binding DB Option Group" ,
218
+ configurations : [ {
219
+ name : "S3_INTEGRATION" ,
220
+ version : "1.0"
221
+ } ] ,
222
+ } ) ;
223
+
224
+ const bindingDb = new rds . DatabaseInstance ( this , 'bindingDb' , {
225
+ engine : rds . DatabaseInstanceEngine . ORACLE_SE2 ,
226
+ masterUsername : 'master' ,
227
+ licenseModel : rds . LicenseModel . BRING_YOUR_OWN_LICENSE ,
228
+ vpc : baselineVpc ,
229
+ vpcPlacement : appSubnetSelection ,
230
+ optionGroup : bindingDbOptionGroup ,
231
+ instanceType : ec2 . InstanceType . of ( ec2 . InstanceClass . BURSTABLE3 , ec2 . InstanceSize . SMALL ) ,
232
+ instanceIdentifier : 'binding-db' ,
233
+ masterUserPassword : bindingDBSecret . secretValueFromJson ( 'password' ) ,
234
+ securityGroups : [ bindingDbSg , bindingDbAccessSg ] ,
235
+ deletionProtection : false ,
236
+ } ) ;
237
+ this . BindingDb = bindingDb ;
238
+
239
+ var bindingDbCfnDb = this . BindingDb . node . defaultChild as rds . CfnDBInstance ;
240
+
241
+ const bindingDbRdsImportRole = new iam . Role ( this , 'BindingDbRdsInstanceRole' , {
242
+ assumedBy : new iam . ServicePrincipal ( 'rds.amazonaws.com' )
243
+ } ) ;
244
+ this . BindingDBSourceBucket . grantReadWrite ( bindingDbRdsImportRole ) ;
245
+
246
+ bindingDbCfnDb . associatedRoles = [ {
247
+ featureName : "S3_INTEGRATION" ,
248
+ roleArn : bindingDbRdsImportRole . roleArn
249
+ } ] ;
250
+
251
+
252
+ const loadBindingDbDoc = new ssm . CfnDocument ( this , 'loadBindingDbDoc' , {
253
+ content : JSON . parse ( fs . readFileSync ( 'scripts/ssmdoc.importbindingdb.json' , { encoding : 'utf-8' } ) ) ,
254
+ documentType : "Command"
255
+ } ) ;
256
+
257
+
258
+ const instantClientBasic = new s3assets . Asset ( this , `instantClientBasicRpm` , {
259
+ path : "oracle-instantclient19.8-basic-19.8.0.0.0-1.x86_64.rpm"
260
+ } ) ;
261
+ instantClientBasic . grantRead ( importInstanceRole ) ;
262
+ const instantClientSqlPlus = new s3assets . Asset ( this , `instantClientSqlPlusRpm` , {
263
+ path : "oracle-instantclient19.8-sqlplus-19.8.0.0.0-1.x86_64.rpm"
264
+ } ) ;
265
+ instantClientSqlPlus . grantRead ( importInstanceRole ) ;
266
+
267
+
268
+ const loadBindingDbAssociation = new ssm . CfnAssociation ( this , 'loadBindingDbAssociation' , {
269
+ name : loadBindingDbDoc . ref ,
270
+ targets : [
271
+ { key : "InstanceIds" , values : [ importInstance . instanceId ] }
272
+ ]
273
+ } ) ;
274
+
275
+ loadBindingDbAssociation . addPropertyOverride ( 'Parameters' , {
276
+ databaseSecretArn : [ this . BindingDBSecret . secretArn ] ,
277
+ databaseHostName : [ this . BindingDb . dbInstanceEndpointAddress ] ,
278
+ databaseDmpS3Location : [ this . BindingDBSourceBucket . bucketName ] ,
279
+ instantClientBasicS3Path : [ instantClientBasic . s3ObjectUrl ] ,
280
+ instantClientSqlPlusS3Path : [ instantClientSqlPlus . s3ObjectUrl ] ,
281
+ executionTimeout : [ '7200' ]
282
+ } ) ;
283
+
284
+ //// End Binding DB ////
169
285
170
286
}
287
+
288
+
171
289
}
0 commit comments