TIL (ToDay I LearNEd)/K P T (keeP, pRoBlem, Try) & 트러블슈팅

[AWS] S3 FULL ACCESS 권한 오류 : 정책 권한 생성하기

sooyeoneo 2024. 12. 31. 03:30

welcome aws!


 

S3 이미지 업로드

S3를 연결하여 이미지를 포함한 각종 파일(jpg, jpeg, png, pdf, csv)을 올리는 로직을 작성하였다.

 

postman에서 form-data에 데이터를 담아 요청을 보냈는데,

S3 Full Access 권한을 가지고 있음에도 S3에 대한 접근 권한이 거부되는 오류가 발생하였다.

아마존이 권한 허용을 안해줘서 S3 권한 거부된..

 

 

 

POSTMAN 오류 메시지 500 INTERNAL SERVER ERROR

"message": "software.amazon.awssdk.services.s3.model.S3Exception: User: arn:aws:iam::816069163920:user/user-onepick is not authorized to perform: s3:PutObject on resource: \"arn:aws:s3:::mozzarello-s3-bucket/0557f991-4ef0-4155-860b-b69d47aae15e_간절한_짱구.png\" with an explicit deny in an identity-based policy (Service: S3, Status Code: 403, Request ID: JA05HQRH0WCJN6SC, Extended Request ID: 5rIp+vrT4Fpl9fbdGGfVBTnviPnkNYy0x4Svvv4lybqNmeuwV/d1Add4w99QzJwBRbBwVfiuXZk=)"

 

 

 

IAM 계정을 생성한 후에, 버킷에서 아래와 같이 옵션을 선택하여 버킷을 생성하였다.

모든 퍼블릭 액세스를 허용한다.

 

 

S3를 관리하기 위한 암호화 유형을 선택한 뒤에, 버킷 키를 활성화로 선택

 

 

버킷 만들기를 눌렀으나...

 

 

 

AWS  버킷 생성 실패 오류 메시지 API 응답

User: arn:aws:iam::816069163920:user/user-onepick is not authorized to perform: s3:CreateBucket on resource: "arn:aws:s3:::onepick-test-bucket" with an explicit deny in an identity-based policy

 

 

버킷을 생성하려면 s3:CreateBucket 권한이 필요하다고 한다.

또한 an explict deny.. 라는 오류 메시지를 확인할 수 있다.

 

어디서 deny가 된 것일까?

 

https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_access-denied.html?icmpid=docs_iam_console

 

Troubleshoot access denied error messages - AWS Identity and Access Management

Having trouble signing in to AWS? Make sure that you're on the correct AWS sign-in page for your type of user. If you are the AWS account root user (account owner), you can sign in to AWS using the credentials that you set up when you created the AWS accou

docs.aws.amazon.com

 

 

https://docs.aws.amazon.com/AmazonS3/latest/userguide/troubleshoot-403-errors.html#troubleshoot-403-tips?icmpid=docs_amazons3_console

 

Troubleshoot access denied (403 Forbidden) errors in Amazon S3 - Amazon Simple Storage Service

For access denied (HTTP 403 Forbidden) errors, Amazon S3 doesn't charge the bucket owner when the request is initiated outside of the bucket owner's individual AWS account or the bucket owner's AWS organization.

docs.aws.amazon.com

 


권한 정책 확인하기

 

IAM 계정의 권한이 거부되었을 경우에는 관리자 아이디인 root 계정으로 로그인 한 후

해당 IAM 계정 안의 권한 정책을 확인해야한다.

AmazonS3FullAccess 권한을 부여 받았지만...

 

AmazonS3FullAccess 권한을 가지고 있는 계정이라는 것을 확인하였다.

 

 

각 권한에 대한 정보는 권한을 클릭한 후 정책 버전에 ➕ 모양을 눌러주면 JSON 코드로 확인할 수 있다. 

* 와일드카드

 

 

이후에 IAM 계정의 권한을 따로 추가할 수 있는 만큼 추가하고,

(몇몇 권한은 가질 수 있는 범위를 넘어선 권한으로 추가가 불가능한 경우가 있다.)

S3 Bucket Create 권한을 추가할 수 있는 다양한 방법을 찾아봤지만..

 

.

 

프로젝트 마감이 얼마 남지 않은 상황에서 

S3 권한 정책으로 시간을 보내기에는 효율적이지 않다는 생각이 들었다.

차라리 IAM 계정을 새로 만들고 정책 권한을 새로 만들어서 부여하는 것이 더 빠른 방법이라고 판단했다.

 

user-mozzarello 라는 새로운 IAM 계정을 만들었다.

 

 

새 IAM 계정을 생성한 뒤에 액세스 키를 발급한다.

 

 

 

.csv 파일을 다운로드 하거나 복붙하여 따로 암호를 저장하는 것이 좋다.

 

암호는 미리미리 옮겨서 기록해두는 것이 좋다. 

.csv 파일 다운로드 하는 방법도 있다.

 

 


