GYAOの窓際エンジニア 玉利です。
tsさん主導で、汎用データ解析PFを作っているのですが、Azure BLOB storageを使うことになりました。
それはそうと、今日も飯ネタです。おやすみ頂いて、夕方まで勉強会。5時過ぎに遅い昼ごはんを中華街でいただきました。
今日いったのは、海員閣。昔、美味しんぼでサービス悪い店としてネタにされてましたが、雁屋哲さんがオーバーな人なので、私に言わせれば中国だったらかなり上のサービスです。いまだにコークスの窯で調理してるのはここくらいでしょう。横浜の海の男達の胃袋を支えてきた店ですので、盛りがいいです。味も昔ながらのもので、癒やされました。
さて、RailsからAzure Storageにデータを放り込む仕事をベトナムにお願いするわけですが、先にある程度いじっておきましょう。APIの使い方はgithubのレポジトリ に書いてあるのですが、私も初めてなので勉強です。
BLOBって何?
私も初耳でした(素人ですみません)要は、大きいデータをどかんと置くときはコレがいいようです。例えば動画ファイルとか、パッケージファイル的なものとかです。
概念は、MSの説明がわかりやすいです。
!
ほかにも、Queue StorageやTable Storageなどがあり、特にTable StorageはNoSQLに放り込むためのjsonの構造化ができたりして。。。すごく面白いです。
Azure consoleの設定
Azureの画面から、新規のストレージアカウントを作成します。
名前をいれて、あとは大体そのままで大丈夫です。リージョンは東日本を選びました。
作成を押すと、少しまちます。アカウントができたら、アクセスキーを取得しましょう。
ストレージアカウントとアクセスキーができました。ここまでいければ、あとはRails側の話になります。
Rails側の設定
今回、試しなので新規のRails PJを作成しました。
一行、gemの設定を入れます。
Gemfile
gem 'azure-storage'
bundle installすれば、すぐに使えるようになります。実際に使うときは、config/environment系に入れ、キーは環境変数で渡すことになりますが、今回はお試しなのでコマンドラインでべた書きします。
コマンドラインのスニペットです。
MyMac:AzureStorage btamari$ rails c
Loading development environment (Rails 5.0.0.1)
irb(main):001:0> require "azure/storage"
=> false
# client というオブジェクトを先程のキーで生成
irb(main):002:0> client = Azure::Storage::Client.create(:storage_account_name => "btamari-test", :storage_access_key => "さっきのAPIキー")
=> #<Azure::Storage::Client:0x007ff94ba3cf18 @ca_file=nil, @options={:storage_account_name=>"btamari", :storage_access_key=>"さっきのAPIキー", :default_endpoints_protocol=>"https", :storage_dns_suffix=>"core.windows.net", :storage_blob_host=>"https://btamari.blob.core.windows.net", :storage_table_host=>"https://btamari.table.core.windows.net", :storage_queue_host=>"https://btamari.queue.core.windows.net", :storage_file_host=>"https://btamari.file.core.windows.net", :use_path_style_uri=>false}, @storage_access_key="さっきのキー", @storage_account_name="btamari", @storage_connection_string=nil, @storage_sas_token=nil, @storage_table_host="https://btamari.table.core.windows.net", @storage_blob_host="https://btamari.blob.core.windows.net", @storage_queue_host="https://btamari.queue.core.windows.net", @agents=nil>
ずらずらずらっと出てきました。これで準備完了です。ローカルにproduct_groups_1117-0225.jsonというファイルを置きました。
# blobsという名のclientオブジェクトを作成
blobs = client.blob_client
# コンテナの作成。コンテナ名はここで決まります。存在しなければ、新規で作成されます。
container = blobs.create_container("test-container")
# ファイルのアップロード
content = File.open('product_groups_1117-0225.json', 'rb') { |file| file.read }
blobs.create_block_blob(container.name, "product_groups_1117-0225.json", content)
テストでは4.5Mbほどのファイルをアップロードしたのですが、体感で20秒くらい時間がかかりました(自宅のCATVの遅い回線)
あとはコマンドで確認できるのですが、それよりも画面で見たほうが良いでしょう。
# List containers
blobs.list_containers()
# List Blobs
blobs.list_blobs(container.name)
# Download a Blob
blob, content = blobs.get_blob(container.name, "image-blob")
File.open("download.png", "wb") {|f| f.write(content)}
# Delete a Blob
blobs.delete_blob(container.name, "image-blob")
一応、これで基本的な書き込みはできることがわかりました。今回の開発では、バッチでjsonデータをETLに送るだけなので問題はないのですが、別の使い方だとおそらく速度が遅いので、非同期で動かすとかしないとユーザー側が困る感じですね。