Open3

Google Apps Script + Cloud Functionsメモ

shin_t_o_shin_t_o_

GASからservice account経由でCloud Functions呼び出し

shin_t_o_shin_t_o_

[GCP] IAM サービスアカウント(SA)の作成

  • Cloud Run Invoker
  • Service Account OpenID Connect Identity Token Creator
    の権限を持ったSAの作成 + JSON出力

[GAS] SA情報の読み込み

  • 環境変数(スクリプトプロパティ)へのセット
  • Google Driveアップロード + 共有制限付与 + GASでアクセス
    など

[GAS] IAM APIに対しid token取得のためのデータフェッチ

const getIdToken = () => {
  // 何かしらの手法でservice account データを取得
  const saData = GET_SERVICE_ACCOUNT_FUNCTION();

  const options = {
    'method' : 'post',
    'headers': {
      "Authorization":"Bearer "+ GET_ACCESS_TOKEN_FUNCTION(saData)
    },
    'contentType': 'application/json',
    'payload': JSON.stringify({
      "includeEmail":true,
      "audience": CLOUD_FUNCTIONS_URL
    })
  }
  const raw_res = UrlFetchApp.fetch(`https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${saData.client_email}:generateIdToken`, options);
  const res = JSON.parse(raw_res.getContentText());
  return res.token;
}

[GAS] id tokenをセットしたGCFへのデータフェッチ

const callCloudFunctions = () => {
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      // 取得したid tokenを利用
      'Authorization': `Bearer ${getIdToken()}`
    },
    'payload': SOME_PAYLOAD,
  };

  const response = UrlFetchApp.fetch(CLOUD_FUNCTIONS_URL, options);
};
shin_t_o_shin_t_o_

参考URL

GASからGoogle Driveへアクセス

https://zenn.dev/gas/articles/f4d771112449ec

SAによる認証情報作成

https://cloud.google.com/iam/docs/create-short-lived-credentials-direct?hl=ja#sa-credentials-oidc

下記のようにあったので最初はSAをPRIV_SA, CALLER_SAに分けていたが、単体でも動作を確認。セキュリティ上分けることを推奨している、という話なのか今回のケースではたまたま単体SAで良かったという話なのか。

なお OpenID Connect ID トークンの生成 にある下記エンドポイントについてはIAM APIを参照。

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateIdToken