Skip to main content

11C. S3 세부 설정하기

About 7 minAWScrashcoursepyrasisawsamazon-web-services

11C. S3 세부 설정하기 관련

목차

아마존 웹 서비스를 다루는 기술

11장 - 3. S3 세부 설정하기

아마존 웹 서비스를 다루는 기술

이제 S3의 다양한 기능을 활용해보겠습니다. S3는 버킷과 객체를 어떻게 설정하느냐에 따라 기능이 달라집니다. 권한 설정은 파일을 전체 공개하거나 특정 사용자에게만 공개하고 싶을 때 사용합니다. 그리고 버킷 정책을 설정하는 것에 따라 다양한 접근 제어가 가능합니다. 따라서 특정 도메인에서만 S3 객체를 링크할 수 있도록 허용하고 싶을 때, HTTP Referer(Referrer) 접근 제어 설정을 활용할 수 있습니다.

버킷을 정적 웹 서버(정적 웹 호스팅)로 사용하도록 설정하면 버킷 자체로 간단한 웹사이트 운영이 가능합니다. 또한, 버킷 로그 기록 그리고 객체의 스토리지 옵션, 버저닝, 수명 주기Lifecycle 관리도 할 수 있습니다.


S3 객체 권한 관리하기

S3에 올라간 파일을 객체라고 표현합니다. S3에서는 이 객체마다 각각의 접근 권한을 설정할 수 있습니다. 가장 간단한 예제로 S3에 올린 파일을 인터넷에 공개해보겠습니다. S3 버킷의 객체 목록에서 파일을 선택하고 위쪽의 Properties 버튼을 클릭하면 그림 11-17과 같이 객체의 세부 내용이 표시됩니다(파일을 선택하고 마우스 오른쪽 버튼을 클릭해서 나오는 팝업 메뉴에도 Properties가 있습니다). 여기서 Link 부분을 보면 그림 파일의 URL이 표시됩니다.

이 링크를 클릭합니다.
이 링크를 클릭합니다.

웹 브라우저의 새 창이 열리고 링크의 내용이 표시됩니다.

하지만 라는 에러가 표시되고 그림 파일은 열리지 않습니다.
하지만 AccessDenied라는 에러가 표시되고 그림 파일은 열리지 않습니다.

S3 객체 목록에서 파일을 선택하고 마우스 오른쪽 버튼을 클릭하면 팝업 메뉴가 나옵니다(위쪽 Actions 버튼을 클릭해도 같은 메뉴가 나옵니다).

<FontIcon icon="iconfont icon-select"/>를 클릭합니다. <FontIcon icon="iconfont icon-select"/>은 객체를 인터넷에 공개(Public)하겠다는 것입니다.
[Make Public]를 클릭합니다. [Make Public]은 객체를 인터넷에 공개(Public)하겠다는 것입니다.
파일을 공개하겠냐는 경고 창이 표시되면 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
파일을 공개하겠냐는 경고 창이 표시되면 [확인] 버튼을 클릭합니다.

Make Public이 완료되었다는 것이 오른쪽에 표시됩니다.

위의 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
위의 [Properties] 버튼을 클릭합니다.

Link 부분을 보면 노란색 자물쇠 아이콘에서 파란색 전파 아이콘으로 바뀐 것을 확인할 수 있습니다.

이제 이 링크를 클릭합니다.
이제 이 링크를 클릭합니다.

웹 브라우저에 S3 객체의 링크 내용이 잘 표시됩니다.

이제 이 그림 파일은 인터넷에 공개된 상태이기 때문에 다른 곳에 링크를 가져가서 이 그림 파일을 보여줄 수 있습니다.
이제 이 그림 파일은 인터넷에 공개된 상태이기 때문에 다른 곳에 링크를 가져가서 이 그림 파일을 보여줄 수 있습니다.

많은 파일을 하나하나 Make Public으로 설정하기에는 귀찮은 면이 있습니다. 이럴 때에는 처음에 파일을 올릴 때 S3 버킷에 파일 올리기 부분에서 Set Permissions 화면의 Make everything public에 체크하면 됩니다.

이미 파일을 올렸다면 S3 객체 목록은 파일을 여러 개 선택할 수 있으므로 공개하고자 하는 파일을 모두 선택한 뒤 Make Public으로 설정해주면 됩니다. 방금 공개한 그림 파일을 선택하고 [Properties] 버튼을 클릭한 뒤 [Permissions] 탭을 클릭합니다.

Grantee에 Everyone이 설정되어 있고 Open/Download가 체크되어 있는 것을 볼 수 있습니다. 이것은 Make Public을 실행하면 자동으로 설정됩니다.
Grantee에 Everyone이 설정되어 있고 Open/Download가 체크되어 있는 것을 볼 수 있습니다. 이것은 Make Public을 실행하면 자동으로 설정됩니다.

.[Permissions] 탭에서 수동으로 Grantee에 Everyone을 설정하고 Open/Download에 체크한 후 [Save] 버튼을 클릭하면 Make Public을 실행한 것과 똑같은 효과를 가집니다.

