参考:DevelopersIO AWS Lambda からサービスアカウントで Google APIs を叩くまでにやったこと
このページのうち、とりあえず動作確認のため
AWS System Manager Parameter Store を使わない構成でやる
それなりにリスクがあるのでご注意
前提
Googleアカウント(組織向け)→ 認証を作る
Googleアカウントの管理者権限(サービス有効化等の権限)→認可する
Lambda用ロール:最低限で大丈夫
手順
1. 認証情報を作る:Google組織内個人アカウントで操作
1-1. Google側でプロジェクトを作成
ドメインの下に、プロジェクトを作る(グループを作る感じ。名前だけ)
1-2. プロジェクト内にアカウント(サービスアカウント)を作る
サービスアカウントには、メンバー(メールアドレス)追加ができる。
プロジェクト・サービスアカウントは組織に対して作成するもので、ユーザを追加できる
1-3. サービスアカウントキーを作成してダウンロード(JSON)
(JSON情報が洩れて第三者が使う可能性があればこいつを消す)
2.認可設定する: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秒にした
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
糸冬