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


参考:DevelopersIO AWS Lambda からサービスアカウントで Google APIs を叩くまでにやったこと

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

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

前提

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

手順

1. 認証情報を作る:Google組織内個人アカウントで操作

Google APIs | リソースの管理

1-1. Google側でプロジェクトを作成

ドメインの下に、プロジェクトを作る(グループを作る感じ。名前だけ)

1-2. プロジェクト内にアカウント(サービスアカウント)を作る

サービスアカウントには、メンバー(メールアドレス)追加ができる。
プロジェクト・サービスアカウントは組織に対して作成するもので、ユーザを追加できる

1-3. サービスアカウントキーを作成してダウンロード(JSON)

(JSON情報が洩れて第三者が使う可能性があればこいつを消す)

2.認可設定する:Google組織管理者権限で操作

Google管理コンソール

2-1. 場所:セキュリティ → API の制御 → ドメイン全体の委任

ドメイン全体の委任を管理 を選択

2-2. サービスアカウント認証情報に含まれるclient_idに権限委任する

「新しく追加」を押下して、下記内容を設定する

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

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

3,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秒にした

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が有効になっていないっていう事で
エラーメッセージに表示されているリンクを押下で有効化した後、再実行。

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

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

糸冬