Skip to content

Commit 6795e01

Browse files
committed
fix: added support for generating S3 permissions using Bucket references
Resolves serverless-operations#647
1 parent 67ddb59 commit 6795e01

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

lib/deploy/stepFunctions/compileIamRole.js

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
635653
function 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

Comments
 (0)