@@ -4,6 +4,7 @@ import iam = require('@aws-cdk/aws-iam');
44import rds = require( '@aws-cdk/aws-rds' ) ;
55import ssm = require( '@aws-cdk/aws-ssm' ) ;
66import s3 = require( '@aws-cdk/aws-s3' ) ;
7+ import s3assets = require( '@aws-cdk/aws-s3-assets' ) ;
78import fs = require( 'fs' ) ;
89
910
@@ -16,6 +17,10 @@ export class BaselineStack extends cdk.Stack {
1617 public readonly chemblDBSecret : rds . DatabaseSecret ;
1718 public readonly OpenTargetsSourceBucket : s3 . Bucket ;
1819 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 ;
1924
2025 constructor ( scope : cdk . Construct , id : string , props ?: cdk . StackProps ) {
2126
@@ -166,6 +171,119 @@ export class BaselineStack extends cdk.Stack {
166171 openTargetsSourceFileTargetBucketLocation : [ openTargetsBucket . bucketName ]
167172 } ) ;
168173
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 ////
169285
170286 }
287+
288+
171289}
0 commit comments