見出し画像

【Python】AWS LambdaからGoogleスプレッドシートを読み込むまで

久しぶりにプログラミング関係(Python + AWS)の記事を更新します。Lambdaを使用していて、Googleスプレッドシート読み込みでつまずいたので備忘録的な感じで残しておきます。

LambdaでGoogleスプレッドシートを使うという記事がそもそも少なかったのですが、本当にこれはどこにも記載がなかったので、もしお役に立てばと思っています。

LambdaでGoogleスプレッドシートを利用するまでにやること

まずLambdaからGoogleスプレッドシートを扱うまでにやることが下記です(調べると紹介している方が結構いたのでここは省きます)。

①Google Cloud Platformでプロジェクト作成
②サービスアカウント作成
③Googleスプレッドシートでサービスアカウントを扱えるようにする
④コードを書く
⑤必要なモジュールを上げる 

今回はについてお話をしていきます。

コードを書いてからモジュールを上げ、テストするまで

こんな感じのlambda_funcsion.pyコードを書きました。簡単な読み込みのコードです。

import gspread
from oauth2client.service_account import ServiceAccountCredentials

JSON_FILE = "service_account_key.json" # サービスアカウントのJSONキー
SPREAD_SHEET_KEY = "*****************************************" #スプレッドシートのキー

def lambda_handler(event, context):
   scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
   credentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_FILE, scope)
   gc = gspread.authorize(credentials)
   worksheet = gc.open_by_key(SPREAD_SHEET_KEY).sheet1
   cell_value  = ws.gacell('A1').value # sheet1のA1を読み込み
   print(cell_value)

ここで、gspreadとoauth2clientを使用しているので、これは外部モジュールで必要ということでエラーが出るのでlambda_funcsion.pyと一緒にzipファイルにして上げます。

が、他にもどんどんエラーが出ます・・・。

{
 "errorMessage": "Unable to import module 'lambda_function': No module named 'chardet'",
 "errorType": "Runtime.ImportModuleError"
}

上記のような気のようなエラーが上げても上げてもどんどん出て、最終的に必要になったモジュールはこれすべてでした。(知らないけど結構色々なもの使ってるんですね・・・)

pyparsing.py
cachetools
certifi
chardet
google
google_auth_oauthlib
gspread
httplib2
idna
oauth2client
oauthlib
pyasn1
pyasn1_modules
rsa

ものすごい勢いで色々必要になりました。ここに関しては色々なサイトを見て何かほかに解決方法ないかと探したのですが、そもそもモジュールを上げるという記述自体ありませんでした。

もしLambdaでGoogleスプレッドシートを扱う場合、これだけ必要だということを覚えておいていただければと思います。

まとめ

Lambdaで色々APIを扱える、というのも素晴らしいですが他のサービスも扱えるというところは本当にすごいですね。AWS関連、勉強していますが次々機能が入るので覚えるのが大変です。試験合格に向けて頑張ります。


おまけ

Lambdaでzipファイルをデプロイするとき、ディレクトリごとやってLambdaの画面でエラーになるからディレクトリ内をコピペして階層変えて、みたいな無駄なことをやっていました。ディレクトリの中身だけzipファイルに出来ると、開発歴6年で初めて知ったという無駄話・・・(恥)