S3 이미지 업로드
S3를 연결하여 이미지를 포함한 각종 파일(jpg, jpeg, png, pdf, csv)을 올리는 로직을 작성하였다.
postman에서 form-data에 데이터를 담아 요청을 보냈는데,
S3 Full Access 권한을 가지고 있음에도 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 계정을 생성한 후에, 버킷에서 아래와 같이 옵션을 선택하여 버킷을 생성하였다.
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가 된 것일까?
권한 정책 확인하기
IAM 계정의 권한이 거부되었을 경우에는 관리자 아이디인 root 계정으로 로그인 한 후
해당 IAM 계정 안의 권한 정책을 확인해야한다.
AmazonS3FullAccess 권한을 가지고 있는 계정이라는 것을 확인하였다.
각 권한에 대한 정보는 권한을 클릭한 후 정책 버전에 ➕ 모양을 눌러주면 JSON 코드로 확인할 수 있다.
이후에 IAM 계정의 권한을 따로 추가할 수 있는 만큼 추가하고,
(몇몇 권한은 가질 수 있는 범위를 넘어선 권한으로 추가가 불가능한 경우가 있다.)
S3 Bucket Create 권한을 추가할 수 있는 다양한 방법을 찾아봤지만..
.
프로젝트 마감이 얼마 남지 않은 상황에서
S3 권한 정책으로 시간을 보내기에는 효율적이지 않다는 생각이 들었다.
차라리 IAM 계정을 새로 만들고 정책 권한을 새로 만들어서 부여하는 것이 더 빠른 방법이라고 판단했다.
새 IAM 계정을 생성한 뒤에 액세스 키를 발급한다.
암호는 미리미리 옮겨서 기록해두는 것이 좋다.
.csv 파일 다운로드 하는 방법도 있다.
권한 정책 생성
root 계정으로 로그인한 뒤
IAM 메뉴를 검색하고 왼쪽에 있는 정책을 누른다.
정책이 1316개 있다고 나온다.
필요한 정책을 검색하여 추가할 수 있다.
여기서 필요한 정책이 없는 경우에는 정책을 직접 만들어서 사용할 수 있다.
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
IAM 계정과 Bucket이 준비되었다.
디버깅의 중요성 : 완성된 코드도 다시 보자.
실행을 하고 API 테스트를 하자마자 빨간 글씨가 주르륵. 예쁘다.
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
디버깅을 하지 않았으면 놓쳤을. 아주 사소하고 중요한 오류를 알 수가 있었다.
역시 믿을 건 시스템. 컴퓨터 뿐이다!!!
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 Created 를 보려고 거의 15시간을 소요했다.
2024.12.30. 4:45 ~ 2024.12.30. 19:34
S3 업로드 완료
하지만. 끝날 때까지 끝난 것이 아니다. 방심은 금물!
S3에 가서 정말로 이미지가 잘 업로드 되었는지 확인하자.
이제 정말로 성공!
감격스럽다...🥺
\\ 간절한 마음을 담아... 오류 해결!!!
TIL 12월 30일
'TIL (ToDay I LearNEd) > K P T (keeP, pRoBlem, Try) & 트러블슈팅' 카테고리의 다른 글
심화 프로젝트 KPT 회고 (0) | 2024.12.31 |
---|---|
[Spring_JPA] N+1 문제 해결 방법 (1) | 2024.12.19 |
아웃소싱 프로젝트 KPT (0) | 2024.12.08 |
[Spring] Cookie 생성 오류 (0) | 2024.12.07 |
은행 환전 개인과제 트러블 슈팅_TIL (1) | 2024.11.29 |