問題
人気のソーシャルアプリケーション、科学アプリケーション、およびメディアコンテンツを生成するアプリケーションは、短時間で大量の情報を生成できます。 次に例を示します。
- 72時間分のビデオが毎分ユーザーによってYouTubeにアップロードされます。 ( ソース )
- 毎日2,000万枚の写真がSnapchatにアップロードされています。 ( ソース )
- Pinterestは、2009年の開始以来、80億のサイトと410テラバイトのデータを保存しています。
- Twitterは1日に約12テラバイトのデータを生成します。 ( ソース )
ユーザーが生成した大量のコンテンツをアプリケーションが保存し始めると、チームはこの問題を解決するためにどこに時間を投資するかを決定する必要があります。 ハードウェア/インフラストラクチャにアセットを配置するような方法でアプリケーションを構築する場合、チームはアセットを効率的に保存および管理するために多くの時間とお金を費やします。 または、クラウドストレージプロバイダーでアセットを保存できます。 このパスを選択することにより、アプリケーションコンテンツをほぼ無限にスケーリングし、このコンテンツを送信するために使用されたスペースとリソースのみを支払うことができます。 その結果、クラウドベースのデータストレージは、エンジニアの手を解き放ち、スケーラビリティが問題になる場合に自転車を発明するのではなく、独自のアプリケーションの作成に集中することができます。
クラウドストレージをアプリケーションに使用することをいつ考えますか?
- ユーザーが生成したコンテンツがアプリケーションの一部である場合。 アプリケーションでは、ユーザーがファイルをアップロードできますか? アプリケーションはサーバー側でファイルを生成しますか? アプリケーションがファイルを受け入れるか、生成されたコンテンツがファイルシステムに保存される場合、遅かれ早かれクラウドデータストレージについて考える必要があります。
- アプリケーションが同じサーバー上でon屈な場合 。 アプリケーションが単一のサーバーまたはWebホストで実行できるほどコンパクトで、変更を期待しない場合、クラウドにアセットを保存することは意味がありません。 ストレージをローカルファイルシステムに設定し、それを忘れることができます。 2番目のアプリケーションサーバーが必要であることに気付いた場合は、クラウドベースのアセットストレージのメリットと喜びをすぐに享受できます。 新しいサーバーに資産ファイルシステムを複製することなく、無制限の数のアプリケーションサーバーに水平にサービスを拡張できます。 アセットは中央に保存されるため、アプリケーションを実行するサーバーの数に関係なく、どこからでもアクセスできます。
- チームがスケーラブルなファイルシステムを開発するのではなく、ビジネスにとって重要なプログラムの機能の開発に集中することがより重要な場合。 お金も時間もほとんどなく、アプリケーションの成長を予測している場合、クラウドストレージは双方にとって好都合なオプションになります。 これにより、アプリケーションを迅速にデプロイし、必要に応じてスケーリングすることができます。
統合とアクセス
ほとんどの主要なクラウドストレージサービスは、APIを介したアクセスを提供するため、開発者はクラウドベースのアセットストレージをアプリケーションに統合できます。 以下に、SDKまたはライブラリを使用してAmazon S3にアセットを保存するいくつかのコード例を見てみましょう。
RubyとCarrierwave
CarrierWaveリポジトリから適合したサンプルコード。
- CarrierWaveのインストール: gem install carrierwaveまたはgemfile gem 'carrierwave'に インストールします。
- Fogのインストール: gem install fogまたはgemfile gem "fog"、 "〜> 1.3.1"
- 初期化ファイルに次を追加します。
CarrierWave.configure do |config| config.fog_credentials = { :provider => 'AWS', # required :aws_access_key_id => 'xxx', # required :aws_secret_access_key => 'yyy', # required :region => 'eu-west-1' # optional, defaults to 'us-east-1' } config.fog_directory = '_' config.fog_public = false config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} config.asset_host = 'https://assets.example.com' end
- アップローダークラスを作成します。
class AvatarUploader < CarrierWave::Uploader::Base storage :fog end
- アップローダーを直接使用する:
uploader = AvatarUploader.new uploader.store!(my_file) uploader.retrieve_from_store!('my_file.png')
- ActiveRecordでアップローダーを使用する:
データベーステーブルにフィールドを追加し、CarrierWaveを要求します。
add_column :users, :avatar, :string in a database migration file require 'carrierwave/orm/activerecord' in your model file.
- アップローダーをモデルに接続します。
class User < ActiveRecord::Base mount_uploader :avatar, AvatarUploader end
- モデルとファイルの操作:
u = User.new u.avatar = params[:file] u.avatar = File.open('somewhere') u.save! u.avatar.url # => '/url/to/file.png' u.avatar.current_path # => 'path/to/file.png' u.avatar.identifier # => 'file.png'
CarrierWaveを使用してAmazon S3、 Rackspace Cloud Files、 Google Storageにアップロードする例と、 DataMapper 、 Mongoid、 SequelなどのいくつかのORMジャムを次に示します。
PHPおよびAWS SDK
Amazonは、AWS APIとサービスを操作するためのPHP SDKを提供します。 この例では、READMEリポジトリのSDKからの指示を使用します。
- config-sample.inc.phpの内容をコピーし、ファイルに示されているように権限を追加します。
- ファイルを〜/ .aws / sdk / config.inc.phpに移動します。
- getenv( 'HOME')はユーザーフォルダーを指す必要があることに注意してください。 それ以外の場合は、このputenvを指定する必要があります( 'HOME = <your-user-folder>')
// AmazonS3 $s3 = new AmazonS3(); // s3 bucket $bucket = '--BUCKET' . strtolower($s3->key); if (!$s3->if_bucket_exists($bucket)) { $response = $s3->create_bucket($bucket,AmazonS3::REGION_US_E1); if (!$response->isOK()) die('Could not create `' . $bucket . '`.'); } // . $response = $s3->get_object('aws-sdk-for-php', 'some/path-to-file.ext',array( 'fileDownload' => './local/path-to-file.ext' )); // . $response = $s3->create_object($bucket, 'some/path-to-file.ext', array( 'fileUpload' => './local/path-to-file.ext' ));
ノードとノックス
Node.jsについては、Github上のKnox Amazon S3クライアントからのサンプルコードを適合させました。
// var client = knox.createClient({ key: '<api-key-here>' , secret: '<secret-here>' , bucket: 'BUCKET-NAME' }); // S3 client.putFile('some/path-to-file.ext', 'bucket/file-name.ext', function(err, res){ // Logic }); // S3 client.get('/some/path-to-file.ext').on('response', function(res){ console.log(res.statusCode); console.log(res.headers); res.setEncoding('utf8'); res.on('data', function(chunk){ console.log(chunk); }); }).end(); // S3 client.del('/some/path-to-file.ext').on('response', function(res){ console.log(res.statusCode); console.log(res.headers); }).end();
おわりに
ご覧のとおり、AWS S3 APIの操作は非常に簡単で、ほとんどの言語で利用可能なライブラリがたくさんあります。 将来のプロジェクトを設計するときは、クラウドストレージを確認することをお勧めします。 新しい資産配分ソリューションを発明しないことで時間を節約でき、クラウドストレージを拡張するほぼ無制限の機能が与えられます。