💬 S3가 뭘까??
파일 저장 서비스를 제공하는 S3는 사진이나 동영상 같은 다양한 파일을 저장할 수 있다. 마치 iCloud같은 것이라고 생각해보면 된다
왜 S3를 사용하는 걸까?
우리가 서비스를 구성하면 이미지를 저장하는 경우가 굉장히 많다. 그렇다면 그 많은 이미지를 어딘가에 저장을 해야하는데 어디로 저장을 해야할까? 가장 먼저 생각나는 것은 컴퓨터 내부에 저장하는 것이다. 하지만 이는 조금만 많이 데이터가 쌓여도 컴퓨터 저장공간에 문제가 발생할 수 있다는 것을 알 수 있다.
그래서 우리는 외부에 굉장히 넓은 저장 공간에 파일을 저장하기로 했다. 마치 우리가 핸드폰에 우리의 사진을 저장하는 것이 아닌 naver cloud, iCloud 같은 곳에 저장하는 것처럼 말이다. S3는 그것처럼 사용된다고 생각하면 된다. S3는 그뿐이 아니라 파일을 다운받는 것에 대해서도 최적화가 되어 있다.
💬 S3를 통해 사용자가 이미지, 파일을 불러오는 법
그렇다면 S3를 이용해서 어떻게 데이터를 저장하고 어떻게 클라이언트는 S3의 사진을 가져오는 건지 확인해보자
● 서버가 이미지 파일 업로드 하는 과정
- 사용자는 이미지 업로드를 요청하는 API를 요청한다
- 서버(EC2)에 해당 API를 받으면 S3에 저장하고 반환값으로 URL을 반환받는다.
- 서버(EC2)는 RDS에 데이터를 저장하는 것으로 마무리 된다.
● 사용자가 이미지를 가져오는 과정
- 서버(EC2)에 이미지를 요청한다.
- 서버(EC2)는 RDS에 저장된 URL을 사용자에게 반환한다
- 클라이언트는 URL로 S3에서 이미지를 다운받는다.
💬 S3 버킷 생성
용어 정리
S3는 특정 용어를 사용하는데 바로 버킷과 객체이다. 이 말이 뭘까?
- 버킷
- 깃헙을 보면 여러 개의 Repository를 만들수 있다. 그 Repository가 S3에서 버킷인 셈이다.
- 객체
- S3에 업로드 한 파일을 보고, S3에서는 파일이라 부르지 않고 객체라고 부른다. 즉, S3에 업로드 된 파일을 객체라고 부른다
생성 시작
당연히 S3를 검색하여 들어가서 버킷만들기를 클릭한다. 아까 용어 설명에서도 말했지만 버킷은 저장소라는 것이다.
- 일반 구성을 통해 이름을 정해준다
- 중요한 것은 여기다
우리는 이곳에 사진이나 파일을 저장하고 나도 사용하고 외부의 사용자도 사용할 예정이다. 때문에 퍼블릭의 요청을 차단하면 문제가 발생한다. 그리고 위에 ACL 비활성화라는 것이 보이는데 ACL이 뭘까?
ACL이란?
ACL(Access Control List)
보안 그룹과 비슷하게 들어올때 검증을 하는 역할이다. 하지만 두개의 차이점은 명확하다
- 단위가 서브넷이다. EC2는 인스턴스단위로 보안그룹을 결정한다
- Stateless하다.
- 보안그룹에서는 들어간 요청을 기억하기 떄문에 outBound에서 딱히 설정을 걸지 않아도 되지만 ACL은 stateless하기 때문에 기억을 하지 못한다. 그래서 OutBound를 따로 설정해주어야 한다
- 허락과 거절이 따로 설정이 가능하다.
- 보안그룹은 무조건 허락이다. 거절을 따로 설정하지 못한다. 하지만 ACL은 특정 요청 IP를 deny할 수있다.
사실 만드는 것은 매우 간단하다. 이제 버킷 만들기를 통해 생성을 해보자
버킷에 정책 추가하기
정책이란??
권한을 정의하는 JSON 문서이다. AWS는 기본적으로 대부분의 권한이 없다. AWS의 특정 소스에 들어가기 위해서는 권한이라는 것을 작성해주어야 하는데 그때 작성하는 것이 정책(Policy)이다.
아까도 말했다시피 사용자는 내가 S3에 등록한 상품의 이미지들을 불러올 것이다. 그러면 사용자가 나의 버킷에 들어와서 이미지 파일을 조회할 수 있게 정책을 만들어보자
- 우선 내가 만든 S3로 들어가서 권한탭으로 들어간다. 그러면 밑에 버킷 정책이라는 것이 보이고 그곳을 편집하기를 눌러서 변경을 해줄 것이다
- 아까도 말했다시피 JSON방식으로 작성할 것이기 때문에 새로운 JSON을 추가해주어야 한다.
편집에 들어가서 잠시 기다리면 문편집이라는 것이 나온다. 거기에 + 새 문 추가를 눌러준다
- 이런식으로 나타날텐데 우리는 S3에 관한 정책을 추가시켜주는 것이기 때문에 s3를 검색한다.
- 그리고 작업 필터링에서 조회와 관련된 작업 getObject를 눌러준다
- 그리고 마지막으로 리소스 추가를 눌러준다
- 그럼 이러한 화면이 나오는데 리소스 유형은 object(파일)이고 ARN을 설정해 주어야 한다
- BucketName : 내가 만든 bucket의 이름
- ObjectName : 등록할 모든 파일 ( * ) 로 설정하면 된다
- 여기서 잠깐!!
ARN은 AWS네 존재하는 리소스를 표현하는 문법이다.
- 이게 완성된 정책을 볼 수 있는데 Principal을 "*"로 변경해주어야 한다. 모든 권한을 뜻한다. 권한을 따로 경계 해두지 않는다는 뜻이다
정책 구문 내용 정리해보기
문구를 정리 해볼것인데 key값으로 말해보자
나는 내 버킷에 "들어오는 모든 사람(Principal)"에게 "버킷에 있는 모든 파일(Resource)"을 "다운로드하는 것(Action)"을 "허용(Effect)"할 것이다.
이렇게 마지막으로 저장까지 해주면 나의 S3 버킷에 대한 정책이 저장된 것을 확인 할 수 있다
💬 IAM 설정해보기
우리가 앞서서 설정을 허용한것은 파일을 조회(다운로드)하는 것을 허용했다고 했다. 하지만 가장 중요한 S3에 파일을 업로드하는 것에 대한 것을 설정해놓지 않았다. 내껀데 왜 내가 못해?? S3입장에서는 어떤 요청이 나의 요청인지 알 수가 없기 때문이다. 리소스를 생성하면 AWS는 기본적으로 그 누구도 접근을 할 수 없게 하기 때문에 어떤 요청이 나라는 것을 알려야 한다. 그래서 S3에 접근하는 권한을 등록하기 위해 IAM을 사용해보려 한다
- 역시 처음의 과정은 검색창에 IAM을 쳐서 들어가는 것 부터 시작한다
- 내가 만들 서버의 액세스를 줄 예정이기 때문에 사용자 탭에 들어간다
- 그리고 사용자 생성에 들어가서 사용자 이름을 설정한다.
- 기본적으로 그룹에 사용자를 추가하는 것이 클릭되어 있을텐데 "직접 정책 연결"로 바꿔주자
- 당연히 지금 만드는 사용자는 나의 백엔드 서버로써 나의 리소스 중 S3를 접속할 수 있게 만들것이고 당연히 S3의 모든 접근권한을 줄 예정이기 때문에 권한 정책은 FullAccess로 주면 된다
- 그리고 다음으로 누르고 사용자 생성까지 누르면 완성이다
엑세스 키 제작
그렇다면 다시 사용자탭에서 없던 사용자가 하나 나올텐데 이녀석의 액세스 키를 만들어주어야한다.
- 탭에 들어가면 이렇게 액세스 키를 만들수 있다
- 나의 서버는 당연히 Spring Boot(외부에서 실행되는 애플리케이션)으로써 만들어지기 때문에 사용사례를 잘 잡아주어야한다 그리고 다음으로 눌러준다
- 다음으로 가면 설명을 하라는게 나오는데 굳이 안해주어도 된다.
- 여기가 제일 중요하다. 키가 나오는 곳은 무조건 보안을 강화하고 꼭 저장해두는 것이 좋다. 그리고 액세스키 밑에 설명을 보면 분실하거나 잊어버리면 다신 못보는거야 라고 적혀있다. 물론 테스트하는 상황에서 뭐...한번 더 하면되지 라고 생각하면 되지만 실제 서비스로 들어가면 꽤나 두려울것이다. 어쨌든 조심해서 잘 기억할 수 있는곳에 두자
- 만약 저장할 자신이 없다면 하단에 .csv 파일 다운받기 하면 된다 그곳에 두개의 액세스 키가 저장된 것을 볼 수 있다
💬 S3의 기능을 확인하기 위해 서버를 구성
이곳에 모두 적는 것은 너무 비효율적이라서 글을 하나 새로 작성했다. 밑의 글을 보고 따라서 한번 제작해보는게 좋을거 같다. 이 글에 테스트까지 모두 되어 있어서 이글을 보면 된다.
AWS를 위해 S3를 Spring에 연동하기
💨 S3 연동하기아마 S3관련해서 글을 보다가 넘어왔을 확률이 높다고 생각한다. 혹여 혹시라도 그런게 아니라면 이전의 글에서 S3를 등록하는 방법도 적어놓았으니 한번 보고오는것도 좋을것 같
latewalk.tistory.com
EC2를 이용해서 등록까지는 하지 않았다. S3와 연동이 잘되는지 확인하고 저장이 잘 되는지 확인을 하기 위해 만든 것이기 때문에 EC2로 옮기더라도 설정만 잘 해주면 손쉽게 적용할 수 있다.
프론트 엔드가 데이터를 가져올때
위에 과정을 모두 거쳤다면 이미지가 url 방식으로 저장이 되었을테고 그것을 저렇게 이미지로 불러오면
이렇게 잘 불러오는 것을 확인할 수 있다. 이미지가 사용자에게 존재하지 않고 서버에도 존재하지 않지만 S3에 저장하면서 URL을 불러오는 것만으로 파일을 사용할 수 있는 것이다.
'AWS' 카테고리의 다른 글
🗃 S3를 이용한 정적 웹 사이트 호스팅 그리고 CloudFront(feat. CDN) - 2부 (0) | 2024.06.08 |
---|---|
AWS를 위해 S3를 Spring에 연동하기 (1) | 2024.06.08 |
🗃 VPC를 활용해서 RDS를 연결해보자 (0) | 2024.06.07 |
🗃 ELB를 통해 HTTPS 설정하기 (0) | 2024.06.06 |
🗃 도메인 구성 DNS, 그리고 Route 53 (0) | 2024.06.06 |