S3란?
파일 저장 서비스
이미지 업로드 기능을 구현할 때 저장하는 위치는
EC2 내부 백엔드 프로젝트 폴더 자체에 저장할 수 도 있고
EC2 위의 백엔드 서버 자체가 있는 컴퓨터 내부의 어떤 특정 폴더에 파일을 저장할 수도 있다.
하지만 이렇게 했을 때 EC2가 지저분해지고 용량을 많이 차지할 수 있다.
S3는 파일 저장에 특화된 서비스여서 파일 저장 뿐 아닌 다운로드 및 파일에 대한 부가 기능이 있다.
이런 이유 때문에 S3를 사용한다.
아키텍처 이해하기
이미지 파일 업로드 과정
- 사용자가 파일을 담아서 이미지 업로드 API로 요청을 보낸다.
- 사용자는 주로 웹페이지가 될 수 있고 다양한 루트가 있을 것이다.
- EC2에서 돌아가고 있는 백엔드 서버가 S3에 이미지를 전달해 업로드한다.
- S3에 파일이 저장되면 응답으로 이미지가 어떤 주소에 저장되었다는 URL을 리턴해준다.
- 리턴한 값을 백엔드 서버가 받아서 DB에 이미지가 저장된 URL을 저장한다.
- 즉, 이미지 업로드를 하면 이미지 자체 파일을 데이터베이스에 저장하는 것이 아닌 이미지가 저장된 S3의 주소를 데이터 베이스에 저장하는 것이다.
이미지 파일 다운로드해서 조회하는 과정
- 사용자가 이미지 조회 API로 조회를 요청한다.
- EC2에서 돌아가고 있는 백엔드 서버가 데이터베이스에 조회 SQL을 날린다.
- 응답받은 서버가 사용자에게 정보(이미지 URL)를 반환한다.
- 사용자가 이미지 URL을 사용할 경우 S3로부터 이미지를 다운받기 시작한다.
- 이는 이미지 태그에 주소를 넣어서 쓸 수 있다.
웹페이지로 접속하는 순간 S3로 부터 이미지 파일도 같이 받아와서 웹에 띄어준다.
S3에서만 사용하는 용어
버킷(Bucket)
S3의 하나의 저장소 단위
github의 Repository 같은 존재이다. github에서 여러 Repository를 만들 수 있 듯,
S3에서도 여러 개의 저장소를 만들 수 있는데 여기서 하나의 저장소를 버킷이라 부른다.
객체(Object)
S3 버킷에 업로드 된 파일
S3에 업로드한 파일을 객체라고 부른다.
S3 버킷 생성하기
S3를 검색하고 클릭한다.
버킷 만들기 클릭
버킷이름을 작성한다 (ex. 프로젝트이름-static-files)
그리고 다른 설정은 그대로 두고 차단 설정을 아래와 같이 설정한다.
해당 설정은 S3 객체에 공개적으로 접근(public access)이 가능하도록 만들어 준다.
이는 다른 사람들이 이미지를 다운로드 할 수 있게 만들어 주기 위함이다.
이제 버킷만들기를 클릭하자
버킷 정책
정책(Policy)이란?
권한(Permission)을 정의하는 JSON 문서
AWS는 기본적으로 대부분의 권한이 디폴트로 주어져있지 않다.
AWS의 특정 소스에 접근하려면 권한을 허용 설정해주어야하는데
이 권한을 허용할 때 작성해야 하는 것이 정책(Policy)다.
AWS는 보안적으로 철저하다.
때문에 Public Access를 해주었어도 구체적인 허용 내용을 명시해주어야 한다.
버킷 정책 추가하기
특정 서비스에서 상품 이미지를 모든 사용자에게 보여주고 싶다고 가정한 상태로 진행하자.
그러면 상품 이미지를 다운로드 해서 사용할 수 있어야 할 것이므로 이에 맞게 정책을 추가해보자.
버킷에 들어가서 권한 탭을 들어간다.
버킷 정책의 편집을 누르자.
새 문 추가 선택한다.
이제 권한을 허용해주자.
S3 검색 -> S3 선택 -> getObject 검색 -> getObject 선택 -> 리소스 추가
GetObject: Object는 S3에 올라가는 파일이라 볼 수 있는데 이 Object를 조회할 수 있는 기능을 허용하겠다는 뜻
- 리소스 유형: object
- 리소스 ARN(아마존 리소스 넘버): 아마존에서 존재하는 리소스를 아마존만의 방법으로 표현해놓음
- arn:aws:s3:::instagram-static-files/*
- aws:s3에 있는 여러 리소스들이 있는데 {버킷이름}에 있는 {*}모든 객체에 대해서 리소스 대상을 정한다는 뜻이다.
- arn:aws:s3:::instagram-static-files/*
처럼 작성해주면 된다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Principal": "*", // (추가수정필요)모든 사람에게 권한을 허락 [권한 대상]
"Effect": "Allow", // 권한을 허락할 건데 [권한 허락 여부]
"Action": [ // [어떤 권한]
"s3:GetObject" // s3에 있는 객체 조회(다운로드)에 대해 권한을 허락하겠다.
],
"Resource": [ // [어떤 리소스]
"arn:aws:s3:::{버킷이름}/*" // {버킷이름}에 있는 모든 객체(리소스)들에 대한
]
}
]
}
위처럼 변경하고 저장하면 된다.
IAM 액세스 키 발급 받기
IAM은 AWS 리소스에 대한 액세스 관리를 해주는 서비스다.
즉, S3에 대한 액세스뿐만 아니라 여러가지 액세스를 총괄해서 담당하는 서비스이기도 하다.
백엔드 서버가 S3에 접근해서 파일을 업로드할 수 있도록,
S3에 접근할 수 있는 권한을 받기 위해 IAM이라는 곳에서 권한을 부여받아야 한다.
기본적으로 AWS의 리소스에 아무나 접근을 못하게 막아놨기 때문에 S3에 접근해서 파일을 업로드할 수가 없다.
이전의 작업은 객체를 다운로드 받을 수 있게 허용한 것일 뿐 업로드하는 것에 대해서는 허용을 해놓지 않았다.
백엔드 서버에게만 파일 업로드 권한을 부여해야 한다.
사용자에 들어가 사용자 생성을 누르자.
1단계에서 사용자이름(ex.instagram-server)을 작성해주고 다음을 누른다.
2단계에서
권한 옵션을 직접 정책 연결을 선택한 후 S3Full을 검색하여 체크해주고 다음을 누르고 사용자 생성을 하면 된다.
S3에 접근할 수 있는 모든 권한을 얻겠다는 뜻
사용자 생성이 되었으면 생성한 사용자로 들어간다.
그리고 보안 자격 증명에 들어가 액세스 키 만들기를 클릭한다.
스프링 서버를 사용할 것이기 때문에 AWS 외부에서 실행되는 애플리케이션을 선택해주고 다음을 누르고 액세스 키 만들기를 누른다.
발급된 액세스 키는 따로 저장해두자.
액세스 키는 인증된 사용자에 대해서만 접근을 허용하기 위해 사용되는 인증 키다.(출입증)
'devops > AWS' 카테고리의 다른 글
[AWS] CI/CD Github Actions, SCP로 빌드된 파일 전송하기 (0) | 2024.07.29 |
---|---|
[AWS][EC2] 백엔드 API 서버를 배포하기 - sprint boot 서버 EC2에 배포 (0) | 2024.05.13 |
[AWS][EC2] 백엔드 API 서버를 배포하기 - 탄력적 IP 연결 (0) | 2024.05.13 |
[AWS][EC2] 백엔드 API 서버를 배포하기 - EC2 인스턴스 생성 (0) | 2024.05.12 |