Skip to content

Commit ca51eb9

Browse files
author
EC2 Default User
committed
Adding notebook permissions and some additional inheritance
1 parent d22ce04 commit ca51eb9

File tree

8 files changed

+98
-16
lines changed

8 files changed

+98
-16
lines changed

bin/aws.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ const openTargetsStack = new OpenTargetsStack(app, 'OpenTargetsStack', {
3434
});
3535

3636
const analyticsStack = new AnalyticsStack(app, 'AnalyticsStack', {
37-
targetVpc: baseline.Vpc
37+
targetVpc: baseline.Vpc,
3838
});
3939

40+
41+
chemblStack.grantRead(analyticsStack.NotebookRole);
42+
openTargetsStack.grantRead(analyticsStack.NotebookRole);
43+
44+
45+
// chemblStack.grantRead(analyticsStack.NotebookRole);
46+
// openTargetsStack.grantRead(analyticsStack.NotebookRole);

lib/analytics-stack.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import glue = require('@aws-cdk/aws-glue');
66
import s3 = require('@aws-cdk/aws-s3');
77
import s3assets = require('@aws-cdk/aws-s3-assets');
88
import sagemaker = require('@aws-cdk/aws-sagemaker');
9+
import { DataSetStack, DataSetStackProps} from './dataset-stack';
910

