@@ -13,13 +13,13 @@ import { DataSetEnrollmentProps, DataSetEnrollment } from './data-set-enrollment
1313
1414export 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 > ;
0 commit comments