LambdaからGoogleDrive内のファイルを読む


参考：[DevelopersIO AWS Lambda からサービスアカウントで Google APIs を叩くまでにやったこと](https://dev.classmethod.jp/articles/call-google-apis-from-aws-lambda-by-service-account/)

このページのうち、とりあえず動作確認のため
AWS System Manager Parameter Store を使わない構成でやる

それなりにリスクがあるのでご注意

# 前提

Googleアカウント（組織向け）→ 認証を作る
Googleアカウントの管理者権限（サービス有効化等の権限）→認可する
Lambda用ロール：最低限で大丈夫


# 手順

## １. 認証情報を作る：Google組織内個人アカウントで操作
[Google APIs | リソースの管理](https://console.developers.google.com/cloud-resource-manager)

#### 1-1. Google側でプロジェクトを作成
ドメインの下に、プロジェクトを作る（グループを作る感じ。名前だけ）
#### 1-2. プロジェクト内にアカウント（サービスアカウント）を作る
サービスアカウントには、メンバー（メールアドレス）追加ができる。
プロジェクト・サービスアカウントは組織に対して作成するもので、ユーザを追加できる
#### 1-3. サービスアカウントキーを作成してダウンロード（JSON）
（JSON情報が洩れて第三者が使う可能性があればこいつを消す）


## ２．認可設定する：Google組織管理者権限で操作
[Google管理コンソール](https://admin.google.com/)
#### 2-1. 場所：セキュリティ →　API の制御　→　ドメイン全体の委任
ドメイン全体の委任を管理  を選択
#### 2-2. サービスアカウント認証情報に含まれるclient_idに権限委任する
「新しく追加」を押下して、下記内容を設定する

| 設定箇所 | 設定値 |
|:-:|:-:|
| クライアントID  | 1-3でダウンロードしたJSONファイル中のclient_id  |
| OAuthスコープ  | 固定文字列  https://www.googleapis.com/auth/drive  |

※ ダウンロードしたJSONファイルに対して、GoogleDriveの利用を許可する。という意味

## ３，AWS側の作業
参考サイトの”Parameter Store”と”IAMロール作成”はやらない。
※セキュリティ的にはかなり弱くなるがあくまでも検証のため

3-1. レイヤーの作成
Hyper-VでCentOSゲストを立ててでレイヤーファイルを作った

```
yum -y install gcc gcc-c++ kernel-devel python38-devel libxslt-devel libffi-devel openssl-devel
yum -y install python38-pip
mkdir python/ 
cd python
pip install -t ./ google-api-python-client
pip install -t ./ oauth2client
cd ..
zip -r ggr.zip python/

```

ggr.zipをAWS Lambda レイヤーにアップロード

3-2. Lambda関数の作成

・ロールは適当に（このサンプルではロールに依存するような箇所はなし）
・レイヤーとして、3-1 のレイヤーを設定（参考サイトはレイヤーを使わない方法。どちらもで良い）
・タイムアウト時間を15秒にした

```python:lambda_function.py
import json
import os
import boto3
from google.oauth2 import service_account
from googleapiclient.discovery import build

REGION = 'ap-northeast-1'
SUBJECT = '●Google組織アカウントのメールアドレス●'
SCOPES = ['https://www.googleapis.com/auth/drive']

def lambda_handler(event, context):
    
    # ここは1-3 でダウンロードしたJSONをそのまま貼った
    service_account_info = {
  "type": "service_account",
  "project_id": "sample-project-ほげほげ",
  "private_key_id": "1786491bcc78ああー08ああーadああー598a50c",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIT8ほげほげほげほげPL5tCap7ujkYagHKKsM=\n-----END PRIVATE KEY-----\n",
  "client_email": "sample-service-ほげほげ@sample-project-ほげほげ.iam.gserviceaccount.com",
  "client_id": "104518あーあーあー9675",
  "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/sample-service-あーあーsample-project-あーあー.iam.gserviceaccount.com"
}

    credentials = service_account.Credentials.from_service_account_info(
        service_account_info, scopes=SCOPES)
    
    delegated_credentials = credentials.with_subject(SUBJECT)
    service = build('drive', 'v3', credentials=delegated_credentials, cache_discovery=False)
    results = service.files().list(
        pageSize=10, fields="nextPageToken, files(id, name)").execute()

    items = results.get('files', [])
    for item in items:
        print(item['name'])
```

## 実行

おやエラーメッセージが

> Drive API has not been used in project 5469123456778 before or it is disabled.

Google Drive APIが有効になっていないっていう事で
エラーメッセージに表示されているリンクを押下で有効化した後、再実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/e0d65357-02eb-3e98-ca0b-33637a462d10.png)


ファイル一覧が表示された。

```
START RequestId: 35ee4f64-1234-441d-9170-8c06f394fcae Version: $LATEST
家回線
Ymobile
index.pdf
IMG_1741.MOV
20170823.zip
201610
IMG_0362.JPG
IMG_0341.JPG
IMG_0339.JPG
IMG_0386.JPG
IMG_0252.JPG
END RequestId: 35ee4f64-1234-441d-9170-8c06f394fcae
REPORT RequestId: 35ee4f64-1234-441d-9170-8c06f394fcae	Duration: 2995.16 ms	Billed Duration: 2996 ms	Memory Size: 128 MB	Max Memory Used: 93 MB	Init Duration: 446.97 ms
```

糸冬