話題の記事

AWS再入門 Amazon S3編

2015.12.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

当エントリはDevelopers.IOで弊社AWSチームによる2015年アドベントカレンダー『AWS サービス別 再入門アドベントカレンダー 2015』の1日目のエントリです。

このアドベントカレンダーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2015年のサービスアップデートのキャッチアップの場となればと考えておりますので、最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。1日目のテーマは『Amazon S3』です。

Amazon S3とは

AWSの中核にあるストレージサービス

Amazon S3(Amazon Simple Storage Service)はインターネット経由で利用できるストレージサービスです。AWSのサービス開始当初から存在するAWSの中では歴史が長いサービスで、データストレージとしてAWSというプラットフォームの中核を担う存在です。AWSでシステムを構築する際にはほぼ間違いなく利用するサービスですので、しっかりとその使い方や特徴を押さえておきましょう。

特徴

イレブンナイン(99.999999999%)の堅牢性

データをAmazon S3に保存しておけば、データ消失のリスクはほぼゼロにすることができます。Amazon S3では、保存されたファイルをリージョン内で3箇所以上のデータセンターに自動的に複製して保持することによってこの"イレブンナイン"の堅牢性を実現しています。なお、可用性については99.99%の設計となっています。(データを消失する可能性はほぼゼロですが、年間で計算すると1時間程度Amazon S3のサービスが停止する可能性がある、ということです。)

容量無制限

保存できるデータ容量、ファイル数に制限はありません。従量課金なので使った分だけ料金は発生しますが、容量を気にせず使用できることは大きなメリットかと思います。なお、データの総量に対する制限はありませんが、ファイルサイズには1ファイル最大「5TB」までという上限があります。

安価

ストレージの料金は、本ブログ記事執筆時点では「月額:約4円($0.033)/GB」(東京リージョン)となっています。これを安いと感じるか否かは人それぞれかとは思いますが、簡単にイレブンナインの堅牢性を享受できることを考慮すると十分にリーズナブルな価格なのではないかと思います。

ユースケース

上述のような特徴を持つAmazon S3ですが、主なユースケースとしては大きく以下の3つが挙げれます。

データのバックアップ

"イレブンナインの堅牢性"という特徴から最もイメージし易いのがデータバックアップストレージとしての用途かもしれません。ディザスタリカバリ目的でオンプレミスにあるサーバのバックアップを保存する、というケースが典型的かと思います。個人でも写真や動画データをS3に保存する、といった使い方も可能です。

コンテンツ配信

S3に保存したファイルはインターネット経由でアクセス可能ですので、Webサイトの静的コンテンツ(htmlファイル、画像ファイル、javascriptファイルなど)をS3に保存しておき、S3から直接クライアントに配信することができます。 こうすることで、WebサイトをホストするWebサーバの負荷を軽減することが可能です。また、後述する「静的ウェブサイトのホスティング」の機能を使うと、S3自体をWebサーバとして機能させることも可能です。

ログデータ等の保存先

EC2で稼働するアプリケーションのログ退避先や、ビッグデータ分析で使用する生データ(基幹システムのDBからエクスポートしたCSVファイルなど)や中間データ(生データを分析用に加工したもの)の保存先としてもAmazon S3が活用できます。各種AWSサービスのログの保存先としてもAmazon S3が使われています。

用語

個々の機能の紹介に入る前に、Amazon S3で使われる主な用語を整理しておきたいと思います。

|用語 |説明| |:--|:--| |オブジェクト|Amazon S3に格納されるファイル。| |バケット|オブジェクトのコンテナ(保存場所)。すべてのオブジェクトはバケット内に格納される。 作成可能なバケット数は1アカウントあたり最大で100個まで。 ・バケット名はグローバルでユニークな必要あり。| |キー|オブジェクト固有の識別子(オブジェクトの名前)。 オブジェクトにはウェブサービスエンドポイント、バケット名、キー、(およびオプションでバージョン)を組み合わせることで一意にアクセスすることができる。|

Getting Started

