@@ -632,6 +632,24 @@ function getEventBridgeSchedulerPermissions(state) {
632632 ] ;
633633}
634634
635+ // Because the S3 Bucket parameter can be either a literal name or a reference to an existing S3 bucket we need to resolve
636+ function resolveS3BucketReference ( bucket , resource ) {
637+ if ( isIntrinsic ( bucket ) ) {
638+ return {
639+ 'Fn::Sub' : [
640+ resource ,
641+ { bucket } ,
642+ ] ,
643+ } ;
644+ }
645+
646+ return resource . replaceAll ( '${bucket}' , bucket ) ;
647+ }
648+
649+ function resolveS3BucketReferences ( bucket , resources ) {
650+ return resources . map ( ( resource ) => resolveS3BucketReference ( bucket , resource ) ) ;
651+ }
652+
635653function getS3ObjectPermissions ( action , state ) {
636654 const bucket = state . Parameters . Bucket || '*' ;
637655 const key = state . Parameters . Key || '*' ;
@@ -642,27 +660,27 @@ function getS3ObjectPermissions(action, state) {
642660 return [
643661 {
644662 action : 's3:Get*' ,
645- resource : [
646- `arn:aws:s3:::${ bucket } ` ,
647- `arn:aws:s3:::${ bucket } /*` ,
648- ] ,
663+ resource : resolveS3BucketReferences ( bucket , [
664+ `arn:aws:s3:::\ ${bucket}` ,
665+ `arn:aws:s3:::\ ${bucket}/*` ,
666+ ] ) ,
649667 } ,
650668 {
651669 action : 's3:List*' ,
652- resource : [
653- `arn:aws:s3:::${ bucket } ` ,
654- `arn:aws:s3:::${ bucket } /*` ,
655- ] ,
670+ resource : resolveS3BucketReferences ( bucket , [
671+ `arn:aws:s3:::\ ${bucket}` ,
672+ `arn:aws:s3:::\ ${bucket}/*` ,
673+ ] ) ,
656674 } ,
657675 ] ;
658676 }
659677
660678 if ( prefix ) {
661- arn = `arn:aws:s3:::${ bucket } /${ prefix } /${ key } ` ;
679+ arn = resolveS3BucketReference ( bucket , `arn:aws:s3:::\ ${bucket}/${ prefix } /${ key } ` ) ;
662680 } else if ( bucket === '*' && key === '*' ) {
663681 arn = '*' ;
664682 } else {
665- arn = `arn:aws:s3:::${ bucket } /${ key } ` ;
683+ arn = resolveS3BucketReference ( bucket , `arn:aws:s3:::\ ${bucket}/${ key } ` ) ;
666684 }
667685
668686 return [ {
0 commit comments