herokuでGoogle Cloud のサービスアカウントキーを設定する


はじめに

Ruby on Railsでポートフォリオを作成しているRails初学者です。以前、以下の記事でGoogle Cloud Vision APIを使った簡単な画像解析を実装しました。

Railsで画像プレビュー時にGoogle Cloud Vision APIに連携し、データラベルを取得する

しかし、heroku本番環境でうまく起動しない・・・(+ +)
おそらく認証周りがうまくいってないようだなぁというのはわかったのですが、直すのに案外時間がかかってしまったので、覚書として残しておきます。

原因

herokuに各種プログラムファイルを投入する際、gitを使用しています。

terminal
git push heroku master

つまりは、githubと同じ情報をheroku側にpushしています。
githubにキー情報をもつファイルなどは上げないように設定をしているので(.gitignore)、結果的にherokuにもキー情報をもつファイルはアップロードされません。
結果、Google cloud vision APIで接続の際に必要な、サービスアカウントキーを持つjsonファイルもheroku側には投入されていませんでした。

今回はこの、情報をうまく渡すための方法について見ていきます。

解決策

今回行うのは、環境変数としてherokuに渡しておき、そこから呼び出すという作業です。
ファイル自体をherokuのコンテナ上に置くのではなく、必要なキー情報を変数に設定します。

herokuの設定

1.herokuにアクセス
まずは、herokuの画面にアクセスし、設定するアプリを選択します。

2.Settingsにアクセス
画面内のタブ、Settingsをクリック

3.Reveal Config Varsをクリック
Settings内にある、Reveal Config Varsのボタンをクリック

4.環境変数を設定
3.のボタンを押すと、設定済みの環境変数が出てくるので、そこに新たに
GOOGLE_CREDENTIALS(任意の文字列でOK)と、サービスアカウントキーファイル内の全てをコピペし登録します。

5.herokuを再起動
環境変数を設定した後、heroku restartで再起動してください

controllerの設定

controllerもこれに合わせて設定していきます。

XXXX_controller.rb
:
    #Vision APIの設定
    if Rails.env.production?
      config.credentials = JSON.parse(ENV.fetch('GOOGLE_CREDENTIALS'))
    else
      config.credentials = ENV["GOOGLE_APPLICATION_CREDENTIALS"]
    end
:

今回は本番環境の場合、herokuに設定した環境変数を取得し、
JSONファイルとしてconfigに設定するように変更しました。

以上で、herokuでもGoogle Cloud Vision APIが使えるようになりました!

終わりに

簡単な設定にもかかわらず時間がかかってしまいました・・・
herokuのログをキチンと確認すること、またログの情報が不十分であれば、
以下の設定をし、詳細情報を確認してみるとわかるかと思います。
https://qiita.com/YujiNaito/items/3102ad59124d38433b2e

また、この環境変数から強引にやるが正解なのかどうかは不安です・・
セキュリティ的にOKなのかな?もっといい方法はありそうですね・・・
これよりもいい方法があるよ!などありましたら、ぜひコメントいただけますと幸いです。