AWS (6) - S3, IAM

임재성·2026년 2월 18일

AWS 기초

목록 보기
7/8

S3

S3란?

  • 서비스를 배포하고 운영하면 백엔드 서버에서 이미지나 문서같은 파일을 저장하고 관리하면서 안정적인 저장소가 필요하다. AWS 에서는 이러한 파일 저장소로 S3를 활용한다.
  • S3는 파일 용량에 제한이 없고 사용자의 필요에따라 자동으로 확장됨.
  • 데이터를 여러 물리적 위치에 분산하여 저장하기 때문에 데이터가 손실될 확률이 아주 희박.

버킷

  • 구글 드라이브에서 공유 드라이브를 여러 개 만들 수 있는 것처럼 S3 에서도 저장소를 여러 개 만들 수 있다. S3에서는 이렇게 만들어진 저장소를 버킷(bucket)이라고 한다.

객체

  • 버킷에 업로드한 파일을 객체(object)라고 한다. 객체는 키-값으로 이루어지는데, 여기서 키는 객체에 할당한 이름, 값은 업로드한 콘텐츠 자체를 의미한다.
    객체의 값은 바이트 형태로 저장됨.

이미지 업로드 과정

  1. 사용자가 EC2 인스턴스에 동작중인 백엔드 서버로 업로드 요청.
  2. EC2에서 S3로 이미지를 업로드
  3. S3에서 저장된 URL 주소 반환
  4. EC2에서 RDS로 반환된 URL 주소 저장.

이미지 다운로드 과정

  1. 이미지 조회 API EC2로 전송.
  2. EC2에서 RDS로 이미지 조회 쿼리 전송.
  3. RDS에서 EC2로 이미지 URL 반환.
  4. 사용자에게 이미지 URL 반환.
  5. 사용자가 URL을 통해 다운로드시 S3를 통해 직접 다운로드.
  • 백엔드 서버 자체에서 이미지를 전달해주는게 아니라 S3에서 직접 다운로드 받습니다.

S3 버킷 만들기

  • S3 콘솔 이동

  • 우측 상단 리전 메뉴 서울 선택

  • 버킷 만들기 클릭

  • 버킷 이름 작성(AWS 전체 내에서 공유해야함 - 이제까지 다른 이름들도 마찬가지)

  • 퍼블릭 액세스 차단 해제
    익명의 사용자도 S3에서 객체를 내려받을 수 있도록 하기 위한 절차.

  • 버킷 만들기 클릭

  • 버킷 생성 완료

    아직 사용자들이 해당 버킷에 접근이 불가능한 상태.

버킷 정책 추가

  • 생성한 버킷 들어가기
  • 권한 -> 버킷 정책 -> 편집
  • 정책 추가(새 문 추가 클릭)
  • 왼쪽에 JSON 형식 이 나타나고, 오른쪽에는 작업 추가 화면이 나옴.
    S3 관련된 권한 추가를 위해 서비스 선택 검색 창에 s3 입력하여, S3 클릭
  • 우측 검색창에 GetObject 입력후 아래 액세스 수준 - 읽기 에서 GetObject 선택후 리소스 추가추가 클릭
    GetObject는 객체를 조회 하겠다는 뜻이며, 파일을 내려받을 수 있는 권한을 허용하는 문구를 추가한 것임.
  • 리소스 추가하기
    리소스 유형에 object를 선택.
    (S3에는 여러 버킷이 있고, 하나의 버킷 안에는 다양한 객체가 존재하는데 경우에 따라 특정 버킷 또는 특정 객체에만 접근하게 설정할 수 있음.)

    object로 선택하면 아래 리소스 ARNarn:aws:s3:::{BucketName}/{ObjectName} 으로 변경되는데,
    BucketName : 접근 허용 버킷
    ObjectName : 접근 허용할 특정 객체(* 를 쓰면 버킷의 모든 객체 허용)

