概要
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上の操作を行いたい場合に本記事が役に立つことを願います!