@@ -643,59 +643,78 @@ resource "aws_s3_bucket" "this" {
643643 }
644644}
645645# # ---------------------------------------------------------------------------------------------------------------------#
646- # Create policy for CloudFront and EC2 to limit S3 media bucket access
646+ # Create IAM user for S3 bucket
647+ # # ---------------------------------------------------------------------------------------------------------------------#
648+ resource "aws_iam_user" "s3" {
649+ name = " ${ var . app [" brand" ]} -s3-media-production"
650+ tags = {
651+ Name = " ${ var . app [" brand" ]} -s3-media-production"
652+ }
653+ }
654+
655+ resource "aws_iam_access_key" "s3" {
656+ user = aws_iam_user. s3 . name
657+ }
658+ # # ---------------------------------------------------------------------------------------------------------------------#
659+ # Create policy for CloudFront and S3 user to limit S3 media bucket access
647660# # ---------------------------------------------------------------------------------------------------------------------#
648661resource "aws_s3_bucket_policy" "media" {
649- bucket = aws_s3_bucket. this [" media" ]. id
650- policy = jsonencode (
651- {
652- Id = " PolicyForMediaStorageAccess"
653- Statement = [
654- {
655- Action = " s3:GetObject"
656- Effect = " Allow"
657- Principal = {
658- AWS = aws_cloudfront_origin_access_identity.this.iam_arn
659- }
660- Resource = [
661- " ${ aws_s3_bucket . this [" media" ]. arn } /*.jpg" ,
662- " ${ aws_s3_bucket . this [" media" ]. arn } /*.jpeg" ,
663- " ${ aws_s3_bucket . this [" media" ]. arn } /*.png" ,
664- " ${ aws_s3_bucket . this [" media" ]. arn } /*.gif" ,
665- " ${ aws_s3_bucket . this [" media" ]. arn } /*.webp"
666- ]
667- },
668- {
669- Action = [
670- " s3:PutObject" ,
671- " s3:GetObject" ,
672- " s3:DeleteObject" ,
673- " s3:GetObjectAcl"
674- ],
675- Effect = " Allow"
676- Principal = {
677- AWS = [ aws_iam_role.ec2[" admin" ].arn ]
678- }
679- Resource = [
680- " ${ aws_s3_bucket . this [" media" ]. arn } " ,
681- " ${ aws_s3_bucket . this [" media" ]. arn } /*"
682- ]
683- },
684- {
685- Action = [
686- " s3:GetBucketLocation" ,
687- " s3:ListBucket"
688- ],
689- Effect = " Allow"
690- Principal = {
691- AWS = [ aws_iam_role.ec2[" admin" ].arn ]
692- }
693- Resource = " ${ aws_s3_bucket . this [" media" ]. arn } "
694- },
695- ]
696- Version = " 2012-10-17"
697- }
698- )
662+ bucket = aws_s3_bucket. this [" media" ]. id
663+ policy = jsonencode ({
664+ Id = " PolicyForMediaStorageAccess"
665+ Statement = [
666+ {
667+ Action = " s3:GetObject"
668+ Effect = " Allow"
669+ Principal = {
670+ AWS = aws_cloudfront_origin_access_identity.this.iam_arn
671+ }
672+ Resource = [
673+ " ${ aws_s3_bucket . this [" media " ]. arn } /*.jpg" ,
674+ " ${ aws_s3_bucket . this [" media " ]. arn } /*.jpeg" ,
675+ " ${ aws_s3_bucket . this [" media " ]. arn } /*.png" ,
676+ " ${ aws_s3_bucket . this [" media " ]. arn } /*.gif" ,
677+ " ${ aws_s3_bucket . this [" media " ]. arn } /*.webp"
678+ ]
679+ },
680+ {
681+ Action = [" s3:PutObject" ],
682+ Effect = " Allow"
683+ Principal = {
684+ AWS = [ aws_iam_user.s3.arn ]
685+ }
686+ Resource = [
687+ " ${ aws_s3_bucket . this [" media " ]. arn } " ,
688+ " ${ aws_s3_bucket . this [" media " ]. arn } /*"
689+ ],
690+ Condition = {
691+ test = " StringEquals"
692+ variable = " aws:SourceVpc"
693+ values = [ aws_vpc.this.id ]
694+ }
695+ },
696+ {
697+ Action = [" s3:GetObject" , " s3:GetObjectAcl" ],
698+ Effect = " Allow"
699+ Principal = {
700+ AWS = [ aws_iam_user.s3.arn ]
701+ }
702+ Resource = [
703+ " ${ aws_s3_bucket . this [" media " ]. arn } " ,
704+ " ${ aws_s3_bucket . this [" media " ]. arn } /*"
705+ ]
706+ },
707+ {
708+ Action = [" s3:GetBucketLocation" , " s3:ListBucket" ],
709+ Effect = " Allow"
710+ Principal = {
711+ AWS = [ aws_iam_user.s3.arn ]
712+ }
713+ Resource = " ${ aws_s3_bucket . this [" media " ]. arn } "
714+ },
715+ ]
716+ Version = " 2012-10-17"
717+ })
699718}
700719# # ---------------------------------------------------------------------------------------------------------------------#
701720# Create S3 bucket policy for ALB to write access logs
@@ -1829,6 +1848,8 @@ mainSteps:
18291848 su ${ var . app [" brand" ]} -s /bin/bash -c "bin/magento setup:config:set --remote-storage-driver=aws-s3 \
18301849 --remote-storage-bucket=${ aws_s3_bucket . this [" media" ]. bucket } \
18311850 --remote-storage-region=${ data . aws_region . current . name } \
1851+ --remote-storage-key=${ aws_iam_access_key . s3 . id } \
1852+ --remote-storage-secret="${ aws_iam_access_key . s3 . secret } " \
18321853 -n"
18331854 ## sync to s3 remote storage
18341855 su ${ var . app [" brand" ]} -s /bin/bash -c "bin/magento remote-storage:sync"
0 commit comments