RubyでGoogle Cloud Storageを使おう
こんにちは。
この記事ではRubyを使ってGoogle Cloud Storageにファイルをアップロード、参照、削除する方法を紹介したいと思います。
RailsではなくSinatraを使用していますが、基本的にはどちらでも大きく変わりません。
このプロジェクトの完成形はmizucoffee/gcs_sampleに、サンプルサイトはこちらにあります。
記事と合わせてご覧ください。
下準備
サービスアカウントを作る
まずは、Google Cloud Platformでサービスアカウントを作成していきましょう。
プロジェクトはすでにあるものを使用します。無い場合は作ってください。
Google Cloud Consoleの上の検索窓に認証
と入力し、「認証情報」を選びます。
開いたページにある「認証情報を作成」の中の「サービスアカウント」を選択します。
サービスアカウント名を入力します。任意のテキスト(プロジェクト名など)で大丈夫です。
入力出来たら「作成して続行」をクリックしましょう。
ロールを「Cloud Storage」の中にあるStorage オブジェクト管理者
にします。
本番環境で使用する場合は最低限の権限のものになるよう見直してください。
作成したサービスアカウントの編集マーク(鉛筆マーク)をクリックします。
詳細ページが表示されるので、キーをクリックします。
鍵ページが表示されたら、「鍵を追加」の中の「新しい鍵を作成」をクリックします。
キーのタイプはJSONのまま、「作成」ボタンをクリックします。
すると、JSONファイルがダウンロードされます。このファイルが認証に必要なファイルになるので大切に保管してください。
今回はプロジェクトルートに入れておきましょう(Gitで管理している場合は必ずgitignoreに追加しておいてください)。
バケットの準備
続いてバケット(Cloud Storageでの保存場所)の準備をしましょう。
上の検索窓にStorage
と入力して「Cloud Storage」を選択します。
ブラウザというページが表示されるので、「バケットを作成」をクリックします。
新しく作るバケットの名前を入力し、作成ボタンをクリックします。
バケット名は他のバケット名と重複しないようにする必要があるので、プロジェクト名+付けたい名前などにすると設定しやすいかと思います。
これでバケットの準備は完了です!
プロジェクトの準備
まずはライブラリをインストールしましょう。
Gemfileに以下を追記します。
gem 'google-cloud-storage'
Google Cloud Storageを使うにあたって必要な記述は以下の通りです。
require 'google/cloud/storage'
storage = Google::Cloud::Storage.new(
credentials: "./credentials.json"
)
bucket = storage.bucket "gcs-sample-posts"
1行目はライブラリの読み込み、3-5行目はStorageインスタンスの初期化です。credentialsで認証情報が入ったファイルを指定しています。先程DLしたJSONファイルを指定しましょう。
7行目はバケットを指定しています。先程作ったバケット名を入力しておきましょう。
使ってみよう!
実はファイルアップロードなどはかなり簡単に書くことが出来ます。
ファイルアップロード
以下のように書くと、プロジェクトフォルダにあるabdcef.pdf
をsample.pdf
という名前でアップロードすることが出来ます。
file = bucket.create_file './abdcef.pdf', 'sample.pdf'
ファイルのURLを取得
以下のように書くと、Cloud Storage上にあるsample.pdf
を取得し、署名の入った(=有効期限付き)URLを返してくれます。
file = bucket.file 'sample.pdf'
puts file.signed_url
ファイルのURLを取得
以下のように書くと、Cloud Storage上にあるsample.pdf
を削除をします。
file = bucket.file 'sample.pdf'
file.delete
サンプルサイト
上記のコードを組み合わせて簡単なファイル転送機能を作ってみました。
こちらから見れるので見てみてください。
コード的には以下のような感じです。詳細はリポジトリをご覧ください。
require 'bundler/setup'
Bundler.require
require 'sinatra/reloader' if development?
require './models'
require 'google/cloud/storage'
require 'securerandom'
storage = Google::Cloud::Storage.new(
credentials: "./credentials.json"
)
bucket = storage.bucket "gcs-sample-posts"
get '/' do
@posts = Post.all
erb :index
end
get '/file/:id' do
data = Post.find(params[:id])
file = bucket.file data.file
redirect file.signed_url
end
get '/file/delete/:id' do
data = Post.find(params[:id])
file = bucket.file data.file
file.delete
data.destroy
redirect '/'
end
post '/post' do
if params[:file]
img = params[:file]
tempfile = img[:tempfile]
file = bucket.create_file tempfile.path, SecureRandom.uuid + File.extname(tempfile.path)
Post.create(body: params[:body], file: file.name)
end
redirect '/'
end
Discussion
New Comments
No comments yet. Be the first one!