여기서는 * 로 작성

  • 리소스 추가 버튼을 클릭하면 JSON 에 Resource 부분 이 추가된걸 확인
  • 누구에게 권한을 부여할 것인가. 부여대상을 설정하기 위한 속성이 Principal.
    여기서 우리는 모든 사용자에게 이미지를 볼 수 있게 하기위해 * 로 변경.
  • 우측 하단 변경사항 저장 으로 마무리

IAM

IAM 이란?

  • 앞에서 S3의 설정으로 사용자들은 S3에 저장된 파일을 내려받을 수 있게 되었다.
  • 하지만 백엔드 서버는 S3에 접근할 수 없는데, AWS SDK 라이브러리를 사용해 S3와 같은 AWS의 서비스에 요청을 보내는데, 이때 서비스에 접근할 수 있는 권한이 필요하기 때문이다.
  • IAM(Identity and Access Management) AWS 자원에 대한 접근 권한을 제어하는 서비스.
  • IAM의 사용자에게 액세스 키, 비밀 액세스 키 가 주어진다.
    액세스키는 아이디 같은 역할, 비밀 액세스키는 비밀번호 같은 역할을 함.

IAM 액세스키 발급 받기

  • IAM 콘솔 진입
  • 사용자 메뉴 -> 사용자 생성 클릭
  • 사용자 이름 작성(각 사용자 구분 가능한 이름으로)
  • 권한 설정 -> 직정 정책 연결 선택
    권한 정책 -> s3에 대한 접근 권한이 필요하므로 s3full 검색 -> 체크박스 체크 -> 다음 클릭
  • 세부정보 확인후 사용자 생성 클릭
  • 사용자 메뉴로 들어가서 사용자 이름 클릭
  • 보안자격 증명 탭 -> 액세스키 만들기 클릭(우측, 중앙 중 아무거나 동일)
  • 액세스키 모범 사례 및 대안 에서 우리는 AWS EC2에서 실행되는 서비스가 접근할 예정이므로, AWS 컴퓨팅 서비스에서 실행되는 애플리케이션 선택 후 다음 클릭
  • 설명 태그 설정 -> 설정 태그 값 은 비워두고 -> 엑세스 키 만들기 클릭
  • 사진과 같이 생성된 액세스 키가 보임.

    비밀 액세스키의 경우 위에 알림이 뜨는것과 같이 해당 페이지에서 벗어나면 다시는 볼 수 없어서 새로 액세스키를 만들어야 하니 복사해 놓아야 함

백엔드 연동

  • 프로젝트 다운로드
$ cd ~
$ git clone https://github.com/JSCODE-BOOK/aws-s3-springboot.git
$ cd aws-s3-springboot/src/main/resources
$ vi application.yml
  • application.yml 내부
server:
  port: 80
spring:
  datasource:
    url: jdbc:mysql://_________:3306/<DB이름> # RDS 인스턴스 엔드포인트 / DB이름
    username: ______ # (RDS 인스턴스 생성 시 셋팅한) RDS 마스터 사용자 이름
    password: ______ # (RDS 인스턴스 생성 시 셋팅한) RDS 마스터 비밀번호
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
  cloud:
    aws:
      credentials:
        access-key: _________ # IAM 통해서 발급받은 액세스 키
        secret-key: _________ # IAM 통해서 발급받은 비밀 액세스 키
      s3:
        bucket: _________ # 생성한 버킷명
      region:
        static: ap-northeast-2
  • 빌드 및 배포
$ cd ~/aws-s3-springboot
$ ./gradlew clean build -x test # 스프링 부트 프로젝트 빌드
$ cd build/libs
$ sudo nohup java -jar aws-s3-springboot-0.0.1-SNAPSHOT.jar & # JAR파일 실행
  • https://api.<도메인주소>/health 입력

  • PostMan 을 사용할 겁니다.

  • 전송시 사진과 같은 결과가 반환됨.

  • S3 메뉴에서 버킷 클릭시 사진이 업로드 된 걸 확인 가능.

  • 게시글 조회를 위한 GET 요청시 정상 반환 확인

profile
조금씩 앞으로

0개의 댓글