質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

1052閲覧

google cloud visionAPIを用いたrailsアプリをherokuにデプロイした時に発生するエラーについて

tokushun109

総合スコア12

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2020/03/03 02:20

ruby on rails初学者です。
質問内容に不備があれば申し訳ありません。

前提・実現したいこと

ruby on railsにおいてgoogle cloud visionAPIを用いて
テキスト抽出機能があるアプリを開発しています。
開発環境において動作することを確認しているのですが、
herokuを用いてデプロイした後、google cloud visionAPIを動作させようとすると
エラーが発生してしまいます。

発生している問題・エラーメッセージ

アプリ自体は動作していますが、
google cloud visionAPIを使用するアクションに画像情報を送ると

herokuのアプリのブラウザ上では

We're sorry, but something went wrong. If you are the application owner check the logs for more information.

herokuのログ上では

2020-03-02T10:40:46.281404+00:00 app[web.1]: F, [2020-03-02T10:40:46.281344 #4] FATAL -- : [5bb1eae8-f208-402a-ba7 8-312db7cd7a9f] RuntimeError (Could not load the default credentials. Browse to 2020-03-02T10:40:46.281405+00:00 app[web.1]: https://developers.google.com/accounts/docs/application-default-crede ntials 2020-03-02T10:40:46.281406+00:00 app[web.1]: for more information

と表示されます。

試したこと

・エラー内容から認証情報をロードすることができていない
・開発環境では動作し、本番環境では動作しない
・github上にはサービスアカウントの認証情報が載っている「.json」ファイルをプッシュしていないため、GOOGLE_APPLICATION_CREDENTIALSの環境変数がセットされていない

といった状況から、GOOGLE_APPLICATION_CREDENTIALSの値をherokuのアプリ上でもセットする必要があるのではと考え、以下を試しました。

1、herokuサイトのアプリのsetting→Config Vars上でGOOGLE_APPLICATION_CREDENTIALSの値に「.json」ファイルの中身をコピペ

2、ターミナル上から

heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< ***.json)"

を打ち込んで値をセット

上記二つを試しましたが、以前エラーが直らない状態です。
何卒ご教授をお願いいたします。

補足情報(FW/ツールのバージョンなど)

・ruby 2.5.3
・rails 5.2.2
・docker環境上でrailsを構築して開発
・画像はAWSのS3に保存
・S3に保存した画像のurlからgoogle cloud visionを動作させ、テキストを抽出

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

自己解決できました!

https://stackoverflow.com/questions/50159443/how-to-authenticate-google-vision-cloud-using-env-variable-in-ruby-on-rails
の記事を参考にして、

GOOGLE_APPLICATION_CREDENTIALSとは別に、
GOOGLE_API_CREDS(名前は記事を参考)に
サービスアカウントの認証情報が載っている「.json」ファイルの中身の値

{ "type": "service_account", "project_id": "your_app_name",    以下省略 }

を記述し、

image_annotator = Google::Cloud::Vision::ImageAnnotator.new(credentials: JSON.parse(ENV.fetch('GOOGLE_API_CREDS')))

で、認証情報を渡してあげることで無事認証を行うことができました。

助言いただいた方々も、本当にありがとうございました!

投稿2020/03/06 06:00

tokushun109

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

herokuくんがcredentialsを読めていないのではないでしょうか。
credentialsの内容を環境変数で代替するか、pushしたcredentialsに合致するmaster.keyをherokuに設定するかをすれば解決するかもしれません。
config/master.key は、デフォルトでgit ignoreされているので、Herokuで利用するためには下記設定が必要です。
heroku config:set RAILS_MASTER_KEY=master.keyの中身

また、devlopment.rbでしか設定していなかったりしないかも合わせて確認してください。(HerokuはRAILS_ENVがproductionなはずなので、production.rbが反映されます)

そもそもcredentials.ymlを使っていない場合は、蛇足な回答ですが、確認のほどよろしくお願いいたします。(EDITOR=vi rails credentials:editで編集できるファイルに認証情報が記載できる。)

投稿2020/03/06 02:29

編集2020/03/06 02:33
sansansandodo

総合スコア248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokushun109

2020/03/06 05:04 編集

返信ありがとうございます。 herokuでのデプロイの際はheroku config:setを使用して、 直接環境変数に認証情報を設定していたためにcredentials.ymlを使用しておりませんでした。 ご助言ありがとうございます。
guest

0

情報が少ないので、以下の手順でデバッグしてみてください。

1.heroku config:get GOOGLE_APPLICATION_CREDENTIALSコマンドで、正しく環境変数が設定されているか確認する。

2.認証に成功しているかどうか確認する。

認証の開始  |  Google Cloud
https://cloud.google.com/docs/authentication/getting-started?hl=ja#verifying_authentication

3.上記で問題なければ、ロガーを使ってエラー箇所を特定する。

追記(2020/3/6)

しかし認証情報が書かれている***.jsonをgithubにプッシュするわけにはいかないため、どのようにheroku上でファイルを指定してあげればいいのかがわかっていない状態です。。。

以下の認証方法を試してみてください。

2.環境変数が設定されていない場合、ADC では、サービスで実行されているアプリケーションに応じて、Compute Engine、Kubernetes Engine、Cloud Run、App Engine、または Cloud Functions によって提供されているデフォルトのサービス アカウントを使用します。

サーバー間での本番環境アプリケーションの認証の設定  |  Google Cloud
https://cloud.google.com/docs/authentication/production

※スタックオーバーフローに類似の質問がありましたので、参考にしてください。

google cloud platform - GOOGLE_APPLICATION_CREDENTIALS contents not file path - Stack Overflow
https://stackoverflow.com/questions/49318273/google-application-credentials-contents-not-file-path

もし上記で解決できないのであれば、外部ストレージから json を読み込むしかないかもしれませんね。

投稿2020/03/05 08:06

編集2020/03/06 02:24
nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokushun109

2020/03/05 12:48 編集

返信ありがとうございます。 heroku config:get GOOGLE_APPLICATION_CREDENTIALSを試してみましたが、サービスアカウントの認証情報が載っている「***.json」の中の値が設定されておりました。(値自体は正しかったです) https://cloud.google.com/docs/authentication/getting-started?hl=ja#verifying_authentication の環境変数の設定のところで、 export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json" と書かれており、ファイルのパスを示す必要があるところで認証情報の中身をそのまま設定していることがうまくいかない原因だと予想しております。 しかし認証情報が書かれている***.jsonをgithubにプッシュするわけにはいかないため、どのようにheroku上でファイルを指定してあげればいいのかがわかっていない状態です。。。
nskydiving

2020/03/06 02:25

回答欄に追記しました。
tokushun109

2020/03/06 04:50 編集

返信ありがとうございます。 https://cloud.google.com/docs/authentication/production 上記サイトの「アプリケーションが Compute Engine、Kubernetes Engine、App Engine、または Cloud Functions で実行されている限り、ADC では認証情報を暗黙的に検出できます。」 と記述があり、アプリケーションをCompute Engine、Kubernetes Engine、App Engine、または Cloud Functionsで実行していないため、この方法は現時点では使用できないと考えております。 アプリケーションの構成にS3を使用する予定なので、「外部ストレージから json を読み込む」と言う方法が使えればと考えております。 ただ調べても実施している例がみつからず、 また自分なりにS3に保存したjsonファイルのオブジェクトurlからダウンロードしてローカルディレクトリに保存し、そのパスを環境変数に設定する方法も考えたのですが、 結局「オブジェクトurl」をコードとして記載してしまうため、アクセスすればjsonの中身の記載が見えてしまうと言う事態に陥ってしまっております。 S3に保存したjsonファイルの中身を他者に見られることなく、ローカルディレクトリに保存する方法はあるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問