Welcome! Everything is fine.

[AWS] 🪣S3 시작하기 - bucket 만들기, bucket policy 설정, 정적 웹 사이트 호스팅, EC2에 S3 권한 주기 본문

TIL

[AWS] 🪣S3 시작하기 - bucket 만들기, bucket policy 설정, 정적 웹 사이트 호스팅, EC2에 S3 권한 주기

개발곰발 2025. 3. 21.
728x90

S3(Simple Storage Service)란?

  • Amazon S3는 정적 웹 사이트 호스팅, 온라인 백업, 데이터 아카이브, 기업 애플리케이션, Big Data 분석 등 다양한 용도로 사용된다.
  • 버킷(Buckets) : 데이터를 저장하는 가장 상위 레벨의 폴더 형태의 컨테이너. S3에 저장되는 파일들을 ‘객체’라고 부르고, 모든 객체는 ‘키’(디렉토리)로 식별된다.
  • 버킷 이름 규칙
    • 대문자와 언더스코어 사용 금지
    • 길이 제한: 3자 이상, 63자 이하로 작성
    • 소문자, 숫자, 점(.) 그리고 하이픈(-)만 사용 가능
    • 반드시 문자 또는 숫자로 시작하고 끝내기
    • 두 개의 점(.) 연속 사용 금지
    • IP 주소 형식 사용 금지

S3 시작하기

버킷 만들기

Create bucket을 눌러 버킷을 생성해보자!

 

이름만 정하고 다른 옵션은 일단 그대로 두었다. 버킷의 이름은 global unique 하기 때문에 이미 있는 이름인 경우가 많다. 버킷 생성이 안된다면 이름 때문인지 확인해보자.

 

버킷 생성이 완료되면 다음과 같이 리스트에 나타난다. 해당 버킷의 AWS Resion은 서울인 것을 알 수 있고, 다른 Regon인 버킷이 추가되더라도 이 리스트에서 모두 볼 수 있다.

버킷에 파일 직접 업로드 하기

버킷 안에 들어가면 다음과 같이 되어있는데, 맨 오른쪽 Upload를 누른다.

들어가서 Add File을 통해 아무 파일이나 올린 후 Upload를 누른다.

 

그러면 이렇게 정상적으로 파일이 업로드되었음을 알 수 있다.

 

파일명을 눌러보면 다음과 같이 뜨는데, Object URL과 Open을 각각 눌러서 비교해보자.

 

각각 눌러서 보니 다음과 같은 차이점이 있다. 현재 접근 권한이 없어 아래과 같이 나오는데, 왜 Open을 누르면 제대로 보일까? 이 있는데. Open을 누르면 S3에서 만들어진 pre-signed URL이라는 것을 자동으로 만들어준다. pre-signed URL은 권한이 없어도 권한을 만들어주는 URL이라서 두번째처럼 접근이 가능하다.

Object URL로 들어갔을 때
Open으로 들어갔을 때

폴더 만들기

이제 폴더도 만들어보자. 다시 버킷에 들어가서 Create folder를 누른다.

 

폴더 이름을 적을 때는 /가 뒤에 자동으로 들어가기 때문에 /를 붙이지 않아도 된다. 폴더 이름을 적고 Create folder를 누른다.

그럼 이렇게 폴더가 완성되고, 이 안에서도 파일을 업로드할 수 있다.

버킷 폴리시(Bucket Policy)

버킷 폴리시란?

  • 버킷 폴리시(Bucket Policy) : IAM 정책과 유사한 JSON 형식의 문서. S3 버킷과 그 안의 객체에 대한 접근 권한을 제어하는 역할을 한다.
  • 특징
    • 버킷 내 모든 객체에 대한 접근 제어
    • 특정 객체 또는 특정 객체 그룹에 대한 접근 제어
    • 허용할 IP 주소 또는 IP 대역을 지정해 특정 위치에서만 접근이 가능하도록 설정
    • 접근할 수 있는 리소스의 범위를 지정해 필요한 리소스만 접근하도록 제한
    • 암호화된 연결(SSL/TLS)을 사용하도록 강제 가능

버킷 폴리시 적용하기

버킷에서 Permissions에 들어간다.

 

Block public access도 모두 on이고, Bucket policy도 아예 작동하지 않는 것을 볼 수 있다.

 

먼저 Block public access에 들어가서 Block all public access에 되어있던 체크박스를 해제한다. 버킷을 만들 때 있었던 부분인데 이렇게 따로 설정을 바꿀 수 있다. 설정을 바꾼 후 Save changes를 누른다.

그럼 이렇게 off 된 모습을 볼 수 있다.

 

이제 Bucket policy에 들어가서 Bucket ARN을 복사한 후, Policy Generator로 들어간다.

 

Policy Generator에서 다음과 같이 설정해준다. Principal은 전체를 대상으로 하기 위해 * 를 적었다. ARN에는 들어오기 전 복사한 ARN을 붙여넣기 한다.

 

Actions는 줄 권한을 설정하면 되는데, 나는 읽기 권한을 위해 GetObject를 선택했다.

 

다 작성했다면 Add Statement를 누르고, Generate Policy를 누른다.

 

그럼 다음과 같은 JSON 형식의 Policy 문서가 뜨는데, 복사해서 Bucket policy에 붙여넣기 한다.

 

여기서 수정해야 할 점은 버킷 안에 있는 모든 것에 대한 권한이기 때문에 "Resource": "arn:aws:s3:::my-gom-bucket"가 아니라 "Resource": "arn:aws:s3:::my-gom-bucket/*"로 바꿔야 한다.

 

이렇게 모두 설정을 마치고 Object URL로 들어가니 이전과 달리 이미지가 잘 나오는 모습을 볼 수 있다.

정적 웹 사이트 호스팅

정적 웹 사이트 호스팅을 해보기 위해 html 파일을 버킷에 업로드했다.

 

업로드 후 버킷에서 Properties에 들어간다.

 

맨 아래 Static website hosting에서 Edit을 누른다.

 

다음과 같이 세팅을 해준다. index document에서는 내가 올린 html 파일명을 적어준다.

 

그럼 이렇게 Bucket website endpoint가 뜨게 되는데, 들어가보면 내가 올린 html 파일의 내용과 같다는 것을 알 수 있다. 만약 제대로 뜨지 않는다면 Bucket policy를 잘 설정했는지 확인하자.

 

정상적으로 뜬다!

EC2에 S3 권한 주기

EC2에 S3 권한을 주기 위해서는 IAM Role을 적용해줘야 한다. IAM - Role에 들어가서 Create role을 클릭한다.

 

Use case에 EC2 선택 후 다음으로 넘어간다.

 

검색창에 S3를 입력 후 AmazonS3FullAccess를 체크한다. 혹은 특정 버킷에만 권한을 주는 커스텀 정책을 만들 수도 있다. 그 다음 Role의 이름을 정하고 Create role을 눌러 생성한다.

 

다음과 같이 새로운 role이 생성된 것을 볼 수 있다.

 

이제 내 EC2 인스턴스로 와서 Actions - Security - Modify IAM Role을 누른다.

 

방금 만든 ec2-s3-access-role을 선택하고, Update IAM Role을 눌러서 저장한다.

그럼 이제 EC2가 S3 접근 권한을 갖게 되었다. 따라서 application.properties(혹은 application.yml)에 access-key와 secret-key를 작성할 필요가 없다. Role을 달면 EC2 인스턴스 메타데이터에서 자동으로 임시 키를 발급받아서 AWS 접근하게 된다.