Skip to content

Commit 78cd7ba

Browse files
committed
Adding grantDataLocation() capability.
1 parent 98aa956 commit 78cd7ba

File tree

3 files changed

+84
-21
lines changed

3 files changed

+84
-21
lines changed

lib/constructs/data-lake-enrollment.ts

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ import { DataSetEnrollmentProps, DataSetEnrollment } from './data-set-enrollment
1313

1414
export class DataLakeEnrollment extends cdk.Construct {
1515

16-
public DataEnrollment: DataSetEnrollment;
17-
public DataSetName: string;
18-
private CoarseAthenaAccessPolicy: iam.ManagedPolicy;
19-
private CoarseResourceAccessPolicy: iam.ManagedPolicy;
20-
private CoarseIamPolciesApplied: boolean;
16+
public DataEnrollment: DataSetEnrollment;
17+
public DataSetName: string;
18+
private CoarseAthenaAccessPolicy: iam.ManagedPolicy;
19+
private CoarseResourceAccessPolicy: iam.ManagedPolicy;
20+
private CoarseIamPolciesApplied: boolean;
2121

22-
constructor(scope: cdk.Construct, id: string, props: DataLakeEnrollment.DataLakeEnrollmentProps) {
22+
constructor(scope: cdk.Construct, id: string, props: DataLakeEnrollment.DataLakeEnrollmentProps) {
2323
super(scope, id);
2424

2525

@@ -28,6 +28,19 @@ export class DataLakeEnrollment extends cdk.Construct {
2828

2929
}
3030

31+
protected grantGlueRoleLakeFormationPermissions(DataSetGlueRole: iam.Role, DataSetName: string) {
32+
33+
this.grantDataLocationPermissions(this.DataEnrollment.DataSetGlueRole, {
34+
Grantable: true,
35+
GrantResourcePrefix: `${DataSetName}locationGrant`
36+
});
37+
this.grantDatabasePermission(this.DataEnrollment.DataSetGlueRole, {
38+
DatabasePermissions: [DataLakeEnrollment.DatabasePermission.All],
39+
GrantableDatabasePermissions: [DataLakeEnrollment.DatabasePermission.All],
40+
GrantResourcePrefix: `${DataSetName}RoleGrant`
41+
}, true);
42+
}
43+
3144

3245
public createCoarseIamPolicy(){
3346

@@ -226,6 +239,45 @@ export class DataLakeEnrollment extends cdk.Construct {
226239

227240
}
228241

242+
public grantDataLocationPermissions(principal: iam.IPrincipal, permissionGrant: DataLakeEnrollment.DataLocationGrant){
243+
244+
var grantIdPrefix = ""
245+
var dataLakePrincipal : lakeformation.CfnPermissions.DataLakePrincipalProperty = {
246+
dataLakePrincipalIdentifier: ""
247+
};
248+
249+
var dataLocationProperty : lakeformation.CfnPermissions.ResourceProperty = {
250+
dataLocationResource: {
251+
s3Resource: `arn:aws:s3:::${this.DataEnrollment.DataLakeBucketName}${this.DataEnrollment.DataLakePrefix}`
252+
}
253+
};
254+
const resolvedPrincipalType = this.determinePrincipalType(principal);
255+
256+
if(resolvedPrincipalType === iam.Role) {
257+
const resolvedPrincipal = principal as iam.Role;
258+
259+
if(permissionGrant.GrantResourcePrefix){
260+
grantIdPrefix = `${permissionGrant.GrantResourcePrefix}-${this.DataSetName}`
261+
}else{
262+
grantIdPrefix = `${resolvedPrincipal.roleName}-${this.DataSetName}`
263+
}
264+
dataLakePrincipal = { dataLakePrincipalIdentifier: resolvedPrincipal.roleArn };
265+
}
266+
267+
if(resolvedPrincipalType === iam.User){
268+
const resolvedPrincipal = principal as iam.User;
269+
grantIdPrefix = `${resolvedPrincipal.userName}-${this.DataSetName}`
270+
dataLakePrincipal = { dataLakePrincipalIdentifier: resolvedPrincipal.userArn };
271+
}
272+
273+
if(permissionGrant.Grantable){
274+
this.createLakeFormationPermission(`${grantIdPrefix}-locationGrant`,dataLakePrincipal , dataLocationProperty, ['DATA_LOCATION_ACCESS'], ['DATA_LOCATION_ACCESS']);
275+
}else {
276+
this.createLakeFormationPermission(`${grantIdPrefix}-locationGrant`,dataLakePrincipal , dataLocationProperty, ['DATA_LOCATION_ACCESS'], ['']);
277+
}
278+
279+
280+
}
229281

230282
public grantTableWithColumnPermissions(principal: iam.IPrincipal, permissionGrant: DataLakeEnrollment.TableWithColumnPermissionGrant){
231283

@@ -285,8 +337,7 @@ export class DataLakeEnrollment extends cdk.Construct {
285337
var dataLakePrincipal : lakeformation.CfnPermissions.DataLakePrincipalProperty = {
286338
dataLakePrincipalIdentifier: ""
287339
};
288-
var databaseResourceProperty : lakeformation.CfnPermissions.ResourceProperty = {
289-
//dataLocationResource: {resourceArn: this.DataEnrollment.DataLakeBucketName},
340+
var databaseResourceProperty : lakeformation.CfnPermissions.ResourceProperty = {
290341
databaseResource: {name: this.DataEnrollment.Dataset_Datalake.databaseName}
291342
};
292343

@@ -327,7 +378,7 @@ export class DataLakeEnrollment extends cdk.Construct {
327378

328379

329380
public grantTablePermissions(principal: iam.IPrincipal, permissionGrant: DataLakeEnrollment.TablePermissionGrant){
330-
381+
331382
const coreGrant = this.setupIamAndLakeFormationDatabasePermissionForPrincipal(principal, permissionGrant.DatabasePermissions, permissionGrant.GrantableDatabasePermissions);
332383

333384
permissionGrant.tables.forEach(table => {
@@ -483,6 +534,10 @@ export namespace DataLakeEnrollment
483534
GrantResourcePrefix?: string;
484535
}
485536

537+
export interface DataLocationGrant{
538+
Grantable: boolean;
539+
GrantResourcePrefix?: string;
540+
}
486541

487542
export interface TablePermissionGrant {
488543
tables: Array<string>;

lib/constructs/rds-data-set-enrollment.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,7 @@ export class RDSPostgresDataSetEnrollment extends DataLakeEnrollment {
6464

6565

6666
this.createCoarseIamPolicy();
67-
68-
this.grantDatabasePermission(this.DataEnrollment.DataSetGlueRole, {
69-
DatabasePermissions: [DataLakeEnrollment.DatabasePermission.All],
70-
GrantableDatabasePermissions: [DataLakeEnrollment.DatabasePermission.All],
71-
GrantResourcePrefix: `${props.DataSetName}RoleGrant`
72-
}, true);
67+
this.grantGlueRoleLakeFormationPermissions(this.DataEnrollment.DataSetGlueRole, props.DataSetName);
7368

7469
}
7570
}

lib/constructs/s3-data-set-enrollment.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,22 @@ export interface S3dataSetEnrollmentProps extends DataLakeEnrollment.DataLakeEnr
1616

1717

1818
export class S3dataSetEnrollment extends DataLakeEnrollment{
19+
20+
21+
22+
grantGlueRoleLakeFormationPermissions(DataSetGlueRole: iam.Role, DataSetName: string) {
23+
24+
this.grantDataLocationPermissions(this.DataEnrollment.DataSetGlueRole, {
25+
Grantable: true,
26+
GrantResourcePrefix: `${DataSetName}locationGrant`
27+
});
28+
this.grantDatabasePermission(this.DataEnrollment.DataSetGlueRole, {
29+
DatabasePermissions: [DataLakeEnrollment.DatabasePermission.All],
30+
GrantableDatabasePermissions: [DataLakeEnrollment.DatabasePermission.All],
31+
GrantResourcePrefix: `${DataSetName}RoleGrant`
32+
}, true);
33+
}
34+
1935
constructor(scope: cdk.Construct, id: string, props: S3dataSetEnrollmentProps) {
2036
super(scope, id, props);
2137

@@ -59,13 +75,10 @@ export class S3dataSetEnrollment extends DataLakeEnrollment{
5975
});
6076

6177
this.createCoarseIamPolicy();
62-
6378

64-
this.grantDatabasePermission(this.DataEnrollment.DataSetGlueRole, {
65-
DatabasePermissions: [DataLakeEnrollment.DatabasePermission.All],
66-
GrantableDatabasePermissions: [DataLakeEnrollment.DatabasePermission.All],
67-
GrantResourcePrefix: `${props.DataSetName}RoleGrant`
68-
}, true);
79+
this.grantGlueRoleLakeFormationPermissions(this.DataEnrollment.DataSetGlueRole, props.DataSetName);
80+
81+
6982

7083

7184
}

0 commit comments

Comments
 (0)