Google Cloud Consoleを弄ってみる

Google関係のAPIであったり、またプログラムを作る上で避けて通れないのが、Cloud Console(旧Developer Console)です。これはGoogle Apps Scriptでも同様でプロジェクトを作る毎に自動的にCloud Consoleにもプロジェクトが作成されています。普段スクリプトだけを扱ってる人は気が付きませんが。。

さて、このCloud Consoleですが、Googleの各種APIへアクセスしたり、アクセストークンを取得する為の認証情報(OAuth2.0認証)を作ったり、また、サービスアカウントと呼ばれる特殊なアカウントを作成する等で利用します。Microsoft Azureみたいなものですね。Google Apps Scriptでも使う機会があります。今回はこのCloud Consoleを見てみたいと思います。

まずは準備しよう

プロジェクトの作成

Cloud Consoleの各種機能を利用するためにはまずは「プロジェクト」の作成が必要です。Cloud Consoleにログインしたら右上のGoogle Cloud Platformの▼をクリックして既存のプロジェクトを開くか?新たに➕記号をクリックしてプロジェクトを作成します。作成まで少々時間が掛かります。

無料アカウントの場合作成できるプロジェクトの数に制限(Google Apps Scriptはちょっと違うみたい)があるので、ホイホイと作らないように注意しましょう。また、APIの利用も上限(クォータ)が付いているので、大量にAPIを叩くと制限に掛かってしまいます。さらに、Cloud SQLのような有償のサービスなども用意されていますが、クレジットカード決済が必要です。

今回、mushroomというプロジェクトを作ってみました。この時、デフォルトでいくつかのAPIが既に有効になっていますが、取り敢えず不要なので、左サイドバーより「APIとサービス」⇒「ダッシュボード」を開き、APIを全部無効にしましょう。

図:まずはプロジェクトを作らないと

図:デフォルトでいくつかのAPIが有効になっちゃってる

スマフォアプリから管理

Google Workspaceの管理コンソールのように、Google Cloud Consleにもアプリがあります。Cloud Consoleアプリからは、課金状況、スタックドライバーログの確認、サービスの稼働状況、また、Cloud Shellが使えるなど、手軽にCloud Consoleを管理する機能が備わっています。

ウェブ版と違って、新たなサービス立ち上げや設定変更等は出来ません。

図:MySQLの稼働状況を確認中・・・

各種APIを利用する

APIを有効にする

Cloud ConsoleはGoogleの各種APIやウェブサービスを使う時に必要になるものですが、よく使うのは各種APIをプログラム(AndroidやNode.js等々)から利用するケースです。もちろん、Google Apps Scriptからも使えます(Google Apps ScriptにはないAPIもこれで使えるようになったりします)。

APIとサービスのダッシュボードより「APIとサービスの有効化」よりサービスを探して、有効化します。今回はファイルやフォルダをチョイスする「Google Picker API」を元に進めてみます。検索画面より「Picker」と入れると、Google Picker APIが見つかります。このAPIは引き続き認証情報を作成する必要があります。

図:Google Picker APIはよく利用します

認証情報を作る

引き続き認証情報を作る必要があるAPIがあります。今回のPicker APIも同様です。右上の「認証情報を作成」をクリックするか?左サイドバーの「認証情報」より作成開始します。ここで作成するのはAPIキーと呼ばれる単一のコードで、Google Maps APIなどでもよく使っていた1行の文字列です。

プロジェクトへの認証情報追加画面にて、必要な認証情報ボタンをクリックするとすぐにAPIキーが生成されます。これをAPI利用時に使いますので、取っておきます。他人に知られてはなりません。キーは再生成も可能です。

図:APIキーをゲットしたらAPIが利用できます。

OAuth認証を利用する

このプロジェクトの設定を使って外部のプログラムやサーバープログラムからAPIやサービスを利用する時に使う認証システムがOAuth2.0です。一部のAPIではAPIキーではなくOAuth2.0の認証を必要としています。この認証では、クライアントID、クライアントシークレットを得る事が出来ます。これを元に認証用URLからアクセストークンというものを得る事ができます。

ただし、OAuth認証を作る為には、承認済みの JavaScript 生成元や承認済みのリダイレクト URIが必要になります。Google Apps Scriptからの場合だと、承認済みJavaScript生成元は、https://script.google.comに、承認済みリダイレクトURIはhttps://script.google.com/macros/d/{PROJECT KEY}/usercallbackになります。Androidのようなアプリの場合、リダイレクトURIはhttp://localhostやurn:ietf:wg:oauth:2.0:oobなどが入ります。

