- 최신
- 최다 투표
- 가장 많은 댓글
안녕하세요.
스프링 부트 어플리케이션에서 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
- Amazon S3의 정책 및 권한 https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/s3-bucket-user-policy-specifying-principal-intro.html
IAM User 의 계정과, S3 Bucket 을 소유하는 계정이 다르다면 다음을 참고하시기 바랍니다.
- 다른 AWS 계정의 사용자에게 Amazon S3 버킷에 개체를 업로드할 수 있도록 액세스 권한을 부여하려면 어떻게 해야 하나요? https://repost.aws/ko/knowledge-center/s3-cross-account-upload-access
안녕하세요.
Spring boot는 EC2에서 구동되는 것인가요?
이 경우 EC2의 IAM 역할과 S3의 버킷 정책을 확인해야 할 것 같습니다.
S3의 버킷 정책 및 IAM 역할은 어떻게 설정되어 있나요?
테스트는 로컬호스트에서 테스트 했었고 업로드는 잘 되는데 삭제가 안되네요. S3 버킷 정책은 퍼블릭 액세스 차단 비활성화이고 { "Version": "2012-10-17", "Id": "Policy1694444854014", "Statement": [ { "Sid": "Stmt1694444846797", "Effect": "Allow", "Principal": "", "Action": "s3:", "Resource": "arn:aws:s3:::comma-fileupload/*" } ] } 정책 설정 이렇게 되어 있습니다. IAM은 AmazonS3FullAccess 권한이 있는 사용자를 사용하고 있습니다.
관련 콘텐츠
- 질문됨 일 년 전
- 질문됨 3달 전
- 질문됨 일 년 전
- AWS 공식업데이트됨 2년 전
테스트는 로컬호스트에서 테스트 했었고 업로드는 잘 되는데 삭제가 안되네요. S3 버킷 정책은 퍼블릭 액세스 차단 비활성화이고 { "Version": "2012-10-17", "Id": "Policy1694444854014", "Statement": [ { "Sid": "Stmt1694444846797", "Effect": "Allow", "Principal": "", "Action": "s3:", "Resource": "arn:aws:s3:::comma-fileupload/*" } ] } 정책 설정 이렇게 되어 있습니다.
IAM은 AmazonS3FullAccess 권한이 있는 사용자를 사용하고 있습니다.