レベル: 初級 Prabhakar Chaganti, CTO, Ylastic, LLC
2008年 08月 19日 Amazon Web サービス™を利用したクラウド・コンピューティングについて学ぶ連載「Amazon Web サービスを利用したクラウド・コンピューティング」では、スケーラブルで信頼性の高いアプリケーションを設計し、構築する上で Amazon Web サービスがどのように強力な代替手段を提供するかを探っていきます。今回の記事では、Amazon S3 (Simple Storage Service) が提供する極めてスケーラブルで応答性に優れたサービスについて掘り下げていきます。また、S3 とのインターフェースに使用するツールを紹介し、コード・サンプルを用いて単純なシェルを試してみます。
Amazon S3 (Simple Storage Service)
この連載の第 1 回では、Amazon Web サービスのビルディング・ブロックを紹介し、この仮想インフラストラクチャーを利用して Web スケールのシステムを構築する方法を説明しました。
今回の記事では、Amazon S3 (Simple Storage Service) について詳しく学びます。S3 は任意の量のデータをいつでも、そして世界中のどこからでも簡単に保存、および取得することができる極めてスケーラブルな高速インターネット・データ・ストレージ・システムです。ストレージと帯域幅に対する料金は、実際にサービスを利用した量を基にして計算されます。セットアップ費用や、基本料金、その他定常的に発生する諸経費などはありません。
ストレージ・インフラストラクチャーの保守管理は Amazon が行ってくれるため、ユーザーはシステムとアプリケーションのコア機能に専念することができます。S3 は業界仕様の強力なプラットフォームで、データ・ストレージのニーズにすぐに対応できます。そんな S3 は、以下の用途に最適です。
- アプリケーションのデータ・ストレージ
- 個人用または企業用のバックアップ・ストレージ
- メディア情報など、帯域幅を大量に消費するコンテンツの、迅速かつ低コストでの顧客への配信
S3 には以下の特徴があります。
- 信頼性
- 耐障害設計のこのシステムは、修復が必要な場合でも、最小限のダウンタイム、あるいはダウンタイムなしで、極めて短時間で修復できるように設計されています。Amazon が規定しているサービス・レベル・アグリーメント (SLA) には、99.99 パーセントの可用性が規定されています。
- 単純さ
- 単純な概念の基に構築された S3 は、アプリケーションの開発に大幅な柔軟性をもたらします。必要な場合には、S3 コンポーネントの上に追加機能を積み重ねていくことで、より複雑なストレージ・スキームを構築することができます。
- スケーラビリティー
- S3 の設計が提供する高度なスケーラビリティーにより、Web スケールのアプリケーションで急激に需要が増加しても、容易にサービスを拡張することができます。
- 低コスト
- S3 の料金は、市場に出回っている他の企業用および個人用データ・ストレージ・ソリューションに比べて非常に魅力的です。
S3 フレームワークを支える基本概念は、バケット、オブジェクト、キーの 3 つです。
バケット
バケットは S3 の基本となるビルディング・ブロックです。Amazon S3 に保存されるオブジェクトのそれぞれは、バケットのなかに収容されます。バケットはいわば、ファイル・システムでのフォルダーあるいはディレクトリーのようなものですが、ファイル・フォルダーとバケットとの間には 1 つの決定的な違いがあります。それは、各バケットとそのコンテンツは URL でアドレス指定することができるという点です。例えば、「prabhakar」という名前のバケットがある場合、このバケットは URL http://prabhakar.s3.amazonaws.com でアドレス指定することができます。
S3 アカウントごとに許容されるバケットの最大数は 100 です。バケット同士をネストすることはできないため、バケットの内部にバケットを作成することはできません。バケットの地理的ロケーションを指定したい場合には、バケットを作成するときにロケーション制約を指定します。この指定により、バケットにオブジェクトを保存すると、そのオブジェクトは自動的に該当する地理的ロケーションに保存されることになります。バケットの作成時には、米国内または EU 内いずれかにバケットを配置することができます。バケットを作成する時点でロケーションを指定しない場合は、アカウントの請求先アドレスに最も近いロケーションにバケットとそのコンテンツが保存されます。
バケットの名前は以下の S3 要件に準拠する必要があります。
- 数字または文字で始まる名前であること。
- 3 文字から 255 文字の名前であること。
- 名前には、英小文字、数字、ピリオド、アンダーバー、およびダッシュのみが含まれること。
- 数字とピリオドからなる名前も許容されますが、IP アドレス形式にはしないこと。バケットに 192.168.1.254 のような名前を付けることはできません。
- バケットの名前空間は S3 にあるすべてのアカウントのすべてのバケットが共有します。したがって、バケット名は S3 全体で一意の名前であること。
アドレス指定可能な URL でサービスを提供するオブジェクトをバケットに含める場合、そのバケットは以下の S3 要件にも準拠しなければなりません。
- バケットの名前にはアンダーバーを含めないこと。
- 3 文字から 63 文字の名前であること。
- 名前がダッシュで終わっていないこと。例えば、myfavorite-.bucket.com は無効です。
- 名前のなかでピリオドとダッシュが続いていないこと。したがって、my-.bucket.com は無効になります。
バケットにドメイン命名規則を適用すると (例えば、media.yourdomain.com など)、既存の Web ドメインやサブドメインと Amazon S3 とのマッピングが可能になります。実際のマッピングは、S3 を指す DNS CNAME エントリーを追加した時点で行われます。このスキームによる大きな利点は、URL にユーザー固有のドメイン名を使用してファイルをダウンロードできることです。CNAME マッピングによって、ドメイン名がバケットの S3 アドレスに変換されます。例えば http://media.yourdomain.com.s3.amazonaws.com とある場合、この URL はよりわかりやすい http://media.yourdomain.com となります。
オブジェクト
オブジェクトには、S3 のバケット内に保存されたデータが含まれます。オブジェクトとは、保存したいファイルのことだと考えてください。保存されるオブジェクトのそれぞれは、データとメタデータという 2 つのエンティティーで構成されます。データは、実際に保存する PDF ファイル、Word 文書、動画ファイルなどです。保存されるデータには、そのオブジェクトを記述するメタデータも関連付けられます。メタデータの例としては、保存されるオブジェクトのコンテンツ・タイプ、オブジェクトの最終更新日など、ユーザーあるいはユーザーのアプリケーションに固有のあらゆるメタデータが挙げられます。オブジェクトのメタデータは、保存するオブジェクトを S3 に送信する際に、キーと値のペアとしてオブジェクトの作成者が指定します。
バケットの数は制限されていますが、それとは異なり、オブジェクトの数には制限がありません。バケットに保存できるオブジェクト数は無制限で、各オブジェクトには最大 5GB のデータを含めることができます。
公開されていてアクセス可能な S3 オブジェクト内のデータは、HTTP、HTTPS、または BitTorrent によって取得することができます。S3 アカウントから大規模なメディア・ファイルを配布する場合には、BitTorrent を使用すると至って簡単に配布できるようになります。Amazon はオブジェクトのトレント (Torrent) を作成するだけでなく、トレント・ファイルのシード (配布) まで行ってくれます。
キー
S3 バケット内に保存されたオブジェクトは、それぞれ一意のキーによって識別されます。これは概念的には、ファイル・システム上ではフォルダー内でファイル名が一意であることと同様です。ハード・ドライブ上のフォルダー内では、ファイル名は一意でなければなりません。バケット内に含まれる各オブジェクトが持つキーは 1 つだけなので、このキーとバケットの名前とを組み合わせることで、S3 に保存された各オブジェクトの ID が一意になります。
S3 内のあらゆるオブジェクトは、S3 サービスの URL、バケット名、そして一意のキーの 3 つを組み合わせた URL を使用してアドレス指定することができます。例えば、my_favorite_video.mov というキーを持つオブジェクトを、prabhakar という名前のバケットに保存する場合、このオブジェクトをアドレス指定する URL は http://prabhakar.s3.amazonaws.com/ my_favorite_video.mov となります。
図 1 に示すように、バケット、オブジェクト、キーの概念は単純なものですが、この 3 つを組み合わせることで、データ・ストレージ・ソリューションの構築に多大な柔軟性がもたらされます。これらのビルディング・ブロックを使用して S3 で単にデータを保存することも、3 つの概念による柔軟性を利用して S3 をベースにさらに複雑なストレージとアプリケーションを構築し、機能を追加することもできます。
図 1. S3 の概念図
アクセスのロギング
それぞれの S3 バケットにアクセス・ログ・レコードを持たせ、バケット内のオブジェクトに対するリクエストごとに、その詳細を記録することできます。ログ・レコードはデフォルトではオフになっているので、追跡したい Amazon S3 バケットに対するロギングを明示的に有効にする必要があります。アクセス・ログ・レコードには、リクエストのタイプ、リクエスト対象のリソース、リクエストが処理された日時など、リクエストに関する大量の詳細情報を含めることができます。
ログは S3 サーバー・アクセス・ログ・フォーマットで記録されますが、Apache を組み合わせたログ・フォーマットに容易に変換することができます。フォーマットをこのように変換すると、オープンソースや市販のログ分析ツール (Webalizer など) で簡単に分析できるようになるので、必要に応じて人間にも理解できるレポートやきれいなグラフを作成することができます。これらのレポートは、ファイルにアクセスする顧客基盤を把握する上で役立つはずです。S3 ログ・レコードを容易に表示するツールについては、「参考文献」を参照してください。
セキュリティー
S3 で作成されたバケットとオブジェクトは、それを作成したユーザー・アカウント専用になります。他のユーザーや顧客が S3 バケット内のオブジェクトの一覧を表示できるようにしたり、そこに含まれるデータをダウンロードできるようにするには、明示的に権限を付与しなければなりません。Amazon S3 には、バケットとそのなかに含まれるオブジェクトを保護するためのセキュリティー機能が用意されています。
- 認証
- リクエストが、バケットまたはオブジェクトを所有するユーザーからのものであることを確実にします。各 S3 リクエストには、ユーザーを一意に識別する Amazon Web サービスのアクセス・キーが組み込まれている必要があります。
- 許可
- リソースにアクセスしようとしているユーザーに、そのリソースに対するアクセス権があることを確実にします。各 S3 オブジェクトにはアクセス制御リスト (ACL) が関連付けられ、これによって該当リソースに対するアクセス権が明示的に識別されます。アクセス権は、Amazon Web サービスの全ユーザー、または E メール・アドレスによって識別される特定のユーザーに付与することができます。あるいは、任意のユーザーに匿名アクセス権を付与することもできます。
- 整合性
- 各 S3 リクエストには、Amazon Web サービスのシークレット・アクセス・キーを持つ要求側ユーザーがデジタル署名する必要があります。S3 はリクエストの受信時に署名を確認し、リクエストが送信中に改ざんされていないことを確実にします。
- 暗号化
- データが確実に暗号化接続によって送信されるように、S3 には HTTPS プロトコルでアクセスすることができます。
- 否認防止
- 各 S3 リクエストにはタイムスタンプが付けられ、トランザクションの証拠としての役割を果たします。
S3 に対する REST リクエストはいずれも、以下の標準ステップに従う必要があります。これらのステップは、セキュリティーを確実にするためには不可欠です。
- リクエストと必要なすべてのパラメーターを 1 つのストリングにアセンブルします。
- Amazon Web サービスのシークレット・アクセス・キーを使用して、リクエスト・ストリングの鍵付き HMAC (Hash Message Authentication Code) 署名ハッシュを作成します。
- 計算されたこの署名自体も、リクエストのパラメーターとして追加されます。
- リクエストが Amazon S3 に転送されます。
- Amazon S3 が、提供された署名がそのリクエストに有効な鍵付き HMAC ハッシュであるかどうかを確認します。
- Amazon S3 は、署名が有効である場合に限り、リクエストを処理します。
料金
S3 の料金は 3 つの基準に従って計算されます。これらの基準は、バケットの地理的ロケーションによって以下のように異なります。
- ストレージ・スペースの合計使用量。これにはデータ・コンテンツの実際のサイズと、関連メタデータが含まれます。S3 がストレージ使用量を決定するために使用する単位は、1 ヶ月あたりの GBです。アカウントで使用されたストレージのバイト数が 1 時間ごとに計算され、月末になった時点で、その月に使用したストレージ量に変換されます。以下の表に、ストレージの料金を記載します。
|
ロケーション
|
料金
| | 米国 | 1 ヶ月あたり 1 GB ごとのストレージ使用料 $0.15 | | EU | 1 ヶ月あたり 1 GB ごとのストレージ使用料 $0.18 |
- S3 とのデータ転送量または使用帯域幅。これには、S3 にアップロードしたデータと S3 からダウンロードしたデータがすべて含まれます。EC2 と米国内にある S3 バケットの間で転送されたデータには料金はかかりません。EC2 と EU 内の S3 バケットの間で転送されたデータについては、以下に示す標準データ転送料金が課せられます。
|
ロケーション
|
料金
| | 米国 | 1 GB ごとに $0.100 — すべてのデータ・アップロード
1 GB ごとに $0.170 — データ・ダウンロード: 1 ヶ月あたり最初の 10 TB まで 1 GB ごとに $0.130 — データ・ダウンロード: 1 ヶ月あたり次の 40 TB まで 1 GB ごとに $0.110 — データ・ダウンロード: 1 ヶ月あたり次の 100 TB まで 1 GB ごとに $0.100 — データ・ダウンロード: 1 ヶ月あたり 150 TB を超える分 | | EU | 1 GB ごとに $0.100 — すべてのデータ・アップロード
1 GB ごとに $0.170 — データ・ダウンロード: 1 ヶ月あたり最初の 10 TB まで 1 GB ごとに $0.130 — データ・ダウンロード: 1 ヶ月あたり次の 40 TB まで 1 GB ごとに $0.110 — データ・ダウンロード: 1 ヶ月あたり次の 100 TB まで 1 GB ごとに $0.100 — データ・ダウンロード: 1 ヶ月あたり 150 TB を超える分 |
- 実行された API リクエスト数。S3 では、オブジェクトの作成、バケットのリスト、オブジェクトのリストなど、インターフェースを使用して行われたリクエストごとに料金を請求します。オブジェクトおよびバケットの削除については無料です。リクエストの料金は、バケットの地理的ロケーションによって多少異なります。以下の表に、API リクエストの料金を記載します。
|
ロケーション
|
料金
| | 米国 | PUT、POST または LIST リクエスト 1,000 回につき $0.01 GET およびその他のリクエスト 10,000 回につき $0.01 削除リクエストは無料 | | EU | PUT、POST または LIST リクエスト 1,000 回につき $0.012 GET およびその他のリクエスト 10,000 回につき $0.012 削除リクエストは無料 |
最新の料金については、Amazon S3 を調べてください。また、AWS Simple Monthly Calculator を使用して S3 やその他の Amazon Web サービスの月々の使用料を計算することもできます。
Amazon Web サービスおよび S3 の開始手順
S3 を使い始めるには、Amazon Web サービスのアカウントにサインアップする必要があります。サインアップすると、ユーザーには Amazon Web サービスのアカウント番号が割り当てられ、S3 との通信で使用する各種のライブラリーとツールを使用する際に必要となるセキュリティー・アクセス・キーおよび X.509 セキュリティー証明書が与えられます。
Amazon Web サービスのどのサービスと通信するにも、その手段としては SOAP インターフェースまたはクエリー/REST インターフェースのいずれかが使用されます。このいずれかのインターフェースを介して送信するリクエスト・メッセージには、送信側ユーザーによるデジタル署名が必要です。デジタル署名によって、メッセージが送信中に改ざんされていないこと、そしてメッセージが本当にそのユーザーから送信されているものであることが確実になります。これは Amazon Web サービスの API を使用する際の最も基本となる部分です。各リクエストにはデジタル署名を付け、その署名がリクエストに添付されている必要があります。
Amazon Web サービスのユーザー・アカウントのそれぞれに、以下のセキュリティー・クレデンシャルが関連付けられます。
- アクセス・キー ID。ユーザーをクエリー/REST インターフェースでリクエストを行っている本人として識別します。
- シークレット・アクセス・キー。クエリー・インターフェースでリクエストを行う場合、デジタル署名を計算するために使用されます。
- 公開鍵および秘密鍵を含む X.509 証明書。SOAP インターフェースを使用する場合、リクエストの署名および認証に使用されます。
キーおよび証明書の管理と再生成、アカウントのアクティビティーと使用状況レポートの表示、およびユーザー自身のプロファイル情報の変更は、Web Services Account 情報ページから行うことができます。
Amazon Web サービスのアカウントのサインアップが完了したら、以下のステップに従ってアカウントの Amazon S3 サービスを有効にしてください。
- Amazon Web サービスのアカウントにログインします。
- S3 ホーム・ページまでナビゲートします。
- ページ右側の Sign Up For Amazon S3 をクリックします。
- 必要な情報を入力し、サインアップ・プロセスを完了します。
この記事に記載する例では、S3 との通信にクエリー/REST インターフェースを使用します。それには、アクセス・キーを取得する必要が出てきます。アクセス・キーを取得するには、Web Services Account 情報ページで AWS Access Identifiers を選択してください。これで、Amazon Web サービスを使用するための準備は完了です。アカウントに対して S3 サービスも有効になっています。
S3 の操作
S3 を操作する方法を学ぶには、Amazon で用意している既存のライブラリー、またはサード・パーティーや個人の開発者が提供するライブラリーを使用することができます。この記事では、リクエストへの署名方法やデータのカプセル化に使用する XML 文書の作成方法、あるいは S3 との間で送受信されるパラメーターなど、S3 との通信についての詳細は掘り下げません。これらの詳細の処理はすべてライブラリーに任せ、ライブラリーが提供する上位レベルのインターフェースを使用します。詳細について調べるには、S3 Developer Guide を参照してください。
ここからは、JetS3t というオープンソースの Java™ ライブラリーを使用して S3 について詳しく探り、小さなコード・スニペットを参照しながら S3 の API について学んでいきます。記事を読み終える頃には、記載したスニペットを 1 つに編成して、S3 での実験や S3 の操作にいつでも使える単純で便利な S3 シェルが完成しているはずです。
JetS3t
JetS3t は S3 を操作するためのオープンソースの Java ツールキットです。JetS3t は単なるライブラリーではなく、ディストリビューションには一般的な S3 のユーザー、そして S3 をベースにアプリケーションを構築するサービス・プロバイダーが使用できる、非常に便利な S3 関連のツールもいくつか含まれています。JetS3t の構成内容は以下のとおりです。
- Cockpit
- Amazon S3 アカウントのコンテンツを管理するための GUI です。
- Synchronize
- ユーザーのコンピューター上のディレクトリーを Amazon S3 アカウントと同期させるためのコマンドライン・アプリケーションです。
- Gatekeeper
- Amazon S3 アカウントへのアクセスの仲介として使用できるサーブレットです。
- CockpitLite
- Cockpit の軽量バージョンで、そのすべての操作を仲介ゲートキーパー・サービスによってルーティングします。
- Uploader
- すべての操作が仲介ゲートキーパー・サービスを介して行われるようにルーティングする GUI です。サービス・プロバイダーはこの GUI を使用して、自分たちの S3 アカウントに顧客がアクセスできるようにします。
もちろん、これらの GUI アプリケーションのいずれかを使って S3 を操作することも可能ですが、S3 とのインターフェースを持つアプリケーションを開発しなければならない場合には、それではあまり役に立ちません。この記事に対応する完全なソース・コードは zip 形式のアーカイブとしてダウンロードすることができます。この zip ファイルには、お使いのワークスペースにインポートしてすぐに使用できる Netbeans プロジェクトも含まれています。
S3 との接続
JetS3t には org.jets3t.service.S3Service という名前の抽象クラスが用意されています。REST や SOAP などの特定のインターフェースを実装するクラスは、この抽象クラスを継承しなければなりません。S3 に接続して操作するために使用できる実装として、JetS3t では以下の 2 つを提供しています。
org.jets3t.service.impl.rest.httpclient.RestS3Service。REST インターフェースによって S3 と通信します。
org.jets3t.service.impl.soap.axis.SoapS3Service。Apache Axis 1.4 を使用した SOAP インターフェースを介して S3 と通信します。
JetS3t は jets3t.properties という名前のファイルを使用して、S3 との通信中に使用する各種のパラメーターを構成します。この記事の例では、ディストリビューションに付属しているデフォルトの jets3t.properties を使用します。パラメーターについての詳しい説明は、JetS3t Configuration Guide に記載されています。
この記事では RestS3Service を使用して S3 に接続します。新規の RestS3Serviceオブジェクトを作成するには、Amazon Web サービスのアクセス・キーを AWSCredentials オブジェクトの形で指定します。注意する点として、記事に記載するコード・スニペットは API を説明することを目的としたものであるため、いずれのスニペットを実行するにも、必要なすべてのクラスがインポートされて存在していることを確認する必要があります。それぞれに該当するインポートについては、ダウンロード・パッケージに含まれるソースを参照してください。あるいはもっと簡単な方法として、付属の Netbeans プロジェクトをワークスペースにインポートするとソース・コードのすべてに簡単にアクセスできるようになります。
リスト 1. 新規 RestS3Service の作成
String awsAccessKey = ”Your AWS access key”;
String awsSecretKey = “Your AWS Secret key”;
// use your AWS keys to create a credentials object
AWSCredentials awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey);
// create the service object with our AWS credentials
S3Service s3Service = new RestS3Service(awsCredentials);
|
バケットの管理
バケットの概念をカプセル化する org.jets3t.service.model.S3Bucket は org.jets3t.service.model.BaseS3Object クラスを継承します。このクラスは、JetS3t モデルにおけるバケットとオブジェクト両方の親クラスです。各 S3Bucket オブジェクトには各種のアクセサー・メソッドに加え、toString() があります。このメソッドを使用することで、バケットに関する重要な情報 (バケットの名前と地理的ロケーション、バケットの作成日、所有者の名前、バケットに関連付けられたメタデータ) を出力することができます。
リスト 2. バケットのリスト
// list all buckets in the AWS account and print info for each bucket.
S3Bucket[] buckets = s3Service.listAllBuckets();
for (S3Bucket b : buckets) {
System.out.println(b);
}
|
新しいバケットを作成するには、バケットに一意の名前を指定します。バケットの名前空間はすべてのユーザー・アカウントで共有されるため、一意の名前を見つけるのは難しい場合があります。バケットを作成するときには、バケットとそのバケットに含まれるオブジェクトを物理的に配置する場所を指定することもできます。
リスト 3. バケットの作成
// create a US bucket and print its info
S3Bucket bucket = s3Service.createBucket(bucketName);
System.out.println("Created bucket - " + bucketName + " - " + bucket);
// create a EU bucket and print its info
S3Bucket bucket = s3Service.createBucket(bucketName, S3Bucket.LOCATION_EUROPE);
System.out.println("Created bucket - " + bucketName + " - " + bucket);
|
バケットを削除するには、その前に、バケットに含まれるすべてのオブジェクトを削除しなければなりません。バケットにオブジェクトが残っていると、例外が発生します。単一のオブジェクトを扱うには、これまで使用してきた RestS3Service クラスで十分ですが、複数のオブジェクトを扱うようになってきたら、処理速度を上げるためにマルチスレッド化方式を使用するのが妥当です。まさにそのために JetS3t が用意しているのが、org.jets3t.service.multithread.S3ServiceSimpleMulti クラスです。このクラスを使って既存の s3Service オブジェクトをラップすれば、マルチプロセッサーを最大限に活用することができます。この方法は、バケットを削除するためにバケットに含まれるすべてのオブジェクトを削除する際に活躍します。
リスト 4. バケットの削除
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);
// delete a bucket – it must be empty first
s3Service.deleteBucket(bucket);
// create a multi threaded version of the RestService
S3ServiceSimpleMulti s3ServiceMulti = new S3ServiceSimpleMulti(s3Service);
// get all the objects from bucket
S3Object[] objects = s3Service.listObjects(bucket);
// clear the bucket by deleting all its objects
s3ServiceMulti.deleteObjects(bucket, objects);
|
それぞれのバケットには、そのバケットに対するアクセス権、そして他のユーザーに与えられるアクセス・レベルを決定する ACL が関連付けられます。ACL を取得して、その ACL に指定されている権限を出力する方法は以下のとおりです。
リスト 5. バケットの ACL の取得
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);
// get the ACL and print it
AccessControlList acl = s3Service.getBucketAcl(bucket);
System.out.println(acl);
|
新規に作成されるバケットおよびオブジェクトにデフォルトで設定されるアクセス権では、所有者のみがアクセスできるようになっています。このデフォルト設定を変更するには、バケットの ACL を変更して、ユーザーのグループに読み取り権限を与えるか、書き込み権限を与えるか、あるいはバケットをフルに制御できるようにします。
リスト 6. バケットとそのコンテンツを公開するための変更
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);
// get the ACL
AccessControlList acl = s3Service.getBucketAcl(bucket);
// give everyone read access
acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ);
// save changes back to S3
bucket.setAcl(acl);
s3Service.putBucketAcl(bucket);
|
バケットのロギングを有効して、現行のロギング・ステータスを取得するのは簡単です。ロギングが有効にされると、バケット内の各ファイルに対する詳細なアクセス・ログが S3 に保存されます。このログに基づき、利用したストレージ・スペースに対する料金が S3 アカウントに対して請求されます。
リスト 7. S3 バケットのロギング
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);
// is logging enabled?
S3BucketLoggingStatus loggingStatus = s3Service.getBucketLoggingStatus(bucketName);
System.out.println(loggingStatus);
// enable logging
S3BucketLoggingStatus newLoggingStatus = new S3BucketLoggingStatus();
// set a prefix for your log files
newLoggingStatus.setLogfilePrefix(logFilePrefix);
// set the target bucket name
newLoggingStatus.setTargetBucketName(bucketName);
// give the log_delivery group permissions to read and write from the bucket
AccessControlList acl = s3Service.getBucketAcl(bucket);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_WRITE);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_READ_ACP);
bucket.setAcl(acl);
// save the changed ACL for the bucket to S3
s3Service.putBucketAcl(bucket);
// save the changes to the bucket logging
s3Service.setBucketLoggingStatus(bucketName, newLoggingStatus, true);
System.out.println("The bucket logging status is now enabled.");
|
オブジェクトの管理
バケットに含まれるそれぞれのオブジェクトは、org.jets3t.service.model.S3Object によって表されます。S3Bucket オブジェクトが提供する toString() を使用して、そのオブジェクトに関する以下の重要な詳細を出力することができます。
- キーの名前
- 保存先のバケットの名前
- オブジェクトの最終更新日
- オブジェクトに関連付けられたすべてのメタデータ
オブジェクトの各種プロパティーとそのメタデータにアクセスするためのメソッドも提供されています。
リスト 8. オブジェクトのリスト
// list objects in a bucket.
S3Object[] objects = s3Service.listObjects(bucket);
// print out the object details
if (objects.length == 0) {
System.out.println("No objects found");
} else {
for (S3Object o : objects) {
System.out.println(o);
}
}
|
取得したオブジェクトのリストをフィルタリングするには、一致基準とするプレフィックスを指定します。
リスト 9. オブジェクト・リストのフィルタリング
// list objects matching a prefix.
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix”, null);
// print out the object details
if (filteredObjects.length == 0) {
System.out.println("No objects found");
} else {
for (S3Object o : filteredObjects) {
System.out.println(o);
}
}
|
それぞれのオブジェクトには、コンテンツ・タイプや更新日などのメタデータを関連付けることができます。さらに、アプリケーション固有のカスタム・メタデータをオブジェクトに関連付けることも可能です。
リスト 10. オブジェクトのメタデータの取得
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// getobjects matching a prefix
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix”, null);
if (filteredObjects.length == 0) {
System.out.println("No matching objects found");
}else {
// get the metadata for multiple objects.
S3Object[] objectsWithHeadDetails = s3ServiceMulti.getObjectsHeads(bucket,
filteredObjects);
// print out the metadata
for (S3Object o : objectsWithHeadDetails) {
System.out.println(o);
}
}
|
新しく作成されるオブジェクトはデフォルトで所有者のみがアクセスできる専用オブジェクトになりますが、JetS3t を使用して、オブジェクト・データをダウンロードするために誰でも使用できる署名付き URL を生成することができます。この URL は、特定の期間中にのみ有効になり、その期間が終了した時点で自動的に失効するように作成することもできます。この方法を使えば、オブジェクトを専用のままにしておきながらも、署名付き URL を提供して短期間、誰でもダウンロードできるようになります。
リスト 11. オブジェクトをダウンロードするための署名付き URL の生成
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// how long should this URL be valid?
int duration = Integer.parseInt(tokens.nextToken());
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, duration);
Date expiryDate = cal.getTime();
// create the signed url
String url = S3Service.createSignedGetUrl(bucketName, objectKey,
awsCredentials, expiryDate);
System.out.println("You can use this public URL to access this file for the next "
+ duration + " min - " + url);
|
S3 はバケット内の 1 つのオブジェクトにつき最大 5 GB までが許可されます。これよりも大きなオブジェクトの場合には、オブジェクトをそれぞれ 5 GB のファイルに分割した上で、そのすべてのファイルを S3 にアップロードすることになります。
リスト 12. S3 へのアップロード
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// create an object with the file data
File fileData = new File(“/my_file_to_upload”);
S3Object fileObject = new S3Object(bucket, fileData);
// put the data on S3
s3Service.putObject(bucket, fileObject);
System.out.println("Successfully uploaded object - " + fileObject);
|
JetS3t が提供する DownloadPackage クラスは、S3 オブジェクトのデータをローカル・ファイルに関連付け、そのファイルに自動的にデータが保存されるようにします。この機能を使用すれば、S3 から簡単にオブジェクトをダウンロードすることができます。
リスト 13. S3 からのダウンロード
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);
// get the object
S3Object fileObject = s3Service.getObject(bucket, fileName);
// associate a file with the object data
DownloadPackage[] downloadPackages = new DownloadPackage[1];
downloadPackages[0] = new DownloadPackage(fileObject,
new File(fileObject.getKey()));
// download objects to the associated files
s3ServiceMulti.downloadObjects(bucket, downloadPackages);
System.out.println("Successfully retrieved object to current directory");
|
このセクションでは、 JetS3t ツールキットが提供する基本的な関数をいくつか取り上げ、これらの関数を使用して S3 を操作する方法を説明しました。S3 サービスの詳細と、JetS3t ツールキットについての掘り下げた内容説明については、「参考文献」を参照してください。
S3 シェル
これまでに記載してきた小さなコード・スニペットによる S3 の操作は、コマンドラインから実行できる単純な S3 シェル・プログラムを作成することによって、一層使いやすく、長い間使える形のものにすることができます。そこで、Amazon Web サービスのアクセス・キーとシークレット・キーをパラメーターとして受け取り、コンソール・プロンプトを表示するという単純な Java プログラムを作成し、このコンソールから S3 を操作できるようにします。これにより、バケットの一覧を表示するには b、特定の文字で始まるオブジェクトの一覧を表示するには om を入力するなど、1 文字または何文字かを入力するだけで S3 を操作できるようになります。このプログラムを使って S3 をいろいろと操作してみてください。
このシェル・プログラムに含まれる main() は、この記事で使用しているコード・スニペットからなる実装が含まれています。スペースの都合により、S3 シェルのコード・リストはここには記載していませんが、完全な S3 シェルのソース・コードとその依存関係は「ダウンロード」セクションに含まれています。このシェルを実行するために必要な操作は、devworks-s3.jar ファイルを実行することだけです。
リスト 14. S3 シェルの実行
java -jar devworks-s3.jar my_aws_access_key my_aws_secret_key
|
S3 シェルでは、h を入力すれば、サポートしているコマンドの一覧を表示することができます。
図 2. S3 シェルのヘルプ
S3 シェルには上記の他にも便利なメソッドが追加されています。この S3 シェルを拡張してお望みの関数をさらに追加すれば、特定のケースに応じた一層便利なシェルにすることができます。
まとめ
この記事では、Amazon の S3 サービスを支える基本概念のいくつかを説明しました。S3 の操作には、オープンソースのライブラリーである JetS3t ツールキットを使用することができます。また、サンプル・コード・スニペットを使用して単純な S3 シェルを作成する方法についても説明したので、今後はコマンドラインを使って簡単かつ単純に S3 のさまざまな操作を続けられるはずです。
連載「Amazon Web サービスを利用したクラウド・コンピューティング」の第 3 回では、Amazon EC2 (Elastic Compute Cloud) を利用してクラウド内で仮想サーバーを実行する方法を説明します。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Sample code for this article | devworks-s3.zip | 2.93MB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
- JetS3t やその他のツールをダウンロードしてください。
- IBM 製品の評価版をダウンロードして、IBM® DB2、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を使ってみてください。
議論するために
著者について  | 
|  | Prabhakar Chaganti が CTO を務める Ylastic は、EC2、S3、SQS、SimpleDB を含めたユーザーの AWS クラウド・コンピューティング環境全体を設計、管理、モニターするための統一インターフェースを構築している新興企業です。彼は最近、『Xen Virtualization』および『GWT Java AJAX Programming』という 2 冊の本を書いています。VMware Global Virtual Appliance Challenge では、最も革新的な仮想アプライアンスに贈られるコミュニティー特別賞も受賞しています。 |
記事の評価
|