간단하게 이미지 서버를 사용하고 싶어서 AWS S3 + API Gateway 조합으로 이미지 다운로드(GET)하는 API를 만들었다.
막상 해보니 어려운 부분이 없었지만, 요 조합이 문서화가 안되어있어서 정보 찾고 설정하는데 꽤 오래걸렸다...🙁
다시는 잊어버리지 않게 문서로 정리해야지🥲
S3 생성하기
AWS S3로 들어가서 "버킷 만들기" 버튼 클릭 후, 버킷 이름과 리전(지역)을 선택한다.
한국에서 서비스할 경우, ap-northeast-2 (서울) 로 지정하면 된다.
Public Access를 따로 설정하지않고, 일반 구성만 설정하면 된다.

IAM Role 생성
이제 API Gateway에서 S3로 접근할 수 있도록 권한을 추가한다.
역할 추가
IAM 서비스로 들어가서 "역할" 메뉴로 들어간다.
역할을 생성하고,
신뢰할 수 있는 엔터티 유형: AWS 서비스
사용사례: API Gateway
다음으로 넘어가준다.

권한 정책 설정도 넘어가주고, 역할 이름 (e.g. APIGateaways3)만 설정한 후 역할 생성을 해주면 된다.
정책 연결
추가한 역할에 들어가서 권한 추가 -> 인라인 정책 연결을 클릭해준다.
서비스 선택에서 S3를 선택하고 하단 읽기 -> GetObject를 선택한다.

특정 버킷에만 접속 가능하게 하고싶다면 리소스 -> 특정 -> object -> ARN 추가 -> bucket에 버킷이름을 작성하면 된다.
정책 생성 후 꼭 ARN 키를 복사해두자 나중에 귀찮으니까
API Gateway 연결
API Gateway 메뉴로 들어가서 API 생성 버튼을 클릭한다.
REST API로 가서 "구축" 버튼을 클릭한다.

API 이름을 설정하고 생성하면 된다.
리소스 경로 설정하기
⚠️ 여기서 설명하는 케이스는 모든 리소스를 가져올 수 있도록 설정하는 방법이다. 특정 폴더에만 접근해야하는 경우, 다른 방식을 사용해야함!
먼저, "리소스 생성"을 누르고 리소스 이름을 {proxy+} 설정한 뒤 리소스를 생성한다.

생성한 리소스를 클릭한 뒤, "메서드 생성"을 누른다.
아래와 같이 메뉴를 채우고, "저장"한다.
| 유형 | 값 |
|---|---|
| 매서드 유형 | GET |
| 통합 유형 | AWS 서비스 |
| AWS 리전 | {S3와 같은 리전(e.g. ap-northeast-2)} |
| AWS 서비스 | Simple Storage Service(S3) |
| AWS 하위 도메인 | (비어두기) |
| HTTP 메서드 | GET |
| 작업 유형 | 경로 재정의 사용 |
| 경로 재정의 | {버킷 이름}/{proxy} |
| 실행 역활 | [아까 복사해둔 ARN 키 입력] |
통합 요청 설정
저장 후 "통합 요청" 탭으로 넘어가서 편집을 한다.

URL 경로 파라미터로 들어가서 proxy ↔ method.request.path.proxy로 설정한다.

그 후 테스트 탭에서 proxy값에 S3 Object 경로를 넣어주면 불러오는 걸 확인할 수 있다.
이진 미디어 설정 & Content-type
img/*같이 바이너리 데이터를 불러오기 위해서는 이진 미디어 유형을 따로 설정해야한다.
API Gateway 설정 메뉴로 들어가서 이진 미디어 유형관리를 클릭한 후, */*을 입력하여 모든 유형을 불러올 수 있게 설정한다.
이후 응답 헤더에 Content-Type을 가져오기 위해 아래와 같이 설정한다.
메서드 응답탭에서 편집을 클릭하고 기본 응답 본문을 삭제한 후, 응답 헤더에 Content-Type을 추가한다.

통합 응답탭을 편집해서 S3에서 응답받은 Content-Type을 매핑한다.

이제 테스트 탭에서 정상적으로 작동하는 지 확인 후 배포하면 된다!
Reference
Tutorial: How to upload files into a S3 Bucket using a REST API via API Gateway 밍가딩가님 블로그 - AWS API Gateway로 S3에 파일 직접 업로드/다운로드하는 API 만들기