S3란 Simple Storage Service의 약자로 AWS에서 처음으로 런칭한 서비스입니다.
S3는 AWS에서 처음으로 런칭한 서비스인 만큼 수많은 과정을 거치면서
기능이 향상되었고 알아야 하는 내용도 많습니다.
S3의 첫 번째 특징은 S#는 안전하고 가변적인 Object 저장 공간을 제공한다는 것입니다.
AWS에서 모든 파일에 일종의 안전장치를 두어서 외부에서 접근할 수 없도록 만들어주기 때문에
우리는 더욱 안전하게 사용할 수 있습니다.
여기서 가변적이라는 것은 우리가 따로 저장 공간의 크기를 수정하지 않더라도
알아서 크기를 키웠다, 줄였다 하는 것입니다.
또한, 중요한 사실은 바로 Object 저장 공간이라는 것입니다.
이건 말 그대로 Object.
즉,이미지, 동영상 파일 같은 것들만 업로드할 수 있다는 겁니다.
따라서 OS와 같은 것들을 업로드해서 사용할 수 없다는 것을 의미합니다.
실제로 AWS 콘솔에서 S3에 직접 접속해 보시면 꽤 친숙하게 꾸며져 있습니다.
하지만, 불편한 부분도 분명 존재합니다.
S3는 파일의 크기를 파일당 최대 5TB까지 지원합니다.
S3의 저장공간은 무제한입니다.
이건 위에서 말씀드린 가변적이라는 내용과 연관이 있는데요.
우리가 직접 파티션의 크기를 변경하거나 디스크의 크기를 할당할 필요가 없이
우리는 그냥 파일을 엄청하게 올려도 괜찮다는 뜻입니다.
실제 하드디스크와는 다르게 방대한 양의 파일들을 업로드하여 보관할 수 있습니다.
S3는 Bucket 이라는 이름을 사용하는데요. 이건 디렉토리와 거의 유사한 구조를 가집니다.
또한, 우리가 폴더에 이름을 부여해주는 것과 같이 직접 버켓에 이름을 부여해줄 수도 있습니다.
이것은 쉽겍 말해서 Bucket의 이름은 고유해야 한다는 뜻입니다.
이전에 IAM 게시글에서 말씀드린 것과 같이 S3 또한 글로벌로 지정되어 있습니다.
즉, region과 상관없이 Bucket의 이름은 고유해야 합니다.
앞서 S3는 Object 저장공간이라고 했습니다.
그럼 이 Object의 특징에 대해서 간단히 살펴보겠습니다.
우선 Object는 <Key, Value> 형태를 지니고 있으며,
Key는 파일명, Value는 그 파일에 대한 데이터라고 이해하시면 됩니다.
Version ID는 S3의 고유 특징입니다.
우리가 똑같은 파일인데 다른 버전으로 올릴 수 있게 해주는 것입니다.
따라서, 나중에 이전으로 돌아갈 때 이 버전을 통해ㅐ서 쉽게 복원시킬 수 있다는 것을 의미합니다.
Metadata는 데이터의 데이터를 의미합니다.
즉, 파일을 언제 업로드 하였는지 그리고 이 파일의 오너가 누구인지 등
이러한 파일에 대한 다양한 정보들이 담겨 있습니다.
물론 우리가 직접 메타데이터를 수정할 수도 있습니다.
CORS를 간단하게 설명드리자면 한 Bucket의 파일을 다른 Bucket에서 접근할 수 있도록 해주는 기능입니다.
물론 지역도 무시하고 접근할 수 있도록 해줍니다.
우리는 S3 Bucket에 파일을 업로드할 때 PUT을 사용합니다.
파일이 S3 Bucket에 업로드 된다면 우리는 그 파일을 즉시 사용할 수 있습니다.
즉, S3 Bucket에 올라가면 또 다른 과정이 없어 딜레이가 없다는 것입니다.
Eventual Consistency는 PUT과 달리 Update 와 Delete를 사용하여
Bucket에 올라간 파일의 내용을 변경하거나 삭제할 때
그 결과가 바로 나타나지 않습니다.
S3는 우리가 알고 있는 단순한 하드디스크의 개념을 넘어서 다양한 유형이 존재합니다.
그렇기 때문에 용도와 목적에 따라서 적합한 스토리지를 선택하여 사용해야 합니다.
이를 위해서 S3의 다양한 스토리지 유형에 대해서 알아보겠습니다.
S3를 사용하기 위해서는 먼저 AWS 콘솔에서 S3를 검색해줍니다.

S3 대시보드를 들어가면 저 같은 경우는 과거에 Bucket을 만든적이 있기 때문에 Bucket이 존재합니다.
그리고 앞서 말씀드린 것처럼 S3는 IAM과 마찬가지로 글로벌 서비스이기 때문에 모든 지역을 다같이 공유하고 있습니다.
우측 상단을 보시면 지역 정보가 글로벌로 표시된 것을 보실 수 있습니다.

그럼 이제 버킷을 한 번 만들어 보겠습니다.
우측 상단의 [버킷 만들기] 버튼을 눌러줍니다.
우선 첫 번째로 버킷의 이름을 지정 해주어야 하는데요.
이는 지역과 상관없이 고유한 이름을 지정 해주어야 합니다.
-> 글로벌 서비스이기 때문에 다른 지역이라고 같은 이름을 줄 수는 없습니다.
저는 버킷의 이름을 moon-awslearner-s3-bucket 라고 주겠습니다.

