S3 삭제 Access Denied

1

스프링부트에서 deleteObject를 활용하여 S3 객체를 삭제하려는데 버킷과 IAM 관련 설정을 모두 완료 했는데도 Access Denied가 뜨네요. 확인 부탁드립니다.

given02
질문됨 7달 전371회 조회
3개 답변
2

안녕하세요.

스프링 부트 어플리케이션에서 Amazon S3 객체를 삭제하는 도중 문제가 발생한 것 같습니다.
이전 답글을 보니 질문자님께서 IAM User 설정과 Amazon S3 버킷 정책을 설정하신 것으로 확인했습니다.


[1]

  • IAM User 에 사용하신 AmazonS3FullAccess 입니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}
  • 사용하신 Amazon S3 버킷 정책입니다.
{
    "Version": "2012-10-17",
    "Id": "Policy1694444854014",
    "Statement": [ 
    { 
        "Sid": "Stmt1694444846797", 
        "Effect": "Allow", 
        "Principal": "", 
        "Action": "s3:", 
        "Resource": "arn:aws:s3:::comma-fileupload/*" 
     } ] 
}

[2]

제공해주신 Amazon S3 버킷 정책은 다음과 같이 수정되어야 합니다.

Principal 요소는 사용자, 계정, 서비스 또는 리소스에 대한 액세스가 허용 또는 거부된 기타 주체를 지정합니다.

특정 IAM 사용자에게 권한을 부여하기 위해서, 다음과 같이 설정할 수 있습니다.

"Principal":{
    "AWS":"arn:aws:iam::account-number-without-hyphens:user/username"
}

Action 은 Amazon S3 에서 정책에서 지정할 수 있는 권한 집합을 정의합니다. 와일드카드를 사용하여 전체 Amazon S3 작업에 대해 권한을 부여할 수 있습니다.

"Action": "s3:*"

(참고) 객체를 업로드하고, 삭제만을 위한 권한은 다음과 같이 설정할 수 있습니다.

"Action": [
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:DeleteObject"
]

최종적으로 수정된 S3 버킷 정책은 다음과 같습니다.

  • IAM > Users > User 선택 > Summary 에서 ARN 을 확인할 수 있습니다.
  • S3 > Buckets > Bucket 선택 > Properties 에서 ARN 을 확인할 수 있습니다.
{
    "Version": "2012-10-17",
    "Id": "Policy1694444854014",
    "Statement": [ 
    { 
        "Sid": "Stmt1694444846797", 
        "Effect": "Allow", 
        "Principal":{
            "AWS": "{IAM User ARN}" // ex. "arn:aws:iam::000000000000:user/example"
        },
        "Action": "s3:*", 
        "Resource": "{Bucket ARN}/*"  // ex. "arn:aws:s3:::example/*"
     } ] 
}

[3]

스프링 부트 애플리케이션에서 정확한 에러 메시지를 확인하기 위해 ExceptionHandler 를 다음과 같이 추가할 수 있습니다.

GlobalExceptionHandler.java

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {


 @ExceptionHandler(Exception.class)
 protected ResponseEntity<ErrorResponse> handleException(AmazonS3Exception e) {
 log.error("AmazonS3Exception", e);

 final ErrorResponse response = ErrorResponse.create(e, HttpStatusCode.valueOf(500), e.getErrorResponseXml());
 return ResponseEntity.internalServerError().body(response);
 }
}

IAM User 설정이나, Bucket 정책이 제대로 설정되지 않는 경우 GlobalExceptionHandler 로 다음과 같은 에러 메시지 (HTTP Response) 를 받을 수 있습니다.

{
    "statusCode":"INTERNAL_SERVER_ERROR",
    "headers":{},
    "detailMessageCode":"problemDetail.com.amazonaws.services.s3.model.AmazonS3Exception",
    "detailMessageArguments":null,
    "titleMessageCode":"problemDetail.title.com.amazonaws.services.s3.model.AmazonS3Exception",
    "body": 
    {
        "type":"about:blank",
        "title":"Internal Server Error",
        "status":500,
        "detail":
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>{RequestId}</RequestId><HostId>{HostId}</HostId></Error>"
    }
 }

Reference

IAM User 의 계정과, S3 Bucket 을 소유하는 계정이 다르다면 다음을 참고하시기 바랍니다.

profile picture
Ayeon_K
답변함 7달 전
0

안녕하세요.

Spring boot는 EC2에서 구동되는 것인가요?
이 경우 EC2의 IAM 역할과 S3의 버킷 정책을 확인해야 할 것 같습니다.
S3의 버킷 정책 및 IAM 역할은 어떻게 설정되어 있나요?

profile picture
전문가
답변함 7달 전
  • 테스트는 로컬호스트에서 테스트 했었고 업로드는 잘 되는데 삭제가 안되네요. S3 버킷 정책은 퍼블릭 액세스 차단 비활성화이고 { "Version": "2012-10-17", "Id": "Policy1694444854014", "Statement": [ { "Sid": "Stmt1694444846797", "Effect": "Allow", "Principal": "", "Action": "s3:", "Resource": "arn:aws:s3:::comma-fileupload/*" } ] } 정책 설정 이렇게 되어 있습니다.

    IAM은 AmazonS3FullAccess 권한이 있는 사용자를 사용하고 있습니다.

0

테스트는 로컬호스트에서 테스트 했었고 업로드는 잘 되는데 삭제가 안되네요. S3 버킷 정책은 퍼블릭 액세스 차단 비활성화이고 { "Version": "2012-10-17", "Id": "Policy1694444854014", "Statement": [ { "Sid": "Stmt1694444846797", "Effect": "Allow", "Principal": "", "Action": "s3:", "Resource": "arn:aws:s3:::comma-fileupload/*" } ] } 정책 설정 이렇게 되어 있습니다. IAM은 AmazonS3FullAccess 권한이 있는 사용자를 사용하고 있습니다.

given02
답변함 7달 전

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.

질문 답변하기에 대한 가이드라인