Open3
Google Apps Script + Cloud Functionsメモ
GASからservice account経由でCloud Functions呼び出し
[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);
};
参考URL
GASからGoogle Driveへアクセス
SAによる認証情報作成
下記のようにあったので最初は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