3. AWS S3 - 버킷 생성 및 연동
[참고] AWS>제품>Amazon S3>요금
[참고] AWS>설명서>Amazon IAM>사용 설명서>참조>정책 참조>JSON 요소 참조
[참고] AWS>설명서>Amazon IAM>서비스 승인 참조>참조>작업, 리소스 및 조건 키>Amazon S3
[참고] AWS>설명서>Amazon S3>개발자 안내서>객체, 버킷>Transfer Acceleration
[참고] AWS>설명서>Amazon S3>콘솔 사용 설명서>권한 설정
[참고] AWS>설명서>Amazon S3>API 참조>Common Request Header, Common Response Header, Amazon S3 API Reference>Data Types>Amazon Simple Storage Service>CORSRule
[참고] AWS>설명서>SDK for JavaScript>JavaScript용 AWS SDK, 버전 2-API 참조
[참고] AWS>설명서>SDK for JavaScript>기타 리소스>AWS 코드 예제 리포지토리>s3
[참고] 브라우저에서 바로 AWS S3에 파일 업로드하기
[이전] 2. AWS RDS - DB인스턴스 생성 및 Oracle SQL Developer 접속
[다음] 4. AWS EC2(1) - 인스턴스 생성 및 접속
운영체제(OS) : Windows 10 64bit
개발환경 : JDK 8, Apache Tomcat 8.5, AWS S3, HTML5, JavaScript
개발도구 : Eclipce IDE
JavaScript용 S3에 대한 내용이니 참고.
Amazon Simple Storage Service(S3) 란?
Amazon Simple Storage Service(Amazon S3)는 인터넷용 스토리지입니다. Amazon S3을 사용하면 웹을 통해 언제 어디서든 원하는 양의 데이터를 저장하고 검색할 수 있습니다. 간편하고 직관적인 웹 인터페이스인 AWS Management 콘솔을 사용하여 이러한 작업을 수행할 수 있습니다.
Amazon S3에서는 데이터를 버킷 내에 객체로 저장합니다. 객체는 파일 및 파일을 설명하는 선택적 메타데이터입니다. 파일을 Amazon S3에 저장하려면 버킷에 업로드하십시오. 파일을 객체로 업로드하면 객체 및 메타데이터에 권한을 설정할 수 있습니다.
버킷은 객체의 컨테이너입니다. 하나 이상의 버킷을 가질 수 있습니다. 각 버킷에 대한 액세스를 제어하여 버킷의 객체를 생성, 삭제 및 나열할 수 있는 사용자를 결정할 수 있습니다. Amazon S3가 버킷과 버킷의 콘텐츠를 저장할 지리적 리전을 선택하고 버킷과 해당 객체에 대한 액세스 로그를 볼 수도 있습니다.
AWS 프리 티어
AWS 프리 티어를 사용하는 고객은 Amazon S3를 무료로 시작할 수 있습니다. AWS 신규 가입 고객은 1년 동안 매달 5GB의 Amazon S3 스토리지(S3 Standard 스토리지 클래스), 20,000건의 GET 요청, 2,000건의 PUT, COPY, POST 또는 LIST 요청, 15GB의 데이터 송신 혜택을 받게 됩니다.
프리 티어의 사용량은 매달 AWS GovCloud 리전을 제외한 모든 AWS 리전에서 매달 계산되어 청구서에 자동으로 적용됩니다. 월별 미사용 분은 이월되지 않습니다.
버킷 생성
1) AWS Management Console > S3 선택 또는 검색.
2) S3 Console > 버킷 > 버킷 만들기 클릭.
3.1) 버킷 이름=한글 안됨 , 리전=현재 위치.
-
리전은 현재 위치로 지정. 다른 나라일 시 송수신 속도에 영향이 감.
3.2) 모든 퍼블릭 액세스 차단=체크 해제.
-
SNS나 쇼핑몰처럼 운영자를 제외한 관리자, 사용자가 파일 업로드 후 공개적으로 외부에서 파일을 접근(Read)할 수 있도록 모든 퍼블릭 액세스 차단을 비활성화해야 한다.
3.3) 버킷 버전 관리=비활성화.
-
동일한 파일명이 버킷에 업로드되면 버전별(ID로 구분)로 관리할 수 있지만 용량을 차지하기에 비활성화로 체크한다.
3.4) 태그(선택 사항).
3.5) 서버 측 암호화=비활성화.
-
활성화 시 비 허가된 사용자는 사용 자체가 안되기에 비활성화로 체크한다.
3.6) 객체 잠금=비활성화.
-
파일에 대한 즉각적인 삭제를 위해 비활성화한다. 덮어쓰기는 "파일명_YYYYMMDDHH24MISS.파일확장자"식으로 치환한 뒤 파일 업로드를 진행하면 해결된다.
4) 버킷 생성 확인.
5) S3 Console > 버킷 > 생성한 버킷 클릭 > 권한 탭 클릭 > CORS(Cross-origin 리소스 공유)_편집 클릭 > 아래 JSON 복사 후 편집창에 붙여 넣기 > 변경 사항 저장 클릭.
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedOrigins": ["*"],
"ExposeHeaders": ["x-amz-server-side-encryption", "x-amz-request-id", "x-amz-id-2"],
"MaxAgeSeconds": 6000
}
]
-
브라우저의 Script를 통해 Bucket에 접근하려면 CORS를 설정해줘야 한다.
-
CORS : Cross Origin Resource Sharing의 줄임말로, Cross-Site Http Request를 가능하게 하는 표준 규약이다. 간단히 이야기하면 다른 도메인에서 어떤 http request가 들어왔을 때 이에 어떻게 반응할지를 결정해주는 규칙 문서라고 생각하면 된다.
-
2020년 11월~12월 사이에 모든 정책에 관한 설정 내용이 XML -> JSON으로 바뀌었다.
-
CORS JSON에 대한 내용은 CORS(Cross-origin 리소스 공유)_자세히 알아보기 링크 클릭 > 언어 설정=English. 아래 그림처럼 홈페이지 언어 설정=English로 해야 JSON 내용을 확인할 수 있다. 한국어로 할 경우 XML 내용만 나온다.
6) URL에 https://s3-accelerate-speedtest.s3-accelerate.amazonaws.com/en/accelerate-speed-comparsion.html?region=region&origBucketName=yourBucketName 입력 > 속도 비교.
-
region=현재 리전(ex. ap-northeast-2), origBucketName=평가하려는 버킷 이름.
-
S3에서 제공하는 Transfer Acceleration 속도 비교 도구다. 현재 리전에서 속도를 높인 경우와 그렇지 않은 경우의 업로드 속도를 비교할 수 있다.
-
생성한 버킷>속성 탭>전송 가속화에서 전송 가속화=활성화를 해야 정확한 속도 비교가 가능하나 프리 티어라도 요금이 부과되기에 비활성화 한 것이다.
7) AWS Management Console > Cognito 검색 또는 선택.
8) Cofnito Console > 자격 증명 풀 관리 클릭.
9.1) 리전=S3 Buckey과 같은 리전 > 자격 증명 풀 이름=한글 안됨 , 인증되지 않은 자격 증명에 대한 액세스 활성화=체크 , 기본(Classic) 흐름 허용=체크 해제 > 풀 생성 클릭.
-
일반 사용자도 S3에 접근할 수 있게 인증되지 않은 자격 증명에 대한 액세스 활성화를 체크한다.
-
인증 흐름 설정은 향상된(간소화된) 인증 흐름을 권장하기에 체크 해제한다.
-
자격 증명 풀이 연결된 애플리케이션 ID를 변경할 경우 기존 사용자가 Amazon Cognito를 이용하여 인증할 수 없게 되기에 인증 공급자는 패스한다.
9.2) unauthenticated identities_정책 문서 보기 클릭 > 편집 클릭 > 알림창 확인 클릭 > 아래 JSON 복사 후 편집창에 붙여 넣기 > BUCKET_NAME을 생성한 S3 Buckey 이름으로 수정 > 허용 클릭.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::BUCKET_NAME/*",
"arn:aws:s3:::BUCKET_NAME"
]
}
]
}
10) 자격 증명 풀 생성 확인 > 플랫폼=JavaScript > AWS 자격 증명 얻기 내용 복사 후 보관.
-
만약 아래와 같은 화면이 뜨지 않는다면 현재 선택되어 있는 리전이 자격 증명 풀을 만들 때의 리전과 같은지 확인.
JavaScript용 S3를 이용한 버킷_앨범, 파일 생성 및 삭제
11) Eclipce IDE를 이용하여 웹 페이지상에서 S3를 동작시키기 위해선 필요항목 2개가 필요하다. 필요항목 2개의 내용을 따로 복사하여 보관한다.
-
CDN : AWS>설명서>SDK for JavaScript>JavaScript용 AWS SDK, 버전2-API 참조
-
Source : AWS Github-s3_photoExample.html , AWS Github-s3_photoExample.js
12.1)
Ecliipce IDE 실행 > Ctrl+N > Dynamic Web project 검색 또는 선택 > Project name 입력 > Finish 클릭.
Dynamic Web project 클릭 > Ctrl+N > HTML File 검색 또는 선택 > 생성할 경로 선택 > File name 입력 > Finish 클릭.
Dynamic Web project 클릭 > Ctrl+N > JavaScript File 검색 또는 선택 > 생성할 경로 선택 > File name 입력 > Finish 클릭.
12.2) 우측 상단에 Java EE 클릭 > 하단 Server탭 클릭 > Tomcat Server 우클릭 > Add and Remove... 클릭 > Available 목록에서 생성한 Dynamic Web project 클릭 > Add 클릭 > Configured에 추가된 것 확인 후 Finish 클릭.
-
Project - Clean과 Tomcat Server - Clean, Clean Tomcat Work Directory를 권장한다.
12.3)
생성한 HTML File에 12번 항에서 복사해둔 HTML Source 붙여 넣기 > CDN 링크에 있는 CDN 복사 > HTML Source에 CDN 붙여 넣기.
생성한 JavaScript File에 12번 항에서 복사해둔 JavaScript Source 붙여 넣기 > 11번 항에서 복사해둔 AWS 자격 증명 얻기 내용 var bucketRegion=AWS.config.region의 값, var IdentityPoolId=IdentityPoolId의 값 붙여 넣기.
-
주석 정리한 Source는 아래 파일 참고.
12.4) 앨범 생성, 파일 추가 및 View Test.
-
URL=http://[IP]:[Tomcat Server Port]/[Context]/[파일명.파일확장자]로 접속 > Create New Album 클릭 > Enter Album Name 작성 후 확인 클릭 > 알림창 "Successfully created album." 확인 클릭.
-
파일 추가 없이 Back To Albums 버튼 클릭 시 객체 유형으로 생성, listAlbums 창에 방금 전 생성한 앨범이 나오지 않는다.
-
파일 추가 후 Back To Albums 버튼 클릭 시 폴더 유형으로 생성, listAlbums 창에 방금 전 생성한 앨범이 나온다.
-
앨범 생성 및 파일 추가는 단일로만 된다.
-
앨범을 생성할 때 객체가 먼저 생성, 파일을 추가하면 새로 폴더가 생성되는 것. 아래 그림처럼 앨범 생성 시 test1 객체가 먼저 생성되고 파일을 추가하면 새로 test1 폴더가 생성돼서 test1이라는 이름이 2개가 생긴 것이다.
12.5) 앨범 및 파일 삭제 Test.
-
listAlbums 창에서 삭제하고 싶은 앨범의 'X' 클릭 > 알림창 "Successfully deleted album." 확인 클릭 > 앨범 삭제 확인.
-
웹 브라우저에서 listAlbums는 폴더만 표시되기에 객체는 삭제 불가. S3 Bucket에서 직접 삭제해야 한다.
-
앨범 생성 및 파일 추가 > 삭제할 파일 'X' 클릭 > 알림창 "Successfully deleted photo" 확인 클릭 > 파일 삭제 확인.
-
앨범의 마지막 파일까지 삭제하면 해당 앨범도 같이 삭제된다.
S3 Bucket에서 직접 앨범, 파일 생성 및 삭제
13) S3 Console > 버킷 > 생성한 버킷 클릭 > 폴더 만들기 클릭 > 폴더 이름="/" 빼고 아무렇게 , 서버 측 암호화=비활성화 > 폴더 만들기 클릭.
14) 생성한 폴더 클릭 > 업로드 클릭 > 파일 추가 클릭 > 이미지 파일 아무거나 선택 > 업로드 클릭 > 업로드 성공 시 종료 클릭.
15) 업로드한 파일 클릭 > 객체 URL 클릭 > 접근 거부 확인.
-
객체 URL : Bucket명.s3.리전.amazonaws.com/폴더명/encodeURIComponent(파일명).파일확장자
-
Bucket에서 직접 앨범 생성 및 파일 추가 시 버킷 정잭 미편집으로 인해 파일_권한 탭에서 모든 사람(퍼블릭 액세스)_객체 권한이 없다. Bucket과 JavaScript용 S3에서 이미지 파일 확인 불가.
-
Bucket에서 직접 앨범 생성 후 파일 추가 시 앨범 삭제 방지 객체 파일이 추가되어 있다. Bucket에서 확인할 수 없으며 JavaScript용 S3를 통해 확인이 가능하다. JavaScript용 S3에서 앨범 삭제 방지 객체 파일까지 삭제하면 앨범도 삭제된다.
16)
폴더의 모든 파일 퍼블릭 적용 : 생성한 버킷 클릭 > 폴더 체크 > 작업 > 퍼블릭으로 설정 클릭 > 퍼블릭으로 설정 클릭 > 종료 클릭 > 퍼블릭으로 설정한 폴더 클릭 > 파일 클릭 > 객체 URL 클릭.
파일 단위 퍼블릭 적용 : 생성한 버킷 클릭 > 폴더 클릭 > 원하는 파일 체크 > 작업 > 퍼블릭으로 설정 클릭 > 퍼블릭으로 설정 클릭 > 종료 클릭 > 퍼블릭으로 설정한 파일 클릭 > 객체 URL 클릭.
-
폴더를 퍼블릭으로 설정 적용하면 해당 하위 파일들을 읽을 수 있다. 파일_권한 탭을 보면 모든 사람(퍼블릭 액세스)_객체=읽기 권한으로 수정되어 있다.
마무리
요약 : 버킷 생성 > 버킷_CORS 편집 > Conito_새 자격 증명 풀 생성 > JavaScript용 S3 또는 버킷에서 앨범, 파일 생성 및 삭제.
Spring Framework 기반의 프로젝트에서 AWS S3를 사용할 때 앨범 생성은 버킷에서 폴더 만들기로 추가하면 되고 파일 업로드는 JavaScript용 S3 Source를 사용해 Client-Side에서 처리하면 된다. 파일 업로드 시 덮어쓰기 방지는 위에서 설명했듯이 파일명을 수정한 뒤 파일 업로드를 하면 된다.
개발한 홈페이지에 미리 버킷으로 직접 넣어둔 이미지 파일을 정상적으로 불러오기 위해선 해당 파일이 있는 폴더를 퍼블릭으로 설정해야 한다.
버킷에서 앨범 생성 시 앨범 삭제 방지 객체 파일이 생성되지만 안전을 위해 추가하는 것도 나쁘지 않다. 어차피 일반 사용자, 관리자는 DB 데이터를 기준으로 Client에 보여주기에 운영자가 직접 넣은 파일은 확인할 수 없으므로 노출될 위험이 없다.
JavaScript용 S3 Source를 활용하기 위해선 버킷_CORS과 Conito_자격 증명 풀을 사용해야 된다는 것만 알면 된다.
버킷에서 직접 이미지 파일을 업로드 후 객체 URL을 클릭하면 브라우저상에서 이미지를 보여주는데, JavaScript용 S3는 다운로드가 된다. 버킷에서 두 Case의 이미지 파일의 속성을 비교해보니 버킷에서 올린 이미지 파일의 메타 데이터 값이 image/jpeg이고 JavaScript용 S3는 application/octet-stream로 되어서 그렇다.