@@ -245,25 +245,82 @@ function getBatchDynamoDBPermissions(action, state) {
245245}
246246
247247function getRedshiftDataPermissions ( action , state ) {
248+ const permissions = [ ] ;
249+
248250 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 ( {
253286 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+ } ) ;
262321 }
263- return [ {
264- action,
265- resource : '*' ,
266- } ] ;
322+
323+ return permissions ;
267324}
268325
269326function getLambdaPermissions ( state ) {
0 commit comments