エンジニアリングTips

【GAS×GCP】アクセストークンの取得

概要

GASからGCPのAPIを実行にあたり、アクセストークンが必要なる場合があります。
今回はアクセストークンの取得からGCPに登録しているユーザー一覧を取得するところまでをハンズオンしていきたいと思います。

アカウント登録

まずはGCPのアカウント作成およびプロジェクトを作成しましょう!
アカウント作成については以下記事が参考になるかと思います。

プロジェクト作成までできたら、次はサービスアカウントの作成に移っていきましょう!

サービスアカウントの作成

GCPのアクセストークン取得に必要なサービスアカウントを作成していきましょう!
GCPの画面にて、メニューから「IAMと管理」→サービスアカウントを選択してください。

画面上側にある「サービスアカウントの作成」を押しましょう

まずは任意のサービスアカウント名を入力します。今回はユーザー名をaccountにしました。
サービスアカウントIDとサービスアカウントの説明の箇所も任意でOKです!入力が終わったら「作成して続行」ボタンを押しましょう!

次にサービスアカウントのロールを基本→オーナーに設定します!設定後、画面下の「完了」ボタンを押しましょう!

これで新たにサービスアカウントが作成できました!メール列に表示されているサービスアカウントのメールアドレスは以降で使うのでメモしておきましょう!
そのままメールアドレスのリンク先に遷移しましょう!

アカウントの詳細画面に飛んだら「キー」タブに遷移し、「鍵を追加」→「新しい鍵を作成」を押しましょう!

秘密鍵の作成ではJSON形式で出力します!

出力されたJSONファイルを開き、private_keyの値を確認しておきましょう!(後ほど使います)

あとは今回使うAPIとして、Cloud Resource Manager APIを有効にしておきましょう!
検索窓に「Cloud Resource Manager API」を入力し、選択します。

以下画面に遷移したらCloud Resource Manager APIを有効にします。

これで事前準備は完了しました。実際にコーディングに移っていきます!

コーディング

以下、GASに対してアクセストークンを取得するコードになります。(アクアセストークンの期限は30分で設定)

function getAccessToken() {
  const options = {
    "method": "POST",
    "payload": {
      "grant_type": 'urn:ietf:params:oauth:grant-type:jwt-bearer',
      "assertion": getAssertion()
    },
    'muteHttpExceptions': true,
  };
  const response = JSON.parse(UrlFetchApp.fetch('https://oauth2.googleapis.com/token', options));
  return response.access_token;
}

function getAssertion() {
  const privateKey = "-----BEGIN PRIVATE KEY-----\n<PRIVATE KEY>-----END PRIVATE KEY-----\n"
  const header = {
    alg: 'RS256',
    typ: 'JWT'
  };
  const now = new Date();
  const claimSet = {
    iss: "<Service Accountメールアドレス>",
    scope: "https://www.googleapis.com/auth/cloud-platform.read-only",
    aud: "https://accounts.google.com/o/oauth2/token",
    exp: (now.getTime() / 1000) + 3000,
    iat: now.getTime() / 1000
  };
  let toSign = Utilities.base64EncodeWebSafe(JSON.stringify(header)) + '.' + Utilities.base64EncodeWebSafe(JSON.stringify(claimSet));
  toSign = toSign.replace(/=+$/, '');
  const signatureBytes = Utilities.computeRsaSha256Signature(toSign, privateKey);
  let signature = Utilities.base64EncodeWebSafe(signatureBytes);
  signature = signature.replace(/=+$/, '');
  return toSign + '.' + signature;
};

次は上記アクセストークンから、GCPのポリシーを取得する以下APIを実行してみます。
また、上記コードのgetAssertion関数内にて設定している"scope"の値は下記リンクのAuthorization Scopesから値を取ってきてます。

feedbackMethod: projects.get - GCP API

function getGcpPolicies() {
  const options = {
    "method": "POST",
    "contentType": "application/json",
    "headers": {
      "Authorization": "Bearer " + getAccessToken(),
    },
    'muteHttpExceptions': true,
  };
  const response = JSON.parse(UrlFetchApp.fetch('https://cloudresourcemanager.googleapis.com/v1/projects/<プロジェクトID>:getIamPolicy', options).getContentText());
  const policies = response.bindings;
  console.log(policies)
}

上記実行すると、以下のようにロールと対象のロールに紐づくユーザーが確認できるかと思います!(↓削除したServiceAccountも表示されてます)

まとめ

今回、GASでGCP APIを使用する上で必要になるアクセストークンのについて解説しました!
GASからGoogle Cloud上の操作を行いたい場合に本記事が役に立つことを願います!

-エンジニアリングTips
-,