Python+tweepy+web.py+Azureストレージで作るTwitter連携アプリケーション

 Webアプリケーション開発で考慮すべきことの1つに「データをどこにどのように保存するか」という点がある。最近ではストレージにMongoDBなどの非SQL型データベースや、Amazon Web ServicesのS3、GoogleのBigtable、MicrosoftのWindows Azureストレージといったオンラインベースのストレージサービスを採用する例も多い。本記事ではこのなかでもWindows Azureストレージに注目し、PHPやPythonといった言語からAzureストレージを利用する方法や、Twitterと連携するサンプルアプリケーションなどを紹介する。

 Webアプリケーションを開発・運用する場合、そのデータはMySQLなどのSQLデータベースに保存するのが一般的であった。しかし、最近ではMySQLだけでなく、MongoDBやApache Cassandraといった非SQL(NoSQL)型のデータベースや、Amazon Web ServicesのS3、GoogleのBigtableといったオンラインベースのストレージサービスを採用する例も多い。これらが採用される理由の1つには、スケーラビリティおよび冗長性の問題がある。

SQLデータベースで高いスループットや冗長性を実現させるには分散/クラスタ構成などを取る必要があるが、これには事前の綿密な設計や運用ノウハウが必要となり、コストも低くない。いっぽうNoSQL型データベースは高いスケーラビリティや冗長性を容易に実現できるものの、管理・運用に独自のノウハウが必要というデメリットがある。そこで注目したいのがオンラインベースのストレージサービスだ。これらはサービスを提供する事業者側で運用が行われており、ユーザーはサーバーハードウェアおよびデータベースシステムの管理や運用を行うことなしにストレージを利用できる。スケーラビリティや冗長性も高く、また利用した分だけのコストでストレージを利用できる、というのも人気の理由である。

 オンラインベースのストレージサービスについてはいくつかあるが、今回はMicrosoftが提供するWindows Azureストレージを紹介する。Windows Azureストレージは「Windows」と冠されていることから「Windows環境からしか利用できない」と思われがちではあるが、実際は非Windows環境からも利用でき、PHPやJavaScriptなどのスクリプト言語向けのラッパーライブラリも用意されている。

 本連載ではMicrosoftのクラウドサービスであるWindows Azureの使い方について紹介してきたが、第3回となる今回はこのWindows Azureストレージについて紹介する。Windows Azureストレージではファイルを保存できる「Blob」やKey-Valueストア型ストレージである「Table」、サービス間での通信用FIFO「Queue」というストレージが用意されている。今回はこれらの解説を行うとともに、Blobを用いたサンプルアプリケーションとして「Blobストレージにファイルをアップロードするアップローダ」や、「Twitter上の情報を自動収集して表示するアプリケーション」を紹介する(図1)。

図1 今回作成したTwitterからの画像収集Webアプリケーション「Image Aggrigator」
図1 今回作成したTwitterからの画像収集Webアプリケーション「Image Aggrigator」

 なお、Windows AzureストレージについてのドキュメントはMSDNの「Windows Azure のデータの格納とアクセス」項目にまとめられている。本記事では必要最低限の情報のみ解説するので、各サービスの概要やAPIなどより詳しい情報が必要な場合はこちらを参照してほしい。

Windows Azureストレージのアーキテクチャ

 BlobおよびTable、QueueといったWindows Azureストレージは、Microsoftが管理しているクラスタ環境内で実行されている。ストレージに対する読み出しや書き込みといった操作は「<アカウント名>.<サービス名>.core.windows.net」というホストに対しHTTPもしくはHTTPSでアクセスすることで行う(表1)。

表1 Windows Azureストレージのアクセス先ホスト
ストレージ種類 URL
Blob <アカウント名>.blob.core.windows.net
Table <アカウント名>.table.core.windows.net
Queue <アカウント名>.queue.core.windows.net

 Windows AzureストレージではXML形式でデータをやりとりするREST APIが用意されており、XML形式で各種リクエストを行い、XML形式でその結果を受け取る、というのが基本的な使い方となる。また、認証には各アカウントに対して発行される「アクセスキー」を使用する。アクセスキーを直接HTTP/HTTPSでやりとりするのではなく、アクセスキーを元にセッションごとに異なる「認証トークン」を作成し、それをHTTP/HTTPSでやりとりすることでネットワークトラフィックの傍受などによるアクセスキー漏洩を防ぐ仕組みとなっている。

 Windows AzureストレージはWindows Azureの一部ではあるが、Windows Azure外からでも利用できる。アプリケーションの運用は自前のサーバーで行い、データの保存にのみWindows Azureストレージを利用する、といった使い方も可能だ。

Windows Azureストレージを利用するための「ストレージアカウント」

 Windows Azureストレージを利用するにはWindows Azureのアカウントに加え、あらかじめ「ストレージアカウント」を作成しておく必要がある。ストレージアカウントは、Windows Azureの管理ポータルから作成できるほか、Visual Web Developerでのデプロイ設定画面からも作成できる(図2)。

図2 ストレージアカウントはWindows Azureの管理ポータルから作成できる
図2 ストレージアカウントはWindows Azureの管理ポータルから作成できる

 また、認証に使用するアクセスキーは管理ポータルで取得できる(図3)。ストレージにはアカウント名とアクセスキーの情報があればアクセスできてしまうので、アクセスキーの情報は厳重に管理してほしい。万が一アクセスキーが漏洩した場合などは「アクセスキーの再生成」でアクセスキーを再生成できる。

図3 アクセスキーは管理ポータルから確認できる
図3 アクセスキーは管理ポータルから確認できる

各種言語からWindows Azureストレージを利用するためのライブラリ

 Windows AzureへのアクセスはRESTを使っているため、HTTPライブラリやRESTライブラリを持つ言語であればどのような言語からも利用できる。ただし認証トークンの作成はやや複雑であるため、ラッパーライブラリの利用をおすすめする。

 C#の場合、Windows Azure SDK for .NETで用意されているライブラリ中「Microsoft.WindowsAzure.StorageClient」名前空間内にWindows Azureストレージへのアクセスに向けたクラスが用意されている。

 また、PHP向けにはWindows Azure SDK for PHP(PHPAzure)というパッケージが公開されている。Windows Azureストレージにアクセスするためのライブラリだけでなく、C#向けに提供されているWindows Azure向けライブラリとほぼ同等のものが含まれており、Windows Azureの全機能に容易にアクセスできる。

 それ以外の言語については、Perl向けの「waz-storage-perl」やPython向けのラッパーライブラリ「winazurestorage」、Ruby向けの「waz-storage」などが有志によって開発されている。そのほか、JavaやJavaScript、Erlang、Objective-Cといった言語向けのライブラリもあるようだ。これらの情報はMicrosoftの元エヴァンジェリストSteve Marx(smarx)氏によってまとめられている(「Windows Azure Storage Libraries in Many Languages」)。ただし、これらはMicrosoftが公式にリリースしているものではなく、一部機能が欠けている場合もあるので、利用の際は事前に必要な機能が利用できるかチェックしておいたほうが良いだろう。

MSDNの価格