作り方は以下の手順

  1. 左サイドバーの認証情報をクリックする
  2. 認証情報を作成ボタンより「OAuthクライアントID」を選択する
  3. Google Apps Scriptからならウェブアプリケーション、AndroidやCordovaならAndroidを選び進める。Androidの場合、更に追加でフィンガープリントやパッケージ名が必要になります
  4. 今回はウェブアプリケーションで進めます。
  5. 承認済みJavaScript生成元や承認済みのリダイレクトURIを入れます。Google Apps Script側から作った場合、デフォルトでリダイレクトURIがhttps://script.google.com/oauthcallbackで入っています。

この時生成される「クライアントID」と「クライアントシークレット」が重要な情報ですので控えておきましょう。

図:クライアント情報が得られます。

サービスアカウントを作る

Google Apps ScriptやOAuth2.0認証で見かける「承認して下さい画面」ですが、通常はアクセスしてきた人間が認証を行い、その元にプログラムが実行されるようになっています。その為そのアカウントは当然、ドライブやメール、カレンダーとGoogle Workspaceのあらゆるサービスを扱えるアカウントなわけです。

しかし、極特定のそのプログラムだけが扱う範囲だけで作成するアカウントがあります。それがサービスアカウント。許可したAPIやオブジェクトの作成だけが許可されてる特殊なアカウントで、これを使う事でユーザの認証なく各種APIなどを使えるようになります。この特殊なアカウントの作成もこのCloud Consoleにて行います。作り方は以下の通り。

  1. 事前にGCPの対象プロジェクトに対して利用するAPIを追加しておきましょう(今回の例であればGoogle Drive APIは有効にしておかないと使えません)
  2. APIとサービスの中にある「認証情報」を開き、「OAuth同意画面」を開きます。
  3. 自分のメアド等が表示されていて、ここに適当なサービス名、ホームページのURL、アイコンを入力します。認証時にこの情報が出てきます。
  4. 続いてトップ画面より今度は「IAMと管理」を開き、「サービスアカウント」を開きます。
  5. サービスアカウントを作成」をクリックします。
  6. 適当なアカウント名(英語)と役割などは適当にオーナーなどを選んでみました。
  7. すると、アカウント名@プロジェクト名.iam.gserviceaccount.comでアカウントが出来ます。
  8. 同時に一意のIDというものが生成されます。これがクライアントIDとなります。
  9. 新しい秘密鍵の提供をチェックして「JSON」や「P12」を選択。P12はAndroidや.NETアプリケーションなどで使います。Google Apps Scriptやウェブアプリケーションは前者で良いでしょう。JSONの場合、jsonファイルがダウンロードされます。
  10. Google Workspaceで使う場合は、管理コンソールからセキュリティ⇒アクセスとデータ管理を開き、APIの制御を開く。
  11. ドメイン全体の委任を管理をクリックする
  12. 新しく追加をクリックして、クライアントIDにサービスアカウントの一意のIDを入れます。
  13. クライアント名にAPIのスコープを入力(Driveならhttps://www.googleapis.com/auth/drive
  14. 最後に承認をクリックします。

これでサービスアカウントが作成できました。このサービスアカウントをプログラム内でアクセストークンを取得させる事が出来るようになります。特定のアカウントに依存せず、サービスアカウントで動かせるというのがポイントですね。但し危険性もあるので、使う場合には細心の注意を払う必要があります。

※尚、6.のアカウント、例えば特定のスプレッドシートやドライブの読み書きをさせる場合、そのスプレッドシートの共有権限にサービスアカウントに編集権限やコンテンツ管理者権限等を与えておく必要性があります。

図:特殊なアカウントであるサービスアカウント

図:ドメイン全体の委任

図:アクセス権限をつけてあげる

GCPのサービスアカウントでファイルを操作する時の注意点

Google Apps Scriptから使う場合

自動で作成される

Google Apps Scriptもファイル毎にプロジェクトが作成されています。スクリプトエディタから確認出来ます。

  1. スクリプトエディタのメニューより「リソース」⇒「Cloud Platformプロジェクト」を開きます。
  2. リンクをクリックすると該当のプロジェクトが開かれます。デフォルトでproject-id-xxxxxxといった形のプロジェクトです。

他の自分で作成したプロジェクトと異なりプロジェクト数が減ったりしません。

※2019年4月8日より、大幅変更され、GASからの作成はされなくなり、個別にCloud Consoleに作ってプロジェクトを紐づけする必要があります。自動で作成されなくなりました。

主に利用するAPI

Google Apps Scriptは自分自身が数多くのAPIをメソッドから標準で利用できるようになってるため、あまりCloud Consoleを使う機会は多くありません。しかし、DriveAppでは出来る事が限られていて、Drive APIだと出来るといったケースや、Picker APIのようなHTML Service側で使用するもの、Admin SDKのような管理用APIなどは用意されていないので、Cloud Consoleを利用する必要が出てきます。

使用する場合はスクリプトエディタより

  1. メニューから「リソース」⇒「Googleの拡張サービス」を開きます。
  2. 使用するGoogle APIのスイッチをオンにします。但しオンだけじゃ使えません。(Pickerは一覧にないのでここでオンは出来ません)。
  3. Google API コンソールのリンクをクリック。Cloud Consoleの画面になります。(後述のように事前にGCPに紐付けが必要)
  4. Drive APIなどの場合すでにAPIと認証情報が作成された状態で開きます。
  5. 追加のAPIがあればここで追加して作業を済ませておきます。
  6. Cloud Consoleを閉じて、Googleの拡張サービスのウィンドウを閉じます。これで反映されます。

図:GASにないAPIもたくさんあります

プロジェクトを移動

今回の発表直前の2019年4月8日より、Google Apps ScriptからCloud Platform Projectへ直接アクセスが出来なくなりました。これまでにデプロイしてるものについては、これまで通り「リソース」⇒「Google Cloud Platform API ダッシュボード」からアクセスが可能です。

今回の変更はスプレッドシート上で動かすスクリプトやGoogleの拡張サービスを利用しないタイプのスクリプトであれば特に問題はありませんが、「Apps Script API」や「Google Picker API」、「Cloud SQL接続」などGCP上のAPIを利用する場合には以下の手順を踏んで、Google Apps Scriptにプロジェクトを連結する必要があります。これまでは、自動的にGCP上にGoogle Apps Script用のプロジェクトが生成されていたのですが、今後は自分の組織(もしくはGCPプロジェクト)上で作成されたプロジェクトでなければならないということです。詳細はこちらのページを見てください。

連結する手順は以下の通り

  1. Google Cloud Consoleを開く
  2. 左上にある▼をクリックする
  3. ダイアログが出てくるので、新規プロジェクトを作るか?既存のプロジェクトを選択する。この時、Google Workspaceであれば選択元は「自分のドメイン」を選択する必要があります。
  4. プロジェクト情報パネルから「プロジェクト番号」をコピーする
  5. 対象のGoogle Apps Scriptのスクリプトエディタを開く
  6. 「リソース」⇒「Cloud Platform プロジェクト」を開く
  7. 4.で入手した番号をプロジェクトを変更のテキストボックスに入れて、プロジェクトを設定ボタンをクリックする
  8. 無事に移動が完了すればメッセージが表示されます。
  9. この時、元の自動作成されたプロジェクトはシャットダウンされて消えます。これで設定完了です。

今回のこの変更だと1つ作ったプロジェクトに集約する必要があるので、例えばPicker APIのようなものを使った場合、1日に使えるクォータに制限がありましたが、プロジェクト毎のカウントだったので問題なかったものが、集約されることで、クォータに引っ掛かる可能性があります。

図:プロジェクト番号をコピーしておきます

図:プロジェクトを他のプロジェクトに紐付けしました。

図:GCPの拡張サービスを使うには手順が必要になった

プロジェクト移動後にエラー発生

プロジェクト移動後にDriveAppのクラスを使った処理を実行してみたら、「Exception: We're sorry, a server error occurred. Please wait a bit and try again.」という謎のエラーが出ることがあります。これ、新しく作成したGCP側のプロジェクトに於いて「Drive API」が有効化されていないことが原因。なので、以下の手順で有効化します。

  1. 移動させたGCP側のプロジェクトのページを開く
  2. サイドバーからAPIとサービスを開き、APIとサービスの有効化をクリック
  3. 検索窓からdriveで検索し、Google Drive APIが見つかるのでクリック
  4. 有効にするをクリックする

これで再度関数を実行するとエラーは解消されているはず。

図:おかしなエラーの原因はGCP側

プロジェクトを削除してしまうと・・・

ちなみに、このGoogle Apps Scriptに紐付けされてるプロジェクトですが、削除(シャットダウン)してしまうと厄介な事になります。Cloud Consoleのプロジェクトとの紐付けがなくなっただけで、動かなくなります。試しにシャットダウンするとどうなるか?やってみました。

このスクリプトのOAuth IDは削除されたか、無効になっています。利用規約違反が原因である可能性があります。

上記のようなエラーメッセージが出て、単純なコードであっても承認が出来なくなり動かなくなります。Cloud Consoleに紐付けのプロジェクトがないとGoogle Apps Scriptはダメなんですね。

GoogleのAPIが使えなくなるのは当然です。またプロジェクトが消滅するので過去の承認情報や設定関係も全て消滅します。またそれだけにとどまらず、Google Apps Script自体の承認もできなくなり、何もコードを動かせなくなります。スプレッドシートならコピーすれば解消されますが、当然ゼロから全く別のプロジェクトが作られています。また、別のプロジェクトに移動させないと、このシートは使い物にならなくなります。

※あたりまえですが、ファイルのオーナーを変えたりすると全てリセットされますのでご注意を。

図:なにやら難しいエラーが出て、実行自体できなくなります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)