【メモ】LambdaからgoogleDriveAPIを操作する


はじめに

LambdaからgoogleAPIでGooglDriveをいじりたかったのですが、サービスアカウントを用いた参考文献が少なく、理解するのに時間がかかったのでメモ感覚で書いておきます。

本題

Googleデベロッパーコンソールに行く,プロジェクトを作成

Googleデッッベロッパーコンソールにログイン

APIの有効化>APIライブラリからGoogle Drive APIを有効化させる

認証情報の追加>サービスアカウント

ひとまずロールにオーナーをつけてみよう

アカウントが作成されたら>JSONの鍵を生成&ダウンロード


※鍵のタイプを聞かれたらひとまずJSONを選択
↓こんな感じのやつ

{
  "type": "service_account",
  "project_id": "exxxxxxxxxxxxxxxxxxxx",
  "private_key_id": "axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n",
  "client_email": "[email protected]",
  "client_id": "xxxxxxxxxxxxxxxxxx",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxxxxxxxxxxxxxxxx5.iam.gserviceaccount.co

ソースコードの作成

cd desktop
mkdir sample
cd sample
touch index.js
touch privatekey.json
npm init -y

privatekey.jsonに先ほどインストールした認証情報のJSONを入れる

//googleAPIをいじるためのモジュール
npm install googleapis
index.js
const { google } = require("googleapis");
const privatekey = require("./privatekey.json");
exports.handler = async (event) => {
  const res = await Promise.resolve()
    .then(function () {
      return new Promise(function (resolve, reject) {
        //JWT auth clientの設定
        const jwtClient = new google.auth.JWT(
          privatekey.client_email,
          null,
          privatekey.private_key,
          ["https://www.googleapis.com/auth/drive"]
        );
        //authenticate request
        jwtClient.authorize(function (err, tokens) {
          if (err) {
            reject(err);
          } else {
            //認証成功
            resolve(jwtClient);
          }
        });
      });
    })
    .then(function (jwtClient) {
      return new Promise(async function (resolve, reject) {
        const drive = google.drive({ version: "v3", auth: jwtClient });
        drive.files.list(
          {
            pageSize: 10,
            fields: "nextPageToken, files(id, name)",
          },
          (err, res) => {
            if (err) reject(err);
            const files = res.data.files;
            if (files.length) {
              resolve(files);
            } else {
              resolve("No files found.");
            }
          }
        );
      });
    });
    console.log(res)
};



ややこしかったこと

認証方法にはいくつかあり、 公式リファレンスのquickstartにもあるようなOAuth 2.0 クライアント IDを用いた方法では、トークンの有効期限が一時間のため、常時使い続けるためにはリフレッシュトークンを用いて一時間に一回アクセストークンを更新しなければならない。こちらの場合はGUIで試すこともできる。

そのため、今回はサービスアカウントを利用した。
サービスアカウントでは、スコープを与えるだけでは、ファイルに書き込んだりすることができない。googleDriveのコンソールからサービスアカウントのメールアドレスに編集権限を与える必要がある。

お世話になったサイト

https://qiita.com/Fujimon_fn/items/9a0ec4eca75ce0784722
https://developers.google.com/drive/api/v3/quickstart/nodejs
https://developers.google.com/oauthplayground/
https://playwithgoogleapi.hatenablog.com/entry/2019/06/30/133415
https://qiita.com/n0bisuke/items/ff1479cd14e7a0c0be0c

まだ追い切れてなくて気になったやつ