1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-01

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

糸冬

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?