LoginSignup
1
2

More than 5 years have passed since last update.

RubyでAzure BLOB Storageにファイルをアップロードする

Posted at

GYAOの窓際エンジニア 玉利です。

tsさん主導で、汎用データ解析PFを作っているのですが、Azure BLOB storageを使うことになりました。

それはそうと、今日も飯ネタです。おやすみ頂いて、夕方まで勉強会。5時過ぎに遅い昼ごはんを中華街でいただきました。

スクリーンショット_2016_11_18_17_31.png

今日いったのは、海員閣。昔、美味しんぼでサービス悪い店としてネタにされてましたが、雁屋哲さんがオーバーな人なので、私に言わせれば中国だったらかなり上のサービスです。いまだにコークスの窯で調理してるのはここくらいでしょう。横浜の海の男達の胃袋を支えてきた店ですので、盛りがいいです。味も昔ながらのもので、癒やされました。

さて、RailsからAzure Storageにデータを放り込む仕事をベトナムにお願いするわけですが、先にある程度いじっておきましょう。APIの使い方はgithubのレポジトリ に書いてあるのですが、私も初めてなので勉強です。

BLOBって何?

私も初耳でした(素人ですみません)要は、大きいデータをどかんと置くときはコレがいいようです。例えば動画ファイルとか、パッケージファイル的なものとかです。

WikiのBLOB説明

概念は、MSの説明がわかりやすいです。
説明!

ほかにも、Queue StorageやTable Storageなどがあり、特にTable StorageはNoSQLに放り込むためのjsonの構造化ができたりして。。。すごく面白いです。

Azure consoleの設定

Azureの画面から、新規のストレージアカウントを作成します。

Storage_-_Microsoft_Azure.png

名前をいれて、あとは大体そのままで大丈夫です。リージョンは東日本を選びました。

ストレージ_アカウントの作成_-_Microsoft_Azure.png

作成を押すと、少しまちます。アカウントができたら、アクセスキーを取得しましょう。

gyao2zeolite_-_Microsoft_Azure.png

ストレージアカウントとアクセスキーができました。ここまでいければ、あとはRails側の話になります。

アクセス_キー_-_Microsoft_Azure.png

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の遅い回線)

あとはコマンドで確認できるのですが、それよりも画面で見たほうが良いでしょう。

test-container_-_Microsoft_Azure.png

# 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に送るだけなので問題はないのですが、別の使い方だとおそらく速度が遅いので、非同期で動かすとかしないとユーザー側が困る感じですね。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2