@@ -245,25 +245,82 @@ function getBatchDynamoDBPermissions(action, state) {
245
245
}
246
246
247
247
function getRedshiftDataPermissions ( action , state ) {
248
+ const permissions = [ ] ;
249
+
248
250
if ( [ 'redshift-data:ExecuteStatement' , 'redshift-data:BatchExecuteStatement' ] . includes ( action ) ) {
249
- const clusterName = _ . has ( state , 'Parameters.ClusterIdentifier' ) ? state . Parameters . ClusterIdentifier : '*' ;
250
- const dbName = _ . has ( state , 'Parameters.Database' ) ? state . Parameters . Database : '*' ;
251
- const dbUser = _ . has ( state , 'Parameters.DbUser' ) ? state . Parameters . DbUser : '*' ;
252
- return [ {
251
+ const dbName = _ . has ( state , [ 'Parameters' , 'Database' ] ) ? state . Parameters . Database : '*' ;
252
+
253
+ let workgroupArn ;
254
+ let clusterName ;
255
+ if ( _ . has ( state , [ 'Parameters' , 'WorkgroupName' ] ) ) {
256
+ if ( state . Parameters . WorkgroupName . startsWith ( 'arn:' ) ) {
257
+ workgroupArn = state . Parameters . WorkgroupName ;
258
+ } else {
259
+ workgroupArn = { 'Fn::Sub' : 'arn:${AWS::Partition}:redshift-serverless:${AWS::Region}:${AWS::AccountId}:workgroup/*' } ;
260
+ }
261
+ } else if ( _ . has ( state , [ 'Parameters' , 'WorkgroupName.$' ] ) ) {
262
+ workgroupArn = { 'Fn::Sub' : 'arn:${AWS::Partition}:redshift-serverless:${AWS::Region}:${AWS::AccountId}:workgroup/*' } ;
263
+ } else if ( _ . has ( state , [ 'Parameters' , 'ClusterIdentifier' ] ) ) {
264
+ clusterName = state . Parameters . ClusterIdentifier ;
265
+ } else {
266
+ clusterName = '*' ;
267
+ }
268
+
269
+ let secretArn ;
270
+ let dbUser ;
271
+ if ( _ . has ( state , [ 'Parameters' , 'SecretArn' ] ) ) {
272
+ if ( state . Parameters . SecretArn . startsWith ( 'arn:' ) ) {
273
+ secretArn = state . Parameters . SecretArn ;
274
+ } else {
275
+ secretArn = { 'Fn::Sub' : `arn:\${AWS::Partition}:secretsmanager:\${AWS::Region}:\${AWS::AccountId}:secret:${ state . Parameters . SecretArn } *` } ;
276
+ }
277
+ } else if ( _ . has ( state , [ 'Parameters' , 'SecretArn.$' ] ) ) {
278
+ secretArn = { 'Fn::Sub' : 'arn:${AWS::Partition}:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:*' } ;
279
+ } else if ( _ . has ( state , [ 'Parameters' , 'DbUser' ] ) ) {
280
+ dbUser = state . Parameters . DbUser ;
281
+ } else if ( _ . has ( state , [ 'Parameters' , 'DbUser.$' ] ) ) {
282
+ dbUser = '*' ;
283
+ }
284
+
285
+ permissions . push ( {
253
286
action,
254
- resource : { 'Fn::Sub' : `arn:\${AWS::Partition}:redshift:\${AWS::Region}:\${AWS::AccountId}:cluster:${ clusterName } ` } ,
255
- } , {
256
- action : 'redshift:GetClusterCredentials' ,
257
- resource : [
258
- { 'Fn::Sub' : `arn:\${AWS::Partition}:redshift:\${AWS::Region}:\${AWS::AccountId}:dbname:${ clusterName } /${ dbName } ` } ,
259
- { 'Fn::Sub' : `arn:\${AWS::Partition}:redshift:\${AWS::Region}:\${AWS::AccountId}:dbuser:${ clusterName } /${ dbUser } ` } ,
260
- ] ,
261
- } ] ;
287
+ resource : workgroupArn || { 'Fn::Sub' : `arn:\${AWS::Partition}:redshift:\${AWS::Region}:\${AWS::AccountId}:cluster:${ clusterName } ` } ,
288
+ } ) ;
289
+
290
+ if ( secretArn ) {
291
+ permissions . push ( {
292
+ action : 'secretsmanager:GetSecretValue' ,
293
+ resource : secretArn ,
294
+ } ) ;
295
+ } else if ( dbUser ) {
296
+ permissions . push ( {
297
+ action : 'redshift:GetClusterCredentials' ,
298
+ resource : [
299
+ { 'Fn::Sub' : `arn:\${AWS::Partition}:redshift:\${AWS::Region}:\${AWS::AccountId}:dbuser:${ clusterName } /${ dbUser } ` } ,
300
+ { 'Fn::Sub' : `arn:\${AWS::Partition}:redshift:\${AWS::Region}:\${AWS::AccountId}:dbname:${ clusterName } /${ dbName } ` } ,
301
+ ] ,
302
+ } ) ;
303
+ } else {
304
+ if ( workgroupArn ) { // eslint-disable-line no-lonely-if
305
+ permissions . push ( {
306
+ action : 'redshift-serverless:GetCredentials' ,
307
+ resource : workgroupArn ,
308
+ } ) ;
309
+ } else {
310
+ permissions . push ( {
311
+ action : 'redshift:GetClusterCredentialsWithIAM' ,
312
+ resource : { 'Fn::Sub' : `arn:\${AWS::Partition}:redshift:\${AWS::Region}:\${AWS::AccountId}:dbname:${ clusterName } /${ dbName } ` } ,
313
+ } ) ;
314
+ }
315
+ }
316
+ } else {
317
+ permissions . push ( {
318
+ action,
319
+ resource : '*' ,
320
+ } ) ;
262
321
}
263
- return [ {
264
- action,
265
- resource : '*' ,
266
- } ] ;
322
+
323
+ return permissions ;
267
324
}
268
325
269
326
function getLambdaPermissions ( state ) {
0 commit comments