[ AWS ] AWS S3 버킷에 NestJS로 이미지 업로드하기 1편. AWS S3 버킷만들고 기본세팅하기
in BackEnd
GCP에서 버킷은 써봤는데 늘 궁금했던 AWS의 S3! 드디어 써봤다 후후
완벽히 혼자 함!
나중에 헷갈릴것 같으니까 기록을 잘 해보도록 하자 (AWS는 한글이 한글이 아닌것 같다. 죄다 뜻이 매칭이 안됨…)
S3으로 들어가서 버킷 만들기
버튼을 클릭하여 버킷을 만든다.
이름이 겹치면 안만들어지니까 알아서 잘 만들기..
리전은 알아서 선택 된다.
객체 소유권
은 사실 나중에 가서 ACL 활성화됨
를 해줘야해서 지금 이 단계에서부터 선택해줘도되지만,
난 하다가 변경했기 때문에 하다가 변경해주는걸로 하겠음
모든 퍼블릭 액세스 차단
이 디폴트로 체크가 되어있을텐데 나는 다 풀어줬다.
이건 상황에 맞게 선택하면 될듯하다 (근데 4개 설명이 뭔 소린지 하나도 모르겠다..)
전체 체크를 해제하면 경고창이 뜨는데 그냥 확인하고 체크 해준다.
딱히 선택한 내용 없음. 그냥 기본 선택사항 그대로 설정해줌
그리고 버킷을 만들면 위 사진처럼 버킷이 생성된다.
버킷 생성은 끝났다! (간단간단)
하지만 여기서 끝나면 말이 안되지^^……….. 아직 한참 남았다
버킷의 권한
에 들어가면 버킷 정책
이라고 있다.
이 버킷 정책은 JSON파일로 작성해야하는데, 일일히 치는게 아니고 제너레이터가 있다.
옆에 보면 정책 생성기
라고 버튼이 있는데 그걸 누르면 새 탭이 뜨면서 아래의 창이 뜬다.
이때 빨간색 박스를 한 부분은 다 작성해서 넣어주어야한다.
우선 select type of policy
는 S3 Bucket Policy
로,
Effect
는 Allow
로,
Principal
은 *
로,
Actions
는 3개를 선택해야한다.
(사실 사진에서는 2개만 선택해야하는데 마지막에 access denied 떠서 이거 추가해주니까 사라짐)
ARN은 버킷만들었을때 바로 위 사진에 버킷ARN
이라고 있는 내용을 붙여넣으면 된다
Add Statement
버튼이 활성화가 되면 클릭하도록 한다.
그러면 노란색 박스에 있는 내용들이 생성이 된다.
(사진에는 Action
에 GetObject
와 PutObject
만 있는데, 하나 더 추가해주어야 한다. 추가할 내용은 포스팅 거의 끝자락에 있다)
그리고 Generate Policy
버튼을 누르면,
이렇게 JSON 이 생성된다.
전체 복사 해서
붙여넣는다.
그리고 변경 사항 저장
버튼을 누르면
에러가 뜰거다. (Action does not apply to resource(s) in statement
)
이 에러는 버킷안의 경로에 대한 리소스 상태를 명확하게 명시해주지 않아서 생기는 에러다.
이때는, JSON 파일안에 "Resource"
키의 값에 보면 내 버킷의 ARN이 들어있을텐데, 이 뒤에 '/*'
을 추가해주면 된다.
그러니까 ,
"Resource": "arn:aws:s3:::test-sorabucket/*"
이런식으로
버킷 루트 하위에 있는 모든 폴더들에 적용시킨다는 말이다
이제는 IAM
에 들어가서 소유권자를 지정하고 엑세스 키를 발급받아야한다.
사용자 추가
버튼을 클릭한다
이름을 지정하고 다음 버튼을 클릭하면
권한 경계
가 있는데, 권한 경계는 토글로 접혀있다. 토클을 펴주어야 함
권한 경계를 사용하여 최대 권한 제어
체크박스를 클릭하고,
권한 정책에 AmazonS2FullAccess
를 검색한다.
그럼 하나가 나올텐데 그 라디오버튼을 클릭한뒤 다음으로 넘어간다
그리고 사용자 생성
버튼누르면 우선은 사용자 생성은 끝!
사용자 생성을 끝내면 바로 생성된 생성자 페이지가 뜰텐데, 거기서 권한
으로 들어간다
그리고 조금 밑으로 내려가면 엑세스 키
라는 구간이 있는데, 거기서 액세스 키 만들기
버튼을 클릭한다.
그리고 AWS 외부에서 실행되는 어플리케이션
을 선택하고 다음을 누른다
설정태그
는 옵션이니까 패스
그러면 액세스 키
와 시크릿 키
가 생성되고, 아래에는 .csv 파일 다운로드
버튼이 생성된다.
액세스 키와 시크릿 키는 .env
파일에 넣어서 보관해야한다.
이걸로 NestJS에서 권한을 가지고 있다는걸 증명해야하기때문에 잘 보관하기!
( git에 올리면 요금 폭탄 맞는단다. 제발 git 올릴때 어떤 파일이 올라가는지 확인 하고 올리기 )
액세스 키를 만들면 이렇게 생성되었다는 표시가 뜨는걸 확인할 수 있다
다시 S3으로 돌아와 버킷으로 돌아오면, 객체 부분에다가 바로 올려도 되지만 나는 image폴더
를 만들고
그 안에 다시 user
라는 폴더를 만든다음에 그 user폴더에 이미지를 올리려고 한다
(이건 그냥 개개인 맘이니까 알아서 해주기)
폴더 만들기
버튼을 클릭해서 폴더를 만든다
만들고 나면 만든 폴더안으로 들어가지게 된다. 다시 user폴더 만들기
원하는대로 경로가 잘 만들어진걸 볼 수 있다.
NestJS에서 이미지 올리는 코드는 다음편에 작성할거지만,
했다고 가정하고 postman으로 post요청을 하게 되면 에러가 뜬다.
The bucket does not allow ACLs
라는 에러.
ACLs을 활성화를 안해줘서 그럼.
다시 S3 버킷으로 돌아가보자.
권한에서 조금 더 밑으로 내려가면 ACL 가 있는데, 지금은 비활성화라서 편집버튼이 비활성화 된것을 확인할 수 있다.
이 편집버튼을 활성화시켜주려면 버킷 소유자 적용
링크를 클릭한다.
그러면 객체 소유권을 다시 설정할 수 있고,
여기서 ACL활성화됨
을 선택하고 밑에 경고창이 뜨면 ACL이 복원된다는 것을 확인한다
는 체크박스를 클릭한다.
그리고 변경 사항 저장
을 클릭한다.
그리고 나면 편집
버튼이 활성화 된걸 확인할 수 있다.
편집버튼을 누르고 들어가면 모든 사람(퍼블릭 엑세스)
는 읽기
로 허용해준다.
그래야지 사진을 올렸을때 모두가 읽을 수 있기 때문에!
근데 그러고 나서도 postman으로 요청을 하게 되면 에러가 날거다
AccessDenied: Access Denied
에러 (이것도 진짜 오래걸려서 해결법을 찾았다..)
바로 버킷 정책 설정하는 JSON에 하나가 부족해서 그런건데, 바로 PutObjectAcl
을 넣어주지 않아서 그렇다.
그래서 그 JSON에서 바로 수정해서 "s3:PutObjectAcl"
을 넣으면 아무 문제 없이 업로드 된다!