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

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

##本題

###Googleデベロッパーコンソールに行く,プロジェクトを作成
[Googleデッッベロッパーコンソール](https://console.developers.google.com/)にログイン
![スクリーンショット 2021-01-23 0.32.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/380e136c-fe39-9a18-45db-29a94f2563a2.png)

###APIの有効化>APIライブラリから`Google Drive API`を有効化させる
![スクリーンショット 2021-01-23 0.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/7158f002-a653-ab83-b7fa-e17a3257a2ca.png)

###認証情報の追加>サービスアカウント
![スクリーンショット 2021-01-23 0.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/9ac89fa5-6f01-ea8d-7f40-809b420aff39.png)
###ひとまずロールにオーナーをつけてみよう
![スクリーンショット 2021-01-23 0.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/cf1e9621-306a-067d-8f40-262c86c2b668.png)

###アカウントが作成されたら>JSONの鍵を生成&ダウンロード
![スクリーンショット 2021-01-23 0.38.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/20d20b58-e332-efa4-5412-1685e7fea247.png)
※鍵のタイプを聞かれたらひとまずJSONを選択
↓こんな感じのやつ

```
{
  "type": "service_account",
  "project_id": "exxxxxxxxxxxxxxxxxxxx",
  "private_key_id": "axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n",
  "client_email": "id-xxx@xxxxxxxxxxxxxxx.iam.gserviceaccount.com",
  "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](https://developers.google.com/calendar/quickstart/nodejs)にもあるようなOAuth 2.0 クライアント IDを用いた方法では、トークンの有効期限が一時間のため、常時使い続けるためにはリフレッシュトークンを用いて一時間に一回アクセストークンを更新しなければならない。こちらの場合は[GUI](https://developers.google.com/oauthplayground/)で試すこともできる。

そのため、今回はサービスアカウントを利用した。
サービスアカウントでは、スコープを与えるだけでは、ファイルに書き込んだりすることができない。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
##まだ追い切れてなくて気になったやつ
https://github.com/googleapis/google-auth-library-nodejs#samples