.[Permissions] 탭에서 [Add more permission]를 클릭했을 때 다음 항목을 볼 수 있습니다.

  • **Grantee: 권한을 부여할 대상입니다. 보통 여기서는 Everyone과 자기 자신의 ID(Me도 자기자신의 ID를 뜻합니다.)을 선택합니다.
  • 추가적으로 계정을 발급하여 계정 별로 권한을 부여하고 싶을 때가 있습니다. '16장 사용자와 그룹을 생성하여 접근제어 및 권한관리를 제공하는 IAM' 부분을 참조하여 계정을 생성하면 이곳에서 선택할 수 있게 됩니다. IAM 계정은 Access Key와 Secret Key를 이용하여 API로 접근 할 때 사용하게 됩니다.
  • Open/Download: 파일을 열고 다운로드할 수 있는 권한입니다.
  • View Permissions: 권한 내역을 볼 수 있는 권한입니다.
  • Edit Permissions: 권한을 수정할 수 있는 권한입니다. 보통 이런 경우 S3 객체 목록을 이용하지 않고 IAM 계정을 통해 API로 접근하게 됩니다.

S3 버킷 권한 관리하기

11장 - 3.2. S3 버킷 권한 관리하기

아마존 웹 서비스를 다루는 기술

이제 버킷에 권한을 설정해보겠습니다. 버킷에 권한을 설정하면 버킷 안에 든 모든 객체에 적용됩니다. 예제로 버킷의 내용 전체를 인터넷에 공개하는 방법을 알아보겠습니다.

'11.2 S3 버킷에 파일 올리기/받기'를 참조하여 버킷에 그림 파일을 하나 더 올립니다. 저는 Jellyfish.jpg라는 그림 파일을 새로 올렸습니다. 새로 올린 파일을 선택하고 위쪽의 [Properties] 버튼을 클릭합니다. Link 부분을 보면 URL의 아이콘이 노란색 자물쇠 모양인 것을 확인할 수 있습니다.

이 링크를 클릭합니다.
이 링크를 클릭합니다.
이 URL은 웹 브라우저로 접속해도 그림 파일이 열리지 않는 상태입니다.
이 URL은 웹 브라우저로 접속해도 그림 파일이 열리지 않는 상태입니다.

위쪽의 All Bucket을 클릭하면 모든 버킷의 목록이 표시됩니다.

버킷을 선택하고 위쪽의 <FontIcon icon="iconfont icon-select"/> 버튼클 클릭한 뒤 <FontIcon icon="iconfont icon-select"/> 탭을 클릭합니다. 그리고 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다(버킷을 선택하고 마우스 오른쪽 버튼을 클릭하면 나오는 팝업 메뉴에도 Properties가 있습니다).
버킷을 선택하고 위쪽의 Properties 버튼클 클릭한 뒤 [Permissions] 탭을 클릭합니다. 그리고 [Add bucket policy] 버튼을 클릭합니다(버킷을 선택하고 마우스 오른쪽 버튼을 클릭하면 나오는 팝업 메뉴에도 Properties가 있습니다).

Info

Add more permissions를 클릭했을 때 나오는 내용은 '11.3.1 S3 객체 권한 관리하기'와 동일합니다. 단 여기서는 버킷 전체에 대해 설정하는 것이므로 버킷 안에 들어있는 모든 객체에 적용됩니다.

버킷 정책 편집기Bucket Policy Editor가 표시됩니다. 이곳에 JSONJavaScript Object Notation 형태의 정책을 입력하면 됩니다. 이 정책은 다소 복잡하기 때문에 AWS에서는 이 정책을 생성해주는 페이지를 제공하고 있습니다. 아래쪽 AWS Policy Generator 링크를 클릭합니다.

Bucket Policy Editor
Bucket Policy Editor

