ローカル環境のRubyとAmazon S3でデータをやり取りする
昨日,UnityとS3を直接やり取りさせようとして失敗したので,とりあえずUnity→サーバ→S3で通信を行うことを前提に,撮影したスクリーンショットをサーバ上にアップして,そのURLをツイートする機能を実装しようと思う.
まずはローカル環境でS3と通信できるかどうか試してみて,サーバに書いたコードを移植する流れでやってみようと思う.
まずは自分がよく使ういつもの環境を整える.bundle initしてGemfileを作成し,Gemfileの中身を書いていく.今回は,aws-sdk, sinatra, slimの3つを使い,自動更新としてsinatra-contribを利用する.Gemfileは適当に書く.
SinatraはRubyのフレームワークの一つで,RailsのようにMVC全てが揃っているフレームワークとは異なり,ルーティングとWebサーバを立てるぐらいの機能しかない.SinatraのいいところはMVCを自由に組み合わせてアプリケーションを作成できるところで,Railsのように導入に細かい設定が必要ないところが大きな利点.
Slimはドメイン特化言語の一つで,特別な記号をそんなに使わずにマークアップを作成することができる.今回はSinatraとSlimの組み合わせでWebページをとりあえず表現する(動くの確認したらJSONに変更する).
とりあえず,rubyコマンド叩く前にルートディレクトリを整理する.最初に必要なライブラリをインストールしておく.その次にディレクトリの作成.基本的にmodelsやviewsはどのフレームワークでも共通したディレクトリなので,とりあえず作っておく.
gem install sinatra
gem install sinatra-contrib
gem install slim
gem install json
bundle init
mkdir views
mkdir models
touch views/index.slim
Sinatraはbundleコマンドで動かさず,rubyコマンドで動かす(bundleは何度やっても動かないため).凄い人はbundleで動かしてください.
S3を動かす方法については以下のリンクを参考にしてやってみた.
Ruby - aws-sdkを使って簡単S3操作 - Qiita [キータ]
ただ,AWS SDKは.NET版もそうだったけど,Ruby版も非常に簡潔で使いやすい.実際に使ったコードは4ステップぐらいでアップロードできるようになってしまった.
Credentialクラスは秘密鍵をしまっておくためのクラスなので適宜自作してください.
Ruby版AWS SDKも3種類で構成される.C#版とは異なり,AWSとの接続を行うクライアントと,バケット,オブジェクトの3つ.バケットの中にたくさんのオブジェクトがぶら下がっている構造になっている.
もし,バケットの中に存在しないファイルを呼び出した場合,とりあえず仮にオブジェクトが作られ,オブジェクトをwriteすると自動的にアップロードされる..NET版との違いは,Rubyっぽい書き方でS3を制御できるということ.これは非常にありがたい.
というわけで,ここまでできると画像のアップロードは非常に簡単で,適当にちょろちょろっとやってしまえば終わってしまいそう.記事がどうしても長くなりそうなので今日はこれぐらいにしておく.