以降は、実際にAWSマネジメントコンソールでの操作画面を交えつつ、Amazon S3についてより詳しく説明していきたいと思います。

まずは基本操作である、バケットの作成〜ファイルのアップロードをやってみましょう。

(1) バケットの作成

  • http://aws.amazon.com/jp/s3/から、Amazon S3のマネジメントコンソールを開きます。
  • 「バケットの作成」をクリクします。

advent-cal-2015-S3-1

  • 「バケット名」を入力します。バケット名は全世界でユニークな必要がありますのでご注意ください(すでに使用済みの名前を入力した場合は、バケット作成のタイミングでエラーメッセージが表示されます)。

バケットの命名規則

  • 「リージョン」を選択し「作成」をクリックします。

advent-cal-2015-S3-2

(2) ファイルのアップロード

  • 作成したバケットをクリックします。

advent-cal-2015-S3-3

  • 「アクション」-「アップロード」をクリクします。

advent-cal-2015-S3-4

  • 「ファイルの追加」をクリックし、アップロードするファイルを選択します。

advent-cal-2015-S3-5

  • ファイルが選択されたことを確認し、「アップロードの開始」をクリックします。

advent-cal-2015-S3-6

  • 画面右にはファイルのアップロード状況が表示されます。アップロードが完了すると、画面左のオブジェクト一覧にアプロードしたファイルが表示されます。

advent-cal-2015-S3-7

(3) ファイルの表示

  • アップロードしたファイルをブラウザ上で表示するには、該当ファイル(オブジェクト)を選択し「アクション」-「開く」をクリックします。

advent-cal-2015-S3-8

データストレージクラス

アップロードしたファイルを見ると「ストレージクラス」という属性があります。Amazon S3には堅牢性や料金が異なる複数の「ストレージクラス」が存在し、用途によってこれらを使い分けることでコストの最適化を図ることができます。デフォルトのストレージクラスは「スタンダード」です。

advent-cal-2015-S3-9

|ストレージクラス|堅牢性|可用性|説明| |:--|:--|:--|:--| |スタンダード(Standard)|99.999999999%|99.99%|デフォルトのストレージクラス。| |スタンダード-低頻度アクセス(Standard-IA)|99.999999999%|99.9%|堅牢性はスタンダードと同等だが、ストレージ料金はスタンダードよりも安価。 ただし「データ取り出し」時に料金が発生する。 [使用例] アクセスが少ないデータを長期保存する。| |低冗長化(Reduced Redundancy Storage)|99.99%|99.99%|複製箇所が2箇所に削減されるためスタンダードよりも堅牢性が劣るが、その分安価に使える。 [使用例] 再生可能なサムネイルやサイズ変更された画像を格納(元画像はスタンダードに保存)| |アーカイブ(Glacier)|99.999999999%|99.99%(オブジェクトを復元後)|Glacierに保存したオブジェクトはリアルタイムでアクセスできない(アクセスする前に、アーカイブされたオブジェクトを復元する必要がある)。 オブジェクトの復元には3~4時間かかる場合がある。 コンプライアンスのためのデータアーカイブ

ストレージクラスはオブジェクト毎にプロパティから設定が可能です(Glacierのみ、後述の「ライフサイクル」から設定します)。

advent-cal-2015-S3-10

それぞれのストレージクラスの料金についてはAmazon S3の料金表を参照ください。

「スタンダード-低頻度アクセス」は今年の9月に登場した新しいストレージクラスで、上記の「取り出し料」の他「最低30日間分の課金がかかる」などいくつかの利用上の条件があります。使い方を誤るとスタンダードよりも高額になる可能性がありますのでご注意ください。

【新発表】Amazon S3に更なる低価格帯ストレージクラス「Standard – IA」が登場 | Developers.IO

データ整合性モデル

「データストレージクラス」の他にAmazon S3を利用する上で押さえておく必要がある仕様に「データ整合性モデル」があります。Amazon S3ではデータを複数の場所に複製することで高い堅牢性、可用性を実現していますが、これを実現するためにデータの更新・削除については結果整合性モデル(Eventual Consistency Read)が採用されています。

