Skip to content

Commit fc6325a

Browse files
committed
Adding lakeformation table grant capability.
1 parent 0734634 commit fc6325a

File tree

2 files changed

+47
-47
lines changed

2 files changed

+47
-47
lines changed

bin/aws.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,13 @@ openTargetsStack.grantIamRead(analyticsStack.NotebookRole);
4141

4242

4343

44+
45+
46+
47+
48+
4449
const exampleUser = iam.User.fromUserName(coreDataLake, 'exampleGrantee', 'paul0' );
50+
4551
var exampleGrant: DataLakeEnrollment.LakeFormationPermissionGrant = {
4652
tables: ["association_data", "evidence_data","target_list","disease_list"],
4753
DatabasePermissions: [DataLakeEnrollment.DatabasePermission.Alter, DataLakeEnrollment.DatabasePermission.CreateTable, DataLakeEnrollment.DatabasePermission.Drop],

lib/constructs/data-lake-enrollment.ts

Lines changed: 41 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -226,9 +226,7 @@ export class DataLakeEnrollment extends cdk.Construct {
226226

227227
private createLakeFormationPermission(resourceId: string, dataLakePrincipal: lakeformation.CfnPermissions.DataLakePrincipalProperty,
228228
resource: lakeformation.CfnPermissions.ResourceProperty, permissions: string[], grantablePremissions: string[] ){
229-
230-
console.log("CREATING lakeformation permission");
231-
229+
232230
new lakeformation.CfnPermissions(this, resourceId, {
233231
dataLakePrincipal: dataLakePrincipal,
234232
resource: resource,
@@ -238,8 +236,7 @@ export class DataLakeEnrollment extends cdk.Construct {
238236
}
239237

240238
public grantLakeFormationPermissions(principal: iam.IPrincipal, permissionGrant: DataLakeEnrollment.LakeFormationPermissionGrant){
241-
242-
console.log("Granting lakeformation permission");
239+
243240

244241
this.grantCoarseIamRead(principal);
245242

@@ -252,34 +249,18 @@ export class DataLakeEnrollment extends cdk.Construct {
252249
databaseResource: {name: this.DataEnrollment.Dataset_Datalake.databaseName}
253250
};
254251

255-
if(principal instanceof iam.Role){
256-
grantIdPrefix = `${principal.roleName}-${this.DataSetName}`
257-
dataLakePrincipal = { dataLakePrincipalIdentifier: principal.roleArn };
258-
}
252+
const resolvedPrincipalType = this.determinePrincipalType(principal);
259253

260-
if(principal instanceof iam.User){
261-
grantIdPrefix = `${principal.userName}-${this.DataSetName}`
262-
dataLakePrincipal = { dataLakePrincipalIdentifier: principal.userName };
254+
if(resolvedPrincipalType === iam.Role) {
255+
const resolvedPrincipal = principal as iam.Role;
256+
grantIdPrefix = `${resolvedPrincipal.roleArn}-${this.DataSetName}`
257+
dataLakePrincipal = { dataLakePrincipalIdentifier: resolvedPrincipal.roleArn };
263258
}
264259

265-
if(principal instanceof cdk.Resource){
266-
267-
try{
268-
const user = principal as iam.User;
269-
grantIdPrefix = `${user.userName}-${this.DataSetName}`
270-
dataLakePrincipal = { dataLakePrincipalIdentifier: user.userName };
271-
return;
272-
} catch(exception) {
273-
console.log(exception);
274-
}
275-
try{
276-
const role = principal as iam.Role;
277-
grantIdPrefix = `${role.roleName}-${this.DataSetName}`
278-
dataLakePrincipal = { dataLakePrincipalIdentifier: role.roleArn };
279-
return;
280-
} catch(exception) {
281-
console.log(exception);
282-
}
260+
if(resolvedPrincipalType === iam.User){
261+
const resolvedPrincipal = principal as iam.User;
262+
grantIdPrefix = `${resolvedPrincipal.userName}-${this.DataSetName}`
263+
dataLakePrincipal = { dataLakePrincipalIdentifier: resolvedPrincipal.userName };
283264
}
284265

285266
this.createLakeFormationPermission(`${grantIdPrefix}-databaseGrant`,dataLakePrincipal , databaseResourceProperty, permissionGrant.DatabasePermissions, permissionGrant.GrantableDatabasePermissions)
@@ -291,47 +272,60 @@ export class DataLakeEnrollment extends cdk.Construct {
291272
databaseName: this.DataEnrollment.Dataset_Datalake.databaseName
292273
}
293274
};
294-
this.createLakeFormationPermission(`${grantIdPrefix}-databaseTableGrant`,dataLakePrincipal , tableResourceProperty, permissionGrant.TablePermissions, permissionGrant.TablePermissions)
275+
this.createLakeFormationPermission(`${grantIdPrefix}-${table}-databaseTableGrant`,dataLakePrincipal , tableResourceProperty, permissionGrant.TablePermissions, permissionGrant.TablePermissions)
295276
});
296277

297278
}
298279

299-
public grantCoarseIamRead(principal: iam.IPrincipal){
280+
private determinePrincipalType(principal: iam.IPrincipal){
300281

301-
if(principal instanceof iam.Role){
302-
this.CoarseAthenaAccessPolicy.attachToRole(principal);
303-
this.CoarseResourceAccessPolicy.attachToRole(principal);
304-
return;
282+
if(principal instanceof iam.Role){
283+
//return principal as iam.Role;
284+
return iam.Role;
305285
}
306286

307287
if(principal instanceof iam.User){
308-
this.CoarseAthenaAccessPolicy.attachToUser(principal);
309-
this.CoarseResourceAccessPolicy.attachToUser(principal);
310-
return;
288+
//return principal as iam.User;
289+
return iam.User;
311290
}
312291

313292
if(principal instanceof cdk.Resource){
314-
293+
315294
try{
316-
const user = principal as iam.User;
317-
this.CoarseAthenaAccessPolicy.attachToUser(user);
318-
this.CoarseResourceAccessPolicy.attachToUser(user);
319-
return;
295+
const user = principal as iam.User;
296+
return iam.User;
320297
} catch(exception) {
321298
console.log(exception);
322299
}
323300
try{
324301
const role = principal as iam.Role;
325-
this.CoarseAthenaAccessPolicy.attachToRole(role);
326-
this.CoarseResourceAccessPolicy.attachToRole(role);
327-
return;
302+
return iam.Role;
328303
} catch(exception) {
329304
console.log(exception);
330305
}
306+
}
307+
308+
throw("Unable to deterimine principal type...");
331309

310+
}
311+
312+
313+
public grantCoarseIamRead(principal: iam.IPrincipal){
314+
315+
const resolvedPrincipalType = this.determinePrincipalType(principal);
332316

317+
if(resolvedPrincipalType === iam.Role){
318+
this.CoarseAthenaAccessPolicy.attachToRole(principal as iam.Role);
319+
this.CoarseResourceAccessPolicy.attachToRole(principal as iam.Role);
320+
return;
333321
}
334322

323+
if(resolvedPrincipalType === iam.User){
324+
this.CoarseAthenaAccessPolicy.attachToUser(principal as iam.User);
325+
this.CoarseResourceAccessPolicy.attachToUser(principal as iam.User);
326+
return;
327+
}
328+
335329
throw("Unable to attach policy. Principal is not a user or role.");
336330

337331
}

0 commit comments

Comments
 (0)