그림 11-19처럼 웹 브라우저의 새 창에서 AWS Policy Generator 페이지가 열렸습니다.

  • **Select Type of Policy: SNS Topic Policy, IAM Policy, SQS Queue Policy, S3 Bucket Policy를 선택할 수 있습니다. 여기서는 S3 Bucket Policy를 선택합니다.
  • **Effect: 허용(Allow), 거부(Deny)를 선택할 수 있습니다. 기본값 그대로 Allow를 선택합니다.
  • **Principal: 권한을 적용할 사용자입니다. IAM 계정을 사용할 수 있습니다. 여기서는 인터넷에 전체 공개할 것이므로 *을 입력합니다.
  • **AWS Service: 처음 Select Type of Policy를 선택하면 그에 맞는 서비스가 자동으로 선택됩니다. 기본값 그대로 사용합니다.
  • **Actions: S3의 모든 액션이 표시됩니다. 우리는 파일을 받는 액션만 사용할 것이므로 GetObject를 선택합니다.
  • **Amazon Resource Name(ARN): 아마존의 리소스를 고유하게 표현하는 방식입니다. arn:aws:s3:::examplebucket10/*을 입력합니다. 이것은 AWS의 S3에서 examplebucket10 아래 모든 파일을 뜻합니다. /* 대신 /Jellyfish.jpg 등으로 특정 파일을 지정해 줄 수도 있습니다.
AWS Policy Generator로 정책 생성
AWS Policy Generator로 정책 생성

Add Conditions에서 UserAgent, SourceIP 등 다양한 조건을 사용할 수 있습니다. 여러분들이 필요할 때 하나하나 사용해보기 바랍니다.

설정이 완료되었으면 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
설정이 완료되었으면 [Add Statement] 버튼을 클릭합니다.

설정한 내용이 Statements 목록에 추가되었습니다.

아래쪽 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
아래쪽 [Generate Policy] 버튼을 클릭합니다.

AWS 정책이 생성되었습니다. 이 JSON 텍스트를 전체 선택 한 뒤 복사합니다.

JSON 형태의 AWS Policy
JSON 형태의 AWS Policy

이제 다시 버킷 정책 편집기Bucket Policy Editor에 방금 AWS Policy Generator에서 복사한 JSON 텍스트를 붙여넣습니다.

붙여넣기가 완료되었다면 아래쪽 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
붙여넣기가 완료되었다면 아래쪽 [Save] 버튼을 클릭합니다.

S3 버킷(examplebucket10)을 클릭하여 객체 목록으로 들어옵니다.

방금 올린 파일을 선택하고 위쪽 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다. Link 부분을 보면 URL의 노란색 자물쇠 모양 아이콘이 사라졌습니다. 이제 이 링크를 클릭합니다.
방금 올린 파일을 선택하고 위쪽 [Properties] 버튼을 클릭합니다. Link 부분을 보면 URL의 노란색 자물쇠 모양 아이콘이 사라졌습니다. 이제 이 링크를 클릭합니다.

웹 브라우저에서 그림 파일이 잘 표시됩니다.

버킷 전체를 공개하도록 권한 설정을 했으므로 이제부터 이 버킷에 올리는 모든 파일은 인터넷에 자동으로 공개됩니다.
버킷 전체를 공개하도록 권한 설정을 했으므로 이제부터 이 버킷에 올리는 모든 파일은 인터넷에 자동으로 공개됩니다.

S3 정적 웹사이트 호스팅 사용하기

11장 - 3.3. S3 정적 웹사이트 호스팅 사용하기

아마존 웹 서비스를 다루는 기술

S3을 웹 서버 형태로 사용해보겠습니다. 사실 정적 웹사이트 호스팅 설정을 하지 않더라도 S3에 파일을 올리면 웹 브라우저로 파일에 접근할 수 있습니다. 하지만, 그냥 사용하는 것과 정적 웹사이트 호스팅 설정을 사용하는 것은 큰 차이점이 있습니다.

다음은 일반적인 S3의 URL 형태입니다.

  • http://s3-ap-northeast-1.amazonaws.com/examplebucket10/Jellyfish.jpg
  • s3-<리전 이름>.amazonaws.com/<버킷 이름>/<파일 이름>

다음은 정적 웹사이트 호스팅을 사용한 S3의 URL 형태입니다.

  • http://examplebucket10.s3-website-ap-northeast-1.amazonaws.com/Jellyfish.jpg
  • <버킷 이름>.s3-website-<리전 이름>.amazonaws.com/<파일 이름>
  • 이것을 S3 Website Endpoint라고 말합니다.

이처럼 URL 형태에 큰 차이점이 있습니다. 아래 URL 형태처럼 버킷 이름이 서브 도메인 형태로 들어가야 DNS 서버에서 CNAME 설정을 해 줄 수 있습니다. 즉 example.com 도메인의 CNAME을 examplebucket10.s3-website-ap-northeast-1.amazonaws.com로 설정하면 example.com으로 접속했을 때 버킷(examplebucket10)의 내용이 바로 표시됩니다.

이 CNAME 설정은 AWS의 DNS 서비스인 Route 53에서 설정 가능합니다. 또한, Route 53가 아니더라도 BIND와 같은 일반적인 DNS 서버에서도 설정이 가능합니다. Route 53에서 S3을 연결하는 방법은 '17.3 Route 53와 S3 연동하기'를 참조하기 바랍니다.

정적 웹사이트 호스팅 설정을 이용하면 인덱스 페이지와 에러 페이지의 파일명을 따로 지정해 줄 수 있고, 다양한 리다이렉션Redirection 행동을 할 수 있습니다. 즉 S3 버킷 도메인인 examplebucket10.s3-website-ap-northeast-1.amazonaws.comexample.com과 같은 다른 도메인으로 리다이렉션 할 수도 있습니다.

정적 웹사이트 호스팅용 버킷을 새로 만든 뒤 간단한 웹사이트를 만들어보겠습니다.

S3 버킷 목록에서 위쪽의 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
S3 버킷 목록에서 위쪽의 [Create Bucket] 버튼을 클릭합니다.

S3 버킷을 생성합니다.

  • **Bucket Name: 사용할 버킷 이름을 설정합니다(examplewebhosting은 이 책을 쓰는 시점에 제가 이미 사용하고 있으므로 같은 이름을 사용할 수 없습니다. 그림 11-37과는 다른 이름을 설정합니다).
  • **Region: 버킷이 위치할 리전입니다. Tokyo를 선택합니다.
설정이 완료되었으면 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
설정이 완료되었으면 [Create] 버튼을 클릭합니다.

먼저 웹사이트이므로 버킷에 올라가는 모든 파일을 인터넷에 공개하도록 권한 설정을 해주어야 합니다.

S3 버킷 목록에서 방금 생성한 버킷을 선택하고 위쪽의 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다. 그리고 <FontIcon icon="iconfont icon-select"/> 탭을 클릭한 뒤 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
S3 버킷 목록에서 방금 생성한 버킷을 선택하고 위쪽의 [Properties] 버튼을 클릭합니다. 그리고 [Permissions] 탭을 클릭한 뒤 [Edit bucket policy] 버튼을 클릭합니다.

버킷 정책 편집기 화면이 나옵니다. 이곳에 아래 JSON 텍스트를 입력합니다. 인터넷에 버킷의 모든 파일을 공개하는 정책은 AWS Policy Generator에서 생성할 수 있습니다. AWS Policy Generator에 관련된 것은 '11.3.2 S3 버킷 권한 관리하기'를 참조하기 바랍니다.

{
  "Version": "2008-10-17",
  "Id": "Policy1397993518062",
  "Statement": [
    {
      "Sid": "Stmt1397993241249",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::examplewebhosting/*"
    }
  ]
}

::: warn

버킷 정책의 내용 중에서 Resources의 arn:aws:s3:::examplewebhosting/*에서 examplewebhosting 부분은 여러분들이 생성한 버킷 이름으로 바꿔주어야 합니다. 책에 있는 그대로 입력하면 안됩니다.

:::

버킷 정책 JSON 텍스트 입력이 끝났으면 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
버킷 정책 JSON 텍스트 입력이 끝났으면 [Save] 버튼을 클릭합니다.

같은 버킷(examplewebhosting)의 Properties에서 [Static Website Hosting] 탭을 클릭합니다.

  • Do not enable website hosting: 정적 웹사이트 호스팅 기능을 사용하지 않습니다.
  • Enable website hosting: 정적 웹사이트 호스팅 기능을 사용합니다.
  • Redirect all request to another host name: 모든 요청을 다른 도메인으로 리다이렉션 합니다.

.[Enable website hosting]을 선택합니다.

  • Index Document: 인덱스 페이지의 파일명 입니다. index.html을 설정합니다.
  • Error Document: 에러 페이지의 파일명을 설정합니다. 에러 페이지를 따로 보여주고 싶을 때 설정하면 됩니다.
  • Edit Redirection Rules: 세세한 리다이렉션 규칙을 설정합니다. docs/hello.html로 접근했다면 documents/hello.html을 보여주는 식으로 규칙 설정이 가능합니다. 자세한 내용은 링크를 참조하기 바랍니다
Tutorial: Configuring a static website on Amazon S3 - Amazon Simple Storage Service

Walk through a code example of how to configure a bucket for website hosting using the Amazon S3 website endpoint.
설정이 완료되었으면 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
설정이 완료되었으면 [Save] 버튼을 클릭합니다.

이제 간단한 웹 페이지를 작성하여 올릴 차례입니다. 메모장이나 기타 텍스트 편집기를 열고 아래와 같이 작성한 뒤 index.html로 저장합니다.

index.html
<head>
<title>S3 Example Website Hosting</title>
</head>
<body>
  <p>Hello S3</p>
<body>
</html>

.index.html을 정적 웹사이트 호스팅을 설정한 버킷(examplewebhosting)에 올립니다. 파일을 올리는 방법은 '11.2 S3 버킷에 파일 올리기/받기'를 참조하기 바랍니다.

<FontIcon icon="fa-brands fa-html5"/> 파일이 버킷에 올라가 있습니다.
index.html 파일이 버킷에 올라가 있습니다.

그림 위쪽의 정적 웹사이트 호스팅을 설정한 버킷 이름(그림 11-42에서는 examplewebhosting)을 클릭한 뒤 [Properties] 버튼을 클릭합니다. 그리고 [Static Website Hosting] 탭을 클릭합니다.

이제 S3 웹사이트 엔드포인트의 링크를 볼 수 있습니다. 이 링크 (<FontIcon icon="fas fa-globe"/>)를 클릭합니다 (링크에서  부분은 여러분들이 설정한 버킷 이름이 되어야 합니다).
이제 S3 웹사이트 엔드포인트의 링크를 볼 수 있습니다. 이 링크 (http://examplewebhosting.s3-website-ap-northeast-1.amazonaws.com/)를 클릭합니다 (링크에서 examplewebhosting 부분은 여러분들이 설정한 버킷 이름이 되어야 합니다).
웹 브라우저의 새 창에서 방금 만들어서 올린 <FontIcon icon="fa-brands fa-html5"/> 파일의 내용이 표시됩니다.
웹 브라우저의 새 창에서 방금 만들어서 올린 index.html 파일의 내용이 표시됩니다.

S3 정적 웹사이트 호스팅 활용

요즘 많이 쓰는 jQuery, jQuery UI, Bootstrap 등의 JavaScript 라이브러리 파일은 EC2에서 웹 서버를 구축하여 서비스하는 것보다, S3 정적 웹사이트 호스팅을 활용하여 서비스하는 것이 훨씬 유리합니다. 또한, 이미지 파일이나, CSS 파일 등도 S3 정적 웹사이트 호스팅을 활용하는 것이 효과적입니다.


HTTP Referer로 S3 접근 제한하기

11장 - 3.4. HTTP Referer로 S3 접근 제한하기

아마존 웹 서비스를 다루는 기술

S3에 올려진 그림 파일을 원하는 도메인에서만 보여줄 수 있도록 설정해보겠습니다. S3은 데이터 전송량에 따라 요금 책정하기 때문에 원하지 않는 도메인에서의 링크를 막는다면 그만큼 비용을 절감할 수 있습니다.

HTTP Referer는 HTTP 헤더값으로서 웹 브라우저에서 생성하는 데이터입니다. 예를 들면 http://example.com이라는 웹사이트에서 http://hello.com의 링크를 클릭하거나 <img> 태그로 그림 파일을 보여줄 때, http://hello.com으로 보내는 HTTP 헤더의 Referer 값은 http://example.com이 됩니다. 따라서 링크를 어디서 클릭했느냐, 그림 파일을 어디서 보여줬느냐를 알 수 있습니다. S3에서는 이 Referer 값을 판단해서 파일을 보여줄지 말지 결정할 수 있습니다.

이번에는 버킷을 2개 사용하겠습니다. 버킷 하나에 웹사이트를 구축하고 HTTP Referer를 설정한다면 정작 웹사이트의 HTML 파일을 볼 때에는 HTTP Referer 설정에 막혀버리기 때문에 의미가 없습니다. 앞에서 생성했던 버킷(examplebucket10)을 그림 파일 저장 전용 버킷으로 사용하고, HTTP Referer 설정을 할 것이며 정적 웹사이트 호스팅을 설정했던 버킷(examplewebhosting)에서 그림 파일을 링크해보겠습니다.

앞 장에서 버킷을 생성하지 않고 이번 장부터 본 독자들은 '11.1 S3 버킷 생성하기', '11.2 S3 버킷에 파일 올리기/받기', '11.3.2 S3 버킷 권한 관리하기', '11.3.3 S3 정적 웹사이트 호스팅 사용하기'를 참조하여 그림 파일을 저장할 버킷을 생성하기 바랍니다.

S3 버킷 목록에서 그림 파일을 올렸던 버킷()을 선택하고 위쪽의 <FontIcon icon="iconfont icon-select"/> 버튼클 클릭한 뒤 <FontIcon icon="iconfont icon-select"/> 탭을 클릭합니다. 그리고 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
S3 버킷 목록에서 그림 파일을 올렸던 버킷(examplebucket10)을 선택하고 위쪽의 [Properties] 버튼클 클릭한 뒤 [Permissions] 탭을 클릭합니다. 그리고 [Edit Bucket policy] 버튼을 클릭합니다.

버킷 정책 편집기에 아래와 같이 입력합니다.

{
   "Version": "2012-10-17",
   "Id": "http referer policy example",
   "Statement": [
        {
           "Sid": "Allow get requests originated from www.example.com and example.com",
           "Effect": "Allow",
           "Principal": "*",
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::examplebucket10/*",
           "Condition": {
               "StringLike": {
                   "aws:Referer": "http://examplewebhosting.s3-website-ap-northeast-1.amazonaws.com/*"
                }
            }
        }
    ]
}

중요한 부분만 설명하면 다음과 같습니다.

  • Effect: 지정한 도메인만 허용할 것이므로 허용(Allow) 입니다.
  • Principal: 정책을 적용할 대상입니다. 인터넷 전체에 공개할 것이므로 *입니다..
  • Action: 파일을 보여주는(다운로드) 상황이므로 s3:GetObject 입니다.
  • Condition: 조건절입니다. 이곳에 설정한 조건에 맞으면 허용(Allow) 또는 거부(Deny) 합니다.
  • StringLike: 조건절 안에 사용하는 조건문입니다. 뜻은 문자열을 포함하고 있을 때 입니다.
  • aws:Referer: Referer 값을 지정합니다. 보통 도메인을 설정하며 맨 뒤에 /*를 붙여주어, 도메인 이하 모든 경로에 대해 허용합니다. /hello.html 처럼 특정 파일의 경로를 지정할 수도 있습니다. 여러 도메인을 지정하려면 ,(콤마)로 구분하면 됩니다.

::: warn

버킷 정책의 내용 중에서 aws:Refererhttp://examplewebhosting.s3-website-ap-northeast-1.amazonaws.com/*에서 examplewebhosting 부분은 여러분이 생성한 정적 웹사이트 호스팅 버킷의 주소를 설정해야 합니다. 책에 있는 그대로 입력하면 안됩니다.

:::

설정이 완료되었으면 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
설정이 완료되었으면 [Save] 버튼을 클릭합니다.

이제 테스트를 해보겠습니다. 그림 파일이 들어있는 버킷(examplebucket10)의 객체 목록에서 그림 파일을 선택하고 Properties 버튼을 클릭합니다. Permissions 탭을 클릭하고 Grantee가 Everything로 설정된 것이 없는지 확인합니다. Everything으로 권한이 설정되어 있으면 Referer 설정을 무시하게 되므로 주의합니다.

따라서 Everything으로 권한 설정 추가되어 있지 않은 파일을 선택한 뒤, Link 부분의 URL을 클릭합니다.
따라서 Everything으로 권한 설정 추가되어 있지 않은 파일을 선택한 뒤, Link 부분의 URL을 클릭합니다.
 에러와 함께 그림 파일이 열리지 않습니다. 링크를 클릭했던 도메인()과 버킷 정책에 설정한 Referer 도메인이 맞지 않기 때문입니다.
AccessDenied 에러와 함께 그림 파일이 열리지 않습니다. 링크를 클릭했던 도메인(https://console.aws.amazon.com)과 버킷 정책에 설정한 Referer 도메인이 맞지 않기 때문입니다.

이제 정적 웹사이트 호스팅을 설정한 버킷에서 그림 파일을 불러오도록 하겠습니다.

S3 버킷 목록에서 정적 웹사이트 호스팅을 설정한 버킷()을 클릭합니다.
S3 버킷 목록에서 정적 웹사이트 호스팅을 설정한 버킷(examplewebhosting)을 클릭합니다.
'11.3.3 S3 정적 웹사이트 호스팅 사용하기'에서 올렸던 파일을 볼 수 있습니다.
'11.3.3 S3 정적 웹사이트 호스팅 사용하기'에서 올렸던 파일을 볼 수 있습니다.

아래와 같이 index.html 파일을 작성한 뒤 S3 버킷에 올립니다 (파일을 올리는 방법은 '11.2 S3 버킷에 파일 올리기/받기'를 참조하기 바랍니다).

index.html
<html>
<head>
    <title>S3 Example Website Hosting</title>
</head>
<body>
    <p>Hello S3</p>
    <img src="https://s3-ap-northeast-1.amazonaws.com/examplebucket10/Jellyfish.jpg" width="320" height="240">
</body>
</html>

위쪽 버킷 이름(examplewebhosting)을 클릭한 뒤 [Properties] 버튼을 클릭합니다. 그리고 [Static Website Hosting] 탭을 클릭합니다.

S3 웹사이트 엔드포인트의 링크가 표시됩니다. 이 링크(<FontIcon icon="fas fa-globe"/>)를 클릭합니다(링크에서  부분은 여러분들이 설정한 버킷 이름이 되어야 합니다).
S3 웹사이트 엔드포인트의 링크가 표시됩니다. 이 링크(http://examplewebhosting.s3-website-ap-northeast-1.amazonaws.com/)를 클릭합니다(링크에서 examplewebhosting 부분은 여러분들이 설정한 버킷 이름이 되어야 합니다).

S3 객체의 URL로 접속했을 때 열리지 않던 그림 파일이 index.html에서는 잘 열립니다.

웹 브라우저로 접속한 도메인 (<FontIcon icon="fas fa-globe"/>)과 버킷 정책에 설정한 Referer 도메인이 일치하기 때문입니다.
웹 브라우저로 접속한 도메인 (http://examplewebhosting.s3-website-ap-northeast-1.amazonaws.com)과 버킷 정책에 설정한 Referer 도메인이 일치하기 때문입니다.

S3 객체 스토리지 클래스, 암호화 설정하기

11장 - 3.5. S3 객체 스토리지 클래스, 암호화 설정하기

아마존 웹 서비스를 다루는 기술

S3 객체를 어떤 스토리지에 저장할지 그리고 저장할 때 암호화 여부를 설정할 수 있습니다.

이번 장부터는 실습이 쉽지 않은 부분이 많아서, 따로 실습은 하지 않고 설정에 대한 자세한 설명으로 대신하겠습니다.

S3 객체 목록에서 파일을 선택한 뒤 위쪽 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다. 그리고 <FontIcon icon="iconfont icon-select"/> 탭을 클릭합니다.
S3 객체 목록에서 파일을 선택한 뒤 위쪽 [Properties] 버튼을 클릭합니다. 그리고 [Details] 탭을 클릭합니다.
  • 스토리지 클래스(Storage Class): Standard와 Reduced Redundancy를 선택할 수 있습니다. 데이터를 어떤 스토리지에 저장할지 설정하는 옵션입니다. 각 옵션에 대한 자세한 설명은 이 장을 참조하기 바랍니다.
  • Standard: 데이터 손실 가능성이 거의 없는 스토리지입니다(내구성 99.999999999%).
  • Reduced Redundancy: 어느 정도 데이터 손실 가능성이 있지만 저장 비용이 저렴한 스토리지입니다(내구성 99.99%).
  • Server Side Encryption: None과 AES-256을 선택할 수 있습니다. S3에 데이터를 암호화해서 저장하는 옵션입니다. 중요한 데이터를 좀더 안전하게 저장하고 싶을 때 사용합니다. 복호화는 데이터를 가져올 때 이루어집니다.

S3 객체 메타데이터 설정하기

11장 - 3.6. S3 객체 메타데이터 설정하기

아마존 웹 서비스를 다루는 기술

S3 객체에 다양한 기능을 하는 메타데이터를 설정할 수 있습니다. 메타데이터는 HTTP 1.1 표준에 정의된 메타데이터와 S3 전용 메타데이터로 나뉩니다. S3 객체 목록에서 파일을 선택한 뒤 위쪽 [Properties] 버튼을 클릭합니다. 그리고 [Metadata] 탭을 클릭합니다.

S3 객체에 HTTP 헤더Header를 설정할 수 있습니다. 이 헤더는 HTTP 1.1에 정의된 것입니다.

  • Cache-Control: 브라우저 캐시 정책을 설정합니다. Value에 max-age=3600과 같은 식으로 데이터 만기 시간을 초 단위로 지정할 수 있습니다. 만기 시간이 지나기 전에 다시 요청을 할 경우 브라우저에서는 서버에서 데이터를 가져오지 않고 로컬에 있는 데이터를 사용합니다. 이 설정은 AWS의 CDN 서비스인 CloudFront와도 연계됩니다. Cache-Control에 대한 내용은 상당히 방대하므로 인터넷을 참조하기 바랍니다.
  • Content-Disposition: Value에 attachment로 설정하면 JPG 파일 같은 경우 웹 브라우저에서 그림 파일을 보여주지 않고 바로 다운로드합니다. 그림 파일 뿐만 아니라 다른 형식의 파일에도 지정할 수 있습니다.
  • Content-Type: 웹 브라우저에서 파일을 어떻게 처리해야 하는지 알려주는 메타데이터 입니다. 보통 확장자에 따라 자동으로 설정됩니다. 확장자가 없는 파일은 이 메타데이터를 통해 강제로 형식을 지정해 줄 수 있습니다. 예를 들면 HTML을 담고 있는 hello라는 파일을 올리고, 웹 브라우저에서 열면 내용이 보이지 않고 바로 다운로드가 되어버립니다. 그래서 hello라는 파일의 Content-Typetext/html로 설정해주면 웹 브라우저에서 HTML 파일로 인식해서 내용을 보여주게 됩니다.
  • Content-Language: 텍스트로 된 파일(HTML 등)의 언어를 지정합니다. en, ko, jp 혹은 en-us, ko-kr, ja-jp 등으로 지정합니다.
  • Expires: Cache-Control과 같은 동작을 하지만 초 단위가 아닌 특정 날짜와 시간을 지정하여 만기 시간을 설정합니다. Tue, 22 Apr 2014 20:00:00 GMT와 같은 형식으로 지정해야 합니다.
  • Content-Encoding: 데이터 인코딩 방식입니다. Value에 gzip을 지정할 수 있으며 이때에는 데이터를 압축하여 전송한 뒤 웹 브라우저에서는 압축을 해제하여 사용하게 됩니다. 텍스트 데이터가 많고 용량이 큰 경우 이 메타데이터를 사용하면 데이터 전송 비용을 절감할 수 있습니다(JPG나 PNG 등의 그림 파일은 이미 포맷 자체가 압축 데이터이므로 gzip을 설정하더라도 용량이 크게 줄어들지 않습니다. 따라서 그림 파일에는 이 메타데이터를 설정하지 않는 것이 좋습니다). gzip을 가장 많이 사용하며 deflate도 지정할 수 있습니다.

다음은 S3 전용 메타데이터입니다.

  • Website Redirect Location: 웹 브라우저로 해당 파일에 접속했을 때 다른 파일이나 URL로 리다이렉션하는 기능입니다. /hello.html 처럼 S3에 올라가 있는 파일명을 지정할 수 있습니다.(이 때에는 /로 시작해야 합니다.) 또는 http://www.example.com처럼 외부 도메인 또는 URL을 지정할 수도 있습니다. 이 설정은 버킷을 정적 웹사이트 호스팅으로 설정한 뒤 S3 Website Endpoint로 접속해야 동작합니다(x-amz-website-redirect-location).
  • 사용자 정의 메타데이터
  • x-amz-meta-: 사용자 마음대로 사용할 수 있는 메타데이터입니다. 객체에 추가적인 설명을 넣고 싶을 때 사용합니다. x-amz-meta- 뒤에 임의로 이름을 붙여 x-amz-meta-user-id와 같이 사용하면 됩니다.
  • S3 시스템 정의 메타데이터. 일부 S3 세부 설정들을 이 메타데이터로 대신할 수 있습니다. 그리고 S3 콘솔에서 설정한 세부 설정들은 HTTP Response Header에 아래 키로 표현됩니다.
  • x-amz-server-side-encryption: 데이터 암호화 옵션입니다. Properties의 Details에서 Server Side Encryption 설정을 대신할 수 있으며 AES256을 값으로 가집니다.
  • x-amz-version-id: S3 버킷에 버저닝 기능을 켰을 때, 파일의 버전을 표시합니다(사용자가 편집할 수 없는 메타데이터).
  • x-amz-delete-marker: S3 버킷에 버저닝 기능을 켜고, 파일을 삭제하면 파일이 완전히 삭제되지 않고 삭제 표시(delete-marker) 설정이 됩니다. true를 값으로 가집니다 (사용자가 편집할 수 없는 메타데이터).
  • x-amz-storage-class: 스토리지 클래스 옵션입니다. Properties의 Details에서 스토리지 클래스(Storage Class) 설정을 대신할 수 있으며 STANDARDREDUCED_REDUNDANCY를 값으로 가집니다.
S3 객체 메타데이터 설정
S3 객체 메타데이터 설정

S3 버킷 로그 설정하기

11장 - 3.7. S3 버킷 로그 설정하기

아마존 웹 서비스를 다루는 기술

S3에 저장된 객체의 접속 로그Logging를 텍스트 파일 형태로 저장할 수 있습니다. 이제 버킷의 Properties 설정하는 것에 익숙해졌을 것입니다. 버킷의 Properties에서 [Logging] 탭을 클릭합니다.

  • Enabled: 이곳에 체크를 해야 로그를 남길 수 있습니다.
  • Target Bucket: 현재 선택된 버킷의 로그를 남길 수도 있고, 다른 버킷의 로그를 남길 수도 있습니다. 목록을 클릭하면 선택할 수 있는 버킷 목록이 표시됩니다.
  • Target Prefix: 기본값은 logs/ 입니다. 로그 파일이 저장될 폴더 이름입니다.
설정이 완료되었으면 <FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
설정이 완료되었으면 [Save] 버튼을 클릭합니다.
웹 브라우저에서 S3 객체에 접근을 한 뒤 10~20분 기다리면 <FontIcon icon="fas fa-folder-open"/>라는 폴더가 생깁니다. 이 폴더 안에 로그 파일이 저장됩니다.
웹 브라우저에서 S3 객체에 접근을 한 뒤 10~20분 기다리면 logs라는 폴더가 생깁니다. 이 폴더 안에 로그 파일이 저장됩니다.

로그 파일을 더블 클릭하면 로그 파일의 내용을 볼 수 있습니다.

로그 파일은 텍스트 파일이므로 여러분들이 프로그램이나 스크립트를 작성하여 분석할 수 있으며 S3 로그 파일을 전문적으로 처리하여 분석해주는 툴이나 서비스 등도 많이 나와 있습니다.
로그 파일은 텍스트 파일이므로 여러분들이 프로그램이나 스크립트를 작성하여 분석할 수 있으며 S3 로그 파일을 전문적으로 처리하여 분석해주는 툴이나 서비스 등도 많이 나와 있습니다.

S3 버킷 버저닝 설정하기

11장 - 3.8. S3 버킷 버저닝 설정하기

아마존 웹 서비스를 다루는 기술

S3은 자체적으로 파일 버전 관리Version Control 기능을 내장하고 있습니다. 이 버저닝Versioning 기능을 활용하면 파일을 이전 내용으로 되돌릴 수 있고, 삭제한 파일도 복원할 수 있습니다. 단 그만큼 파일 저장 용량이 늘어나므로 사용 요금이 늘어납니다. 따라서 용량이 작은 파일이 대부분일 때 사용하는 것을 추천합니다.

버킷의 Properties에서 [Enable Versioning] 탭을 클릭합니다.

<FontIcon icon="iconfont icon-select"/> 버튼을 클릭하면 버저닝 기능을 사용할 수 있습니다.
[Enable Versioning] 버튼을 클릭하면 버저닝 기능을 사용할 수 있습니다.

이 버킷에서 버저닝 기능을 한번 사용하게 되면 다시는 이 기능을 끌 수 없게 되니 주의해야 합니다. 또한, 버저닝 기능을 사용하고 있으면 수명 주기Lifecycle 기능을 사용할 수 없게 됩니다. 버저닝 기능을 활성화 한 뒤 S3 객체 목록에서 위쪽 Versions의 Show 버튼을 클릭하면 파일들의 버전이 표시됩니다(파일을 계속 수정해서 올렸을 경우).

.hello.html 파일이 2번 바뀌었고 삭제되었다는 것을 알 수 있습니다. 삭제된 파일은 Delete Marker라고 표시됩니다. 이 Delete Marker를 선택하고 마우스 오른쪽 버튼을 클릭하면 팝업 메뉴가 나옵니다.

여기서 <FontIcon icon="iconfont icon-select"/>를 클릭하면 삭제된 파일이 복원됩니다. 또한, 최근 버전을 삭제하면 이전 버전으로 되돌릴 수 있습니다.
여기서 [Delete]를 클릭하면 삭제된 파일이 복원됩니다. 또한, 최근 버전을 삭제하면 이전 버전으로 되돌릴 수 있습니다.

S3 버킷 수명 주기 설정하기

11장 - 3.9. S3 버킷 수명 주기 설정하기

아마존 웹 서비스를 다루는 기술

S3은 버킷에 저장된 객체의 수명 주기Lifecycle를 관리할 수 있는 기능이 있습니다. 이 기능은 일정 시간이 지났을 때 사용되지 않는 파일들을 삭제하거나 다른 곳에 백업하여 S3 저장 공간을 절약하고 싶을 때 사용합니다.

S3 버킷 목록에서 버킷을 선택하고 위쪽 Properties 버튼을 클릭합니다. 그리고 Lifecycle 탭을 클릭합니다. 여기서 수명 주기 규칙Lifecycle Rule을 추가할 수 있습니다.

<FontIcon icon="iconfont icon-select"/> 버튼을 클릭합니다.
[Add rule] 버튼을 클릭합니다.

수명 주기 규칙을 설정합니다.

  • Enabled: 이 규칙의 사용여부를 설정합니다.
  • Name(Optional): 규칙 이름입니다. 입력하지 않으면 자동 생성됩니다.
  • Apply to Entire Bucket: 이 규칙을 버킷 안에 있는 모든 객체에 적용할지 여부를 설정합니다. 아래 Prefix 설정은 무시됩니다.
  • Prefix: 규칙을 적용할 객체를 지정합니다. logs/라고 설정하면 logs 폴더에 규칙이 적용됩니다.
  • Time Period Format: 규칙을 적용할 날짜 설정입니다.
  • Days from the creation date: 객체의 생성 날짜부터 적용합니다.
  • Effective from date: 특정 날짜부터 적용합니다.
  • Move to Glacier: 설정한 날짜에 데이터를 보관 및 백업 전용 스토리지인 Glacier로 이전합니다. Glacier에 관해서는 '21장 데이터 보관 및 백업을 위한 매우 저렴한 스토리지 서비스 Glacier'를 참조하기 바랍니다.
  • Expiration: 설정한 날짜에 데이터를 완전히 삭제합니다.

이 수명 주기 규칙Lifecycle Rule을 추가하게 되면 버저닝Versioning 기능을 사용할 수 없게 됩니다.

버저닝 기능을 사용하려면 추가된 모든 규칙을 삭제해야 합니다.
버저닝 기능을 사용하려면 추가된 모든 규칙을 삭제해야 합니다.

S3 버킷 기타 설정

11장 - 3.10. S3 버킷 기타 설정

아마존 웹 서비스를 다루는 기술

S3 버킷은 앞서 설명한 것 이외에도 다양한 설정이 가능합니다. 아래 설정들은 간략한 설명으로 대신하겠습니다.

  • Notifications: 낮은 중복 스토리지(Reduced Redundancy Storage)를 사용하는 객체가 유실되었을 때 SNS(Simple Notification Service)로 알림을 전송해주는 기능입니다.
  • Tags: 버킷에 태그를 설정합니다. AWS의 Cost Allocation Reports에서 S3의 비용 내역을 볼 수 있으며 이 보고서에는 여기서 설정한 태그 별로 집계된 사용 내역 및 비용이 표시됩니다.
  • Requester Pays: 기본적으로 S3 버킷 소유자는 사용 공간 및 데이터 전송량에 따른 요금을 지불하게 됩니다. 이 설정을 사용하면 버킷 소유자는 사용 공간에 대해서만 요금을 지불하면 되고, 데이터 전송량에 따른 요금은 데이터를 다운로드한 사용자가 지불하게 됩니다. 이 설정을 사용하면 버킷에 대한 익명 접근은 모두 차단됩니다. 자세한 내용은 링크를 참조하기 바랍니다
Using Requester Pays buckets for storage transfers and usage - Amazon Simple Storage Service

Configure a bucket to be a Requester Pays bucket so that the requester pays the cost of the request and data download instead of the bucket owner.

이찬희 (MarkiiimarK)
Never Stop Learning.