オブジェクトの操作 整合性モデル 説明
新規登録(新規PUT) 書き込み後の読み取り整合性 データ登録完了後、即時データが参照できる。
更新(上書きPUT) 結果整合性 ・更新直後は、以前のデータが参照される可能性がある。
削除(DELETE) 結果整合性 ・削除直後は、以前のデータが参照される可能性がある。

データの更新・削除については「以前のデータが参照される可能性がある」という前提でアプリケーションなどの設計を行う必要があります。

なお、長らく「US Standardリージョン」のみ「新規登録(新規PUT)」が「結果整合性」でしたが、今年の6月にアップデートがあり全リージョン共通で上記の整合性モデルとなりました。

【アップデート】S3の一貫性に変更があります | Developers.IO

アクセスコントロール

再びAWSマネジメントコンソールに戻って、アップロードしたファイル(オブジェクト)について見てきます。オブジェクトのプロパティを開くと、オブジェクトに付与されたURLが確認できます。

advent-cal-2015-S3-11

しかし、このURLをクリックしても以下のようなエラーメッセージが表示されファイルを表示することができません。

advent-cal-2015-S3-12

デフォルトでは、Amazon S3のバケットやオブジェクトなどは全てプライベートアクセスのみ可能(バケットやオブジェクトを作成したユーザのみアクセス可能)となっており、認証情報なしにはオブジェクトにはアクセスできない仕様になっています(AWSマネジメントコンソール経由であれば表示できるが、Webブラウザから直接アクセスはできない、という状態です)。

オブジェクトを自分以外のユーザに公開するにはオブジェクトに適切なアクセス権を設定する必要があります。このアクセス権を設定する方法として用意されているのが、バケットポリシーアクセスコントロールリスト(ACL)ユーザポリシーの3つです。

|アクセス権の設定方法|説明| |:--|:--| |バケットポリシー|バケット毎にアクセス権限を指定。 クロスアカウントでのS3バケットアクセス権を付与する場合などに使用。| |ACL|バケットおよびオブジェクト毎にアクセス権限を指定。(バケットACLよりオブジェクトACLが優先される。) バケット単位やオブジェクト単位で簡易的に権限を付与する場合などに使用。| |ユーザポリシー(IAMでの制御)|IAMユーザに対して、S3やバケットへのアクセス権限を設定。 複数バケットやS3以外のサービスも含めて一元的にユーザ権限を指定する場合などに使用。|

選択肢が3つもあって、どれを使えば良いのかがすぐには分かりません。以下のブログエントリや、AWS公式ドキュメントのチュートリアルを読んで理解を深めましょう。

S3のアクセスコントロールが多すぎて訳が解らないので整理してみる | Developers.IO チュートリアル例: Amazon S3 リソースへのアクセスの管理 - Amazon Simple Storage Service

アプロードしたファイルをパブリックアクセス可能にする

アクセスコントロールの例として、アップロードしたファイルをパブリックアクセス可能にする操作をご紹介します。一番簡単な方法は、オブジェクトを選択し「アクション」-「公開する」をクリック、です。

advent-cal-2015-S3-13

これでこのオブジェクトはインターネット上に公開され、誰からでもアクセス可能な状態となります。

実態としては、「公開する」を実行するとその裏でACLに「全員(Everyone)」に対して「開く/ダウンロード」を許可するポリシーが追加されます。

advent-cal-2015-S3-14

静的ウェブサイトホスティング