그 다음에 객체 소유권이 나옵니다.
ACL을 활성화할지 안할지에 대해서 물어봅니다.
저는 ACL을 비활성화 함으로써 Root 유저를 제외한 AWS 사용자 누구도 이 버킷 소유권을 가질 수 없습니다.
따라서, 객체 소유권은 버킷 오너만 가집니다.

다음으로는 퍼블릿 액세스 차단 설정입니다.
아래와 같이 체크박스에 선택이 되어 있다면, 우리가 만들 버킷은 외부로부터 접근이 불가능해집니다.
쉽게 말한다면 다른 사람들이 버킷에 들어있는 데이터를 읽거나 업로드 할 수 없다는 것입니다.

다음으로는 버킷 버전 관리입니다.
여기서 버전 관리를 활성화시키면 같은 버킷에세 똑같은 파일을 업로드하더라도
파일이 덮어씌워지는 것이 아니라 다른 버전으로 관리되어집니다.
파일명은 똑같아도 콘텐츠는 달라질 수 있는데 여기서 다른 버전을 선택해서 우리가 원하는
객체를 사용할 수 있습니다.
저는 디폴트로 선택된 비활성화로 선택하겠습니다.

그리고 마지막으로 기본 암호화가 나옵니다. 현재 서버측 암호화에 대한 활성화 여부를 물어봅니다.
객체를 버킷에 업로드할 때 자동으로 암호화를 할 것인지, 어떤 암호화를 할 것인지에 대해서 정해줍니다.
여기서는 [버킷 키] 에서 비활성화를 선택하겠습니다.
그리고 고급 설정에서는 객체 잠금에 대한 항목이 나옵니다.
만약 객체 잠금을 활성화 시킨다면 버킷에 파일을 한 번 업로드하면 파일을 덮어 씌우거나 삭제하는 것이 불가능해집니다.
즉, 이 설정의 경우 버킷에 한 번 올린 원본 파일을 오랫동안 유지하고 복원하고 싶을 경우 사용됩니다.

그럼 이렇게 버킷이 생성되는 것을 보실 수 있습니다.

버킷에 들어가면 다음과 같습니다. 현재는 버킷이 비어있습니다.
여기서 새로운 폴더를 만들거나, 직접 파일을 업로드할 수 있습니다.
그러면 [폴더 만들기]를 통해서 새로운 폴더를 만들어 보겠습니다.

그럼 새로운 폴더의 이름을 image라고 지정하고 만들어줍니다.

그럼 이렇게 폴더가 만들어진 것을 보실 수 있습니다.

이제 폴더에 들어가서 [업로드] - [파일 추가] 버튼을 통해서 파일을 추가할 수 있습니다.

그러면 이렇게 생성한 폴더에 파일에 추가된 것을 볼 수 있습니다.
우측 상단에 [열기]을 누른다면, 새 탭이 뜨면서 업로드한 이미지 사진을 볼 수도 있습니다.

그리고 우측 하단에 객체 URL을 통해서도 사진을 볼 수 있습니다.
하지만, 이렇게 Access Denied가 뜨는데요.
이건 바로 버킷을 생성할 때, 퍼블릭 접근 권한을 차단했기 때문입니다.
이 URL 주소를 다른 사람이 다른 컴퓨터에서 열 경우 이미지 파일을 볼 수 없습니다.
그렇다면 이 문제를 해결하기 위해서 퍼블릿 접근 권한을 허용하도록 변경하기 위해서 버킷으로 돌아가 보겠습니다.

우선 새로운 폴더를 다시 만드는데요. 이름은 image_public으로 주겠습니다.

그리고 똑같은 파일을 폴더에 업로드 해주겠습니다.

그런 다음 다시 버킷으로 돌아와서 상단에 있는 [권한] 탭을 누릅니다.
그러면 퍼블릭 액세스 차단에서 모든 퍼블릭 액세스 차단이 활성화 되어 있는데,
이 부분 때문에 URL을 통해서는 이미지 파일을 열 수 없었던 것입니다.
이를 바꾸기 위해서 편집 버튼을 눌러줍니다.

체크되어 있는 체크박스를 해제하게 되면, S3 버킷에 대한 모든 권한을 없앤다는 의미입니다.

그러면 이제 다시 URL을 통해서 파일을 열어보겠습니다.
하지만, 여전히 Access Denied가 발생합니다.
비록 버킷은 퍼블릭 액세스를 허용하였으나, 객체는 아직 퍼블릭으로 공개되지 않았기 때문입니다.
그렇다면 이번에는 이것을 수정해보겠습니다.

열고자하는 파일을 누른 후에 [권한] 탭으로 가셔서 ACL이 나오는데요.
여기서 [편집] 버튼을 누릅니다.

그런 후에 퍼블릭 액세스 - 읽기를 체크해줍니다.
그리고 나서 변경 사항을 저장해줍니다.

그럼 이제 브라우저로 URL을 통해서 접근하게 된다면 이미지 파일이 정상적으로 나오는 것을 볼 수 있습니다.
