S3 삭제 Access Denied

1

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

given02
已提问 8 个月前381 查看次数
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
专家
已回答 8 个月前
  • 테스트는 로컬호스트에서 테스트 했었고 업로드는 잘 되는데 삭제가 안되네요. 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
已回答 8 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则