パブリックに公開したファイルは、リンク先としてこのファイルのURL(https://s3-ap-northeast-1.amazonaws.com/<バケット名>/<ファイル名>など)を指定すればAmazon S3からクライアントへ直接配信することができます。これにより、EC2でWebサーバを立てつつ、画像ファイルなどはAmazon S3から配信する、という構成が可能となります。

さらに、Amazon S3の「ウェブサイトのホスティング機能」を使えばAmazon S3のみで(EC2無しで)静的なウェブサイトをホスティングすることが可能です(下のスライドの左側、「静的コンテンツ中心のサイト」の構成です)。

静的ウェブサイトホスティングの設定方法

  • ウェブサイトのホスティング用のバケットを作成し、以下のようにWebサイトのファイル一式をアプロードします(AWSマネジメントコンソールは"フォルダ"のアップロードには対応していません。予め「アクション」-「フォルダの作成」からバケット下にフォルダ *1を作成しておきます)。

advent-cal-2015-S3-15

  • 「静的ウェブホスティング」の「ウェブサイトのホスティングを有効にする」にチェックを入れ、「インデックスドキュメント」(index.htmlなど)を入力します(エラードキュメントの設定は任意です。設定すると、404エラー等の際にこのドキュメントが表示されます)。

advent-cal-2015-S3-16

  • これで「静的ウェブホスティング」は有効になりますが、バケット自体がプライベートに設定されているので外部からアクセスすることが出来ません。バケットポリシーを設定して、外部からのアクセスを許可します(すべてのユーザにGetObject操作を許可します)。

  • 「アクセス許可」を展開し「バケットポリシーの追加」をクリックします。

advent-cal-2015-S3-17

  • バケットポリシーを以下のように設定し「保存」をクリックします。
{
"Version":"2012-10-17",
"Statement":[{
"Sid":"PublicReadForGetBucketObjects",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::<バケット名>/*"
]
}
]
}

advent-cal-2015-S3-18

  • 静的ウェブサイトホスティングを設定すると、Amazon S3の通常のエンドポイント(オブジェクトにアクセスするためのURL)とは別に静的ウェブサイトホスティング用のエンドポイントが付与されますので、こちらを使ってアクセスします。

advent-cal-2015-S3-19

  • 東京リージョンでの静的ウェブサイトホスティングのエンドポイントは以下の形式となります。

&lt;バケット名&gt;.s3-website-ap-northeast-1.amazonaws.com

  • Amazon S3の通常のエンドポイント(REST API エンドポイント)と静的ウェブサイトホスティングのエンドポイントの主な違いは以下の通りです。
主な違い REST API エンドポイント ウェブサイトエンドポイント
アクセスコントロール パブリックコンテンツとプライベートコンテンツの両方をサポート。 公開で読み取り可能なコンテンツのみをサポート。
エラーメッセージの処理 XML形式のエラーレスポンスを返す。 HTMLドキュメントを返す。
リダイレクトのサポート 該当しない。 オブジェクトレベルとバケットレベルの両方のリダイレクトをサポート。
サポートされるリクエスト バケットおよびオブジェクトのすべてのオペレーションをサポート。 オブジェクトに対してはGETリクエストとHEADリクエストのみをサポート。
バケットのルートでのGETリクエストとHEADリクエストへのレスポンス バケット内のオブジェクトキーのリストを返す。 ウェブサイト設定の中で指定されているインデックスドキュメントを返す。
SSLのサポート SSL接続をサポート。 SSL接続をサポートしない。

静的ウェブサイトホスティングの補足事項

(1) デフォルトで付与されるURLではなく、独自ドメインを使用することも可能です(実運用を考えると、こちらの方が主流かと思います)。

独自ドメインを使用して静的ウェブサイトをセットアップする

(2) 静的ウェブサイトホスティングをHTTPSに対応させたい場合はAmazon CloudFrontを使用し、Amazon CloudFront経由でコンテンツを配信するように設定します(Webサイトのパフォーマンスの観点からもAmazon CloudFrontを使用することが推奨されます)。

CloudFront を使用してウェブサイトを高速化する AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む) | Developers.IO

AWSマネジメントコンソール以外での操作方法

これまではAWSマネジメントコンソールを利用してAmazon S3を操作する方法をご紹介してきましたが、AWSマネジメントコンソール以外にもAmazon S3をを操作する方法はあります。

大量のファイルを一括処理したい場合や繰り返し実行される定型的な処理を自動化したい場合など、Amazon S3をコマンドラインやプログラムから扱いたい時にはAWS CLIAWS SDKを利用します。(これは他のAWSサービスでも共通です。)

ちなみにAWS CLIのAmazon S3用のコマンドには、aws s3apiaws s3との2種類があり、前者がAPIとコマンドが1対1で対応する形の低レベルなコマンド群で、後者が複数のリクエストにまたがるような処理など(例:後述する並列アップロード)が実装された高レベルなコマンド群となります。

また、Amazon S3に対応した3rd Party製のGUIツールもありますので、これらを使う方法もあります。

GUIツールとしてはCloudBerryCyberduckが有名かと思います。

Amazon S3バケットへのファイルアップロードを実現する – 01.概要&GUIお勧めツール編 | Developers.IO

Multipart Upload

冒頭で「Amazon S3に保存可能なファイルサイズは1ファイル最大「5TB」まで」と述べましたが、実はこの他に「1回のPUT処理でアップロードできるファイルサイズ = 最大5GB」という上限があります。1回に5GBまでしかアップロードできないのなら、バケットに格納可能な最大ファイルサイズも5GBなのでは?と考えてしまいそうですが、Amazon S3にはMultipart Uploadと呼ばれる機能があり、これを使うと5GBより大きいサイズのファイルを5GB以下に分割してアップロードすることができます。(分割したファイルはAmazon S3側で単一オブジェクトに結合されます。)

Multipart Uploadはサイズが5GB未満のファイルでも利用できます。Multipart Uploadでは処理が並列で実行されアップロード処理全体のスループットが向上するという効果があるため、サイズが100MBを超えるファイルの場合はこのMultipart Uploadの使用が推奨されています。

Multipart Uploadの実行方法

Multipart Uploadは各AWS SDKにて実装済みのため、これらのSDKを使って比較的簡単にMultipart Uploadを実行することが可能です。

Multipart Upload API を使用したオブジェクトのアップロード

またはAWS CLIの場合は、前述した高レベルなコマンド群はMultipart Uploadに対応しているため、aws s3 cpaws s3 syncを使うとファイルサイズを元によしなにファイルを分割しMultipart Uploadを実行してくれます。

s3 — AWS CLI Command Reference

セキュリティ

上述のアクセスコントロールの他にAmazon S3が対応しているセキュリティ関連の機能を2つご紹介します。

データの暗号化

サーバサイド暗号化とクライアントサイド暗号化が利用できます。

サーバサイド暗号化

  • SSE-S3:AWSが管理する鍵を利用して暗号化
  • SSE-KMS:Key Management Service(KMS)の鍵を利用して暗号化
  • SSE-C:ユーザが提供した鍵を利用して暗号化(AWSの鍵は管理しない)

クライアントサイド暗号化(クライアント側で暗号化したデータをS3にアップロード)

  • AWS KMSで管理されたマスターキーを利用して暗号化
  • クライアントが管理するマスターキーを利用して暗号化

暗号化を使用したデータの保護 - Amazon Simple Storage Service S3のユーザ提供キーによるクライアントサイド暗号化 (CSE) を使い倒す | Developers.IO Amazon S3暗号化と運用 | Developers.IO S3のユーザ提供キーによるサーバサイド暗号化 (SSE-C) を試してみた | Developers.IO

署名付きURL

AWS SDKを利用して生成される署名されたURLを発行することで、プライベートなオブジェクトに対して一定時間アクセスを許可することが可能です。会員制のサイトなどで、認証されたユーザにのみコンテンツを配信したい場合などの有用です。

具体的な実装方法は以下にAWS SDKでのコード例を参照ください。

署名付きURLを使用したオブジェクトのアップロード

バージョン管理

イレブンナインの堅牢性も、ヒューマンエラーには対応できません。バージョニングの機能を使うと、誤削除などのヒューマンエラー発生時にもファイルを以前のバージョンに戻すことが可能となります。

バージョニングを有効化すると、オブジェクト更新時に前世代オブジェクトが自動的に保管されるようになります。バージョニングはバケット全体またはプレフィックスに対して設定できます。後述の「ライフサイクル管理」と連携し保存世代数を指定して使います。

advent-cal-2015-S3-21

ライフサイクル管理

ライフサイクル管理 の機能を使って、バケット内のオブジェクトを自動的に削除またはアーカイブ(Glacierへ移動)することが可能です。ライフサイクルの設定は、オブジェクトの更新日をベースに日単位での指定が可能(0の場合は当日実行)で、バケット全体もしくはPrefixに対して設定できます(アーカイブ及び削除の日程をそれぞれ指定した組み合わせも可能です)。設定された削除やアーカイブの処理は、毎日0:00(UTC)に処理がキューイングされ順次実行される仕様になっています。

ライフサイクルの設定方法

  • 対象のバケットのプロパティを開きます。「ライフサイクル」を展開し「ルールを追加する」をクリックします。

advent-cal-2015-S3-23

  • ルールの適用先(バケット全体 or プレフィックス)を選択し「ルールの設定」をクリックします。

advent-cal-2015-S3-24

  • ルールを設定し「確認」をクリックします。

advent-cal-2015-S3-25

  • ルール名を入力し「ルールの作成と有効化」をクリックします。

advent-cal-2015-S3-26

[新機能]Amazon S3のVersioningとLifecycleを組み合わせる | Developers.IO

Notification機能

バケットにファイルがアップロードされたことを通知した場合や、アップロードされたファイルを使って後続の処理を実行したい場合(例えばデータをRedshiftに投入するなどの場合)には、Notification機能が使用できます。 Notificationはバケット単位で、以下のイベントが発生した際にAmazon SNS, Amazon SQS, AWS Lambdaに対して通知することができます。

  • 新しいオブジェクトの作成イベント(Put, Post, Copy, CompleteMultiPartUpload)
  • オブジェクト削除イベント(Delete, DeleteMarkerCreated)
  • 低冗長化ストレージのオブジェクト消失イベント(RRSObjectLost)

以下は、オブジェクトのPutイベントをSNSに通知する設定例です(SNS側の設定が別途必要です)。

advent-cal-2015-S3-27

Amazon S3のCross-Region Replicationを使ってAWS Lambdaを発火させる | Developers.IO 【新機能】S3 Event NotificationにDeleteイベントが追加されました | Developers.IO Amazon S3の画像をAWS Cloudfrontで配信するキャッシュコントロールをAWS Lambdaで自動化する | Developers.IO S3にアップロードしたCSVファイルをLambda経由でAmazon RedshiftにCOPYする – AWS Lambda Advent Calendar 2014:2日目 | Developers.IO

その他の機能

Amzon S3で使えるその他の便利機能について簡単にご紹介したいと思います。

クロスリージョンレプリケーション

オブジェクトの別のリージョンへレプリケーションすることができます。

クロスリージョン レプリケーション - Amazon Simple Storage Service

Amazon S3へのアクセスログ

バケット単位でバケットに対するアクセスログの出力設定が可能です(ログの出力先はAmazon S3バケットです)。

Tag管理

バケットに対してタグの指定が可能です。

コスト配分タグの使用 - AWS 請求情報とコスト管理

メタデータ

オブジェクトに任意のメタデータを設定することができます(Content-Typeなど)。

オブジェクトキーとメタデータ

合わせて読みたい

公式情報

Developers.IO関連エントリ

さいごに

以上、『AWS サービス別 再入門アドベントカレンダー 2015』の1日目のエントリ『Amazon S3編』でした。Amazon S3は安価に使えるので、今回ご紹介した機能について実際にその手で触って動作を確かめていただくとより理解が深まるかと思います。また「スタンダード-低頻度アクセス」や「クロスリージョンレプリケーション」などの今年リリースされた新機能については改めてキャッチアップしておきましょう。

明日(12/2)は大瀧の「Amazon VPC」の予定です。お楽しみに!

脚注