1011
export interface AnalyticsStackProps extends cdk.StackProps{
1112
targetVpc: ec2.Vpc
@@ -14,6 +15,8 @@ export interface AnalyticsStackProps extends cdk.StackProps{
1415

1516
export class AnalyticsStack extends cdk.Stack {
1617

18+
public readonly NotebookRole: iam.Role;
19+
1720
constructor(scope: cdk.Construct, id: string, props: AnalyticsStackProps) {
1821
super(scope, id, props);
1922

@@ -22,11 +25,16 @@ export class AnalyticsStack extends cdk.Stack {
2225
vpc: props.targetVpc
2326
});
2427

28+
const athenaSagingDirectory = new s3.Bucket(this, 'athenaStagingDir', {});
29+
30+
2531

2632
const lifecycleCode = [
2733
{"content": cdk.Fn.base64(`
2834
wget -O /home/ec2-user/SageMaker/opentargets.chembl.example.ipynb https://raw.githubusercontent.com/paulu-aws/chembl-opentargets-data-lake-example/master/scripts/sagemaker.opentargets.chembl.example.ipynb
29-
chown ec2-user /home/ec2-user/SageMaker/opentargets.chembl.example.ipynb
35+
sudo chown ec2-user /home/ec2-user/SageMaker/opentargets.chembl.example.ipynb
36+
sed -i 's/XXXXAthenaStagingDirectoryXXXX/${athenaSagingDirectory.bucketName}/g' opentargets.chembl.example.ipynb
37+
sed -i 's/XXXXAthenaRegionXXXX/${cdk.Stack.of(this).region}/g' opentargets.chembl.example.ipynb
3038
`) }
3139
];
3240
const sageMakerIntanceLifecyclePolicy = new sagemaker.CfnNotebookInstanceLifecycleConfig(this, 'notebookLifecyclePolicy', {
@@ -35,19 +43,20 @@ export class AnalyticsStack extends cdk.Stack {
3543

3644
});
3745

38-
const sageMakerInstanceRole = new iam.Role(this, 'notebookInstanceRole', {
46+
this.NotebookRole = new iam.Role(this, 'notebookInstanceRole', {
3947
roleName: "chemblOpenTargetsNotebookRole",
4048
assumedBy: new iam.ServicePrincipal('sagemaker')
4149
});
4250

51+
athenaSagingDirectory.grantReadWrite(this.NotebookRole)
4352

4453
new sagemaker.CfnNotebookInstance(this, 'analyticsNotebook', {
4554
instanceType : 'ml.t2.medium',
4655
volumeSizeInGb: 100,
4756
securityGroupIds: [notebookSg.securityGroupId],
4857
subnetId: props.targetVpc.selectSubnets({subnetType: ec2.SubnetType.PRIVATE}).subnetIds[0],
4958
notebookInstanceName: "Chembl-OpenTargets-Demo-Notebook",
50-
roleArn: sageMakerInstanceRole.roleArn,
59+
roleArn: this.NotebookRole.roleArn,
5160
directInternetAccess: 'Disabled',
5261
lifecycleConfigName: sageMakerIntanceLifecyclePolicy.notebookInstanceLifecycleConfigName
5362
});

lib/chembl-25-stack.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,25 @@ import glue = require('@aws-cdk/aws-glue');
66
import s3 = require('@aws-cdk/aws-s3');
77
import s3assets = require('@aws-cdk/aws-s3-assets');
88
import { RDSdataSetSetEnrollmentProps, RDSPostgresDataSetEnrollment } from './rds-data-set-enrollment';
9+
import { DataSetStack, DataSetStackProps} from './dataset-stack';
910

1011

11-
export interface ChemblStackEnrollmentProps extends cdk.StackProps {
12+
export interface ChemblStackEnrollmentProps extends DataSetStackProps {
1213
databaseSecret: rds.DatabaseSecret;
1314
database: rds.DatabaseInstance;
1415
accessSecurityGroup: ec2.SecurityGroup;
1516
dataLakeBucket: s3.Bucket;
1617
}
1718

18-
export class ChemblStack extends cdk.Stack{
19+
export class ChemblStack extends DataSetStack{
1920
constructor(scope: cdk.Construct, id: string, props: ChemblStackEnrollmentProps) {
2021
super(scope, id, props);
2122

2223

2324
const dataSetName = "chembl_25";
2425

25-
const chembl25 = new RDSPostgresDataSetEnrollment(this, 'chembl-25-enrollment', {
26+
27+
this.Enrollment = new RDSPostgresDataSetEnrollment(this, 'chembl-25-enrollment', {
2628
databaseSecret: props.databaseSecret,
2729
database: props.database,
2830
accessSecurityGroup: props.accessSecurityGroup,

lib/data-set-enrollment.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ export class DataSetEnrollment extends cdk.Construct {
3434
public readonly DataSetGlueRole: iam.Role;
3535
public readonly Dataset_Source: glue.Database;
3636
public readonly Dataset_Datalake: glue.Database;
37+
38+
public readonly DataLakeBucketName: string;
39+
public readonly DataLakePrefix: string;
40+
41+
3742

3843
private setupCrawler(targetGlueDatabase: glue.Database, targets: glue.CfnCrawler.TargetsProperty, isSourceCrawler: boolean){
3944

@@ -57,6 +62,10 @@ export class DataSetEnrollment extends cdk.Construct {
5762
constructor(scope: cdk.Construct, id: string, props: DataSetEnrollmentProps) {
5863
super(scope, id);
5964

65+
66+
this.DataLakeBucketName = props.GlueScriptArguments['--DL_BUCKET'];
67+
this.DataLakePrefix = props.GlueScriptArguments['--DL_PREFIX'];
68+
6069
this.DataSetName = props.dataSetName;
6170

6271
this.Dataset_Source = new glue.Database(this, `${props.dataSetName}_src`, {

lib/datalake-stack.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,33 @@ export class DataLakeEnrollment extends cdk.Construct {
4343
constructor(scope: cdk.Construct, id: string, props: DataLakeEnrollmentProps) {
4444
super(scope, id);
4545
}
46+
47+
public grantRead(principal: iam.Role){
48+
49+
50+
const dataLakeBucket = s3.Bucket.fromBucketName(this, 'dataLakeBucket', this.DataEnrollment.DataLakeBucketName);
51+
dataLakeBucket.grantRead(principal, this.DataEnrollment.DataLakePrefix + "*")
52+
53+
const gluePolicy = new iam.PolicyStatement({
54+
actions: ["glue:GetDatabase"],
55+
effect: iam.Effect.ALLOW,
56+
resources: [`arn:aws:glue:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:catalog`,
57+
`arn:aws:glue:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:database/default`,
58+
this.DataEnrollment.Dataset_Datalake.databaseArn
59+
]
60+
});
61+
62+
const athenaPolicy = new iam.PolicyStatement({
63+
actions: ["athena:*"],
64+
effect: iam.Effect.ALLOW,
65+
resources: ["*"],
66+
});
67+
68+
principal.addToPolicy(gluePolicy);
69+
principal.addToPolicy(athenaPolicy);
70+
71+
72+
}
4673
}
4774

4875

lib/dataset-stack.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import * as cdk from '@aws-cdk/core';
2+
import ec2 = require('@aws-cdk/aws-ec2');
3+
import iam = require('@aws-cdk/aws-iam');
4+
import rds = require('@aws-cdk/aws-rds');
5+
import glue = require('@aws-cdk/aws-glue');
6+
import s3 = require('@aws-cdk/aws-s3');
7+
import s3assets = require('@aws-cdk/aws-s3-assets');
8+
import { DataSetEnrollmentProps, DataSetEnrollment } from './data-set-enrollment';
9+
import { DataLakeEnrollmentProps, DataLakeEnrollment} from './datalake-stack';
10+
11+
12+
export interface DataSetStackProps extends cdk.StackProps {
13+
dataLakeBucket: s3.Bucket;
14+
}
15+
16+
17+
export class DataSetStack extends cdk.Stack {
18+
19+
public Enrollment: DataLakeEnrollment;
20+
21+
constructor(scope: cdk.Construct, id: string, props: DataSetStackProps) {
22+
super(scope, id, props);
23+
}
24+
25+
public grantRead(role: iam.Role){
26+
this.Enrollment.grantRead(role);
27+
}
28+
}

lib/opentargets-stack.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@ import glue = require('@aws-cdk/aws-glue');
55
import s3 = require('@aws-cdk/aws-s3');
66
import s3assets = require('@aws-cdk/aws-s3-assets');
77
import { S3dataSetEnrollmentProps, S3dataSetEnrollment } from './s3-data-set-enrollment';
8+
import { DataSetStack, DataSetStackProps} from './dataset-stack';
89

910

10-
11-
export interface OpenTargetsEnrollmentProps extends cdk.StackProps {
11+
export interface OpenTargetsEnrollmentProps extends DataSetStackProps {
1212
sourceBucket: s3.IBucket;
1313
sourceBucketDataPrefix: string;
1414
dataLakeBucket: s3.Bucket;
1515
}
1616

1717

18-
export class OpenTargetsStack extends cdk.Stack{
18+
export class OpenTargetsStack extends DataSetStack{
1919

2020
constructor(scope: cdk.Construct, id: string, props: OpenTargetsEnrollmentProps) {
2121
super(scope, id, props);
2222

2323

24-
const openTargets1911 = new S3dataSetEnrollment(this, 'openTargets-1911-enrollment', {
24+
this.Enrollment = new S3dataSetEnrollment(this, 'openTargets-1911-enrollment', {
2525
DataSetName: "opentargets_1911",
2626
sourceBucket: props.sourceBucket,
2727
sourceBucketDataPrefixes: [

scripts/sagemaker.opentargets.chembl.example.ipynb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
"metadata": {},
77
"outputs": [],
88
"source": [
9-
"#import sys\n",
10-
"#!{sys.executable} -m pip install PyAthena"
9+
"import sys\n",
10+
"!{sys.executable} -m pip install PyAthena"
1111
]
1212
},
1313
{
1414
"cell_type": "code",
15-
"execution_count": null,
15+
"execution_count": 2,
1616
"metadata": {},
1717
"outputs": [],
1818
"source": [
@@ -28,8 +28,8 @@
2828
"metadata": {},
2929
"outputs": [],
3030
"source": [
31-
"conn = connect(s3_staging_dir='s3://chembl-opentargets-43762-3/athena/',\n",
32-
" region_name='us-east-1')"
31+
"conn = connect(s3_staging_dir='s3://XXXXAthenaStagingDirectoryXXXX/athena/',\n",
32+
" region_name='XXXXAthenaRegionXXXX')"
3333
]
3434
},
3535
{

0 commit comments

Comments
 (0)