권한 정책 생성

 

root 계정으로 로그인한 뒤

IAM 메뉴를 검색하고 왼쪽에 있는 정책을 누른다.

오른쪽 노란 버튼 정책 생성을 누른다.

 

정책이 1316개 있다고 나온다.

필요한 정책을 검색하여 추가할 수 있다.

 

 

여기서 필요한 정책이 없는 경우에는 정책을 직접 만들어서 사용할 수 있다.

s3 서비스를 선택

 

 

s3, 혹은 원하는 권한 정책에 관련된 서비스를 검색하여 선택한다.

 

 

 

우리가 필요한 것은 Full Access 이기 때문에 

모든 작업을 체크하고 리소스를 모두로 선택하였다.

 

 

필요에 따라 골라서 선택할 수 있다.

 

선택한 항목이 완료되었다면 다음으로!

내마음대로 커스터마이징 정책! 이런 느낌?

 

정책의 이름을 지어주자. 

그냥 임의로 s3-all-access를 입력해주었다.

 

 

정책 생성을 눌러준다.

 

 

 

!!!!!!!!

🌟 정책 권한 생성 🌟

 

 


IAM > 사용자 > user-mozzarello 

생성된 정책 권한을 새로 만든 IAM 계정에 추가해준다.

 

권한 정책에 추가할 수 있게 되어있다.

 

새로운 버킷을 생성해준 뒤에 해당 버킷에서 버킷 정책을 꼭 확인해준다!

 

편집을 누르면 수정이 가능하다. 
아래의 코드를 추가하였다.

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

 

 

버킷 정책 편집 완료

 

 

 

S3 bucket 생성시 필요한 JSON 코드

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::your-bucket-name"
        }
    ]
}

 

your-bucket-name 에 bucket 이름 넣기
ex) onepick-bucket 

 

 

이제 AWS 설정 완료!

 

 

IAM 계정과 Bucket이 준비되었다.

 

 


디버깅의 중요성 : 완성된 코드도 다시 보자.

 

실행을 하고 API 테스트를 하자마자 빨간 글씨가 주르륵. 예쁘다.

CardAttachmentService의 83. CardService의 67. CardController의 37.

 

 


CardAttachmentService 디버깅

 

 

57번 째 줄, 75번 째 줄, 83번 째 줄, 85번 째 줄, 92번 째 줄에 각각 Break를 걸었다.

 

bucket 이름을 보니  one-pick-s3-bucket ...? 

새로 설정한 bucket의 이름은 mozzarello-s3-bucket 인데...

 

(환경 변수에 mozzarello-s3-bucket 의 Access Key와 Secret Key 로 변경해 준 상태이다.)

버킷 이름을 왜 놓쳤을까?

 

 

구현한 로직대로 첨부파일의 파일명, 확장자, 주소값을 잘 분리해준다.

 

 

계속 릴리스 해준다. 

 

일단은 Bucket 이름이 틀렸으므로 환경 변수 설정을 다시 해준다.

one-pick-s3-bucket  mozzarello-s3-bucket 

 

bucket = mozzarellp-s3-bucket

 

디버깅을 하지 않았으면 놓쳤을. 아주 사소하고 중요한 오류를 알 수가 있었다.

역시 믿을 건 시스템. 컴퓨터 뿐이다!!!

 

 


postman API 호출

 

AWS 설정을 완료하고, 코드도 모두 확인했으니 다시 테스트를 해준다.

 

Intellij를 실행한 뒤에 다시 로그인 해주고

토큰 값을 입력하고 나서 카드 생성에 대한 요청을 보냈다.

 

Request 값

Headers

Key : Content-Type  Value : multipart/form-data 

💡 multipart-form data란?
간단히 설명하자면 서버에 이미지를 전송할 때 쓰는 content-type

 

Body 값은 form-data 형식으로 보내준다.

 

 

추가적으로..  코드! Controller 단을 확인하자.

@RequestPart

@RequestBody는 json으로 들어오는 바디 데이터를 파싱해주는거라 이상하지 않을 수 도 있겠지만 
Http Header에 명시해준 데이터 타입은 multipart-form data.

 

서버에서 multipart-form data Content-type을 받을 때는 

@RequestBody가 아닌 @RequestPart 어노테이션을 사용해야 한다.

 

드디어 201 !!!!!!!

 

201 Created 를 보려고 거의 15시간을 소요했다. 

2024.12.30. 4:45 ~ 2024.12.30. 19:34 

 

 


S3 업로드 완료

 

 

하지만. 끝날 때까지 끝난 것이 아니다. 방심은 금물!

 

S3에 가서 정말로 이미지가 잘 업로드 되었는지 확인하자.

테스트를 한 번 더 했더니.. 두 개의 파일이 업로드 되었다.

 

이제 정말로 성공! 

 

감격스럽다...🥺

짱구도 간절해!

 

 

\\ 간절한 마음을 담아... 오류 해결!!!

 

 

 

 

 

 

 

TIL 12월 30일