コンテナ環境におけるgoogleauth gemの認証方法

前回FCMを使ってプッシュ通知を送る際の認証について書きました。

今回はFCM HTTP v1 APIの認証用途で利用する googleauth gemに、どのようにして認証キーを渡すか迷ったのでメモとして残します。

takanamito.hateblo.jp

googleauth gemの認証

以下の2つの仕組みで認証が可能です。

コンテナ環境で生じる問題

仕事ではRailsアプリケーションを開発しており、AWSのFargateにデプロイしコンテナ環境で動作させています。
ここで問題になるのが「どう秘匿情報をコンテナに埋めるか」です。

一般的には環境変数をコンテナに注入する。という手法がよく使われると思いますが
googleauth gemでは4つも環境変数を使う必要があり設定がめんどくさい上に、間違った組み合わせで設定してしまうなどのリスクが生じます。

JSONファイルをそのまま埋め込む方がリスクがいくらか減らせそうです。
たとえばRailsのCredentialsの機能を使って暗号化をしてgit管理下に含めてしまう手段などがありますが、職場ではこの機能を使わない方針で開発をしているため採用できませんでした。

この問題を以下の手法で解決しました。

StringIOクラスを利用する

環境変数に埋め込んだJSON形式の文字列を、RubyStringIO クラスに読ませてgemに渡しました。

googleauth gemは以下のサンプルのように make_creds 関数にIOインターフェイスを持つインスタンスが渡されることを期待しています。

scope = 'https://www.googleapis.com/auth/firebase.messaging'

authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open('/path/to/service_account_json_key.json'),
  scope: scope)

authorizer.fetch_access_token!

以下のように利用します。

# export FCM_JSON_KEY='Firebaseコンソールからダウンロードした認証キーのJSON'
json_key = ENV['FCM_JSON_KEY']
scope = 'https://www.googleapis.com/auth/firebase.messaging'

authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: StringIO.new(json_key),
  scope: scope)

authorizer.fetch_access_token!

まとめ

StringIOクラスを利用することで認証に必要な環境変数を4つから1つに減らすことができました。これで設定ミスのリスクを減らせそうです。