背景
- 以下の記事に沿って Gmail API を叩く Python スクリプトを作成
- スクリプトを Lambda で動くようにして、実行したところ
[Errno 30] Read-only file system
が発生- ローカルで実行したときには起きなかった
原因
- 権限ファイル (client_id.json) の書き込みでエラーになっている模様
- エラーのスタックトレースを見ると、oauth2client ライブラリ内で発生しているようだった
"errorMessage": "[Errno 30] Read-only file system: 'client_id.json'",
:
[
"/var/task/oauth2client/file.py",
79,
"locked_put",
"f = open(self._filename, 'w')"
],
:
-
self._filename
は Storage クラスのコンストラクタ引数- https://github.com/googleapis/oauth2client/blob/master/oauth2client/file.py#L33
- 作成したスクリプトでは client_id.json のパスを渡しており、client_id.json はスクリプトと同じディレクトリに置いていた
- Lambda が書き込みできるのは
/tmp
配下のファイルのみなので、Read-only エラーとなった
対応
- client_id.json を一旦
/tmp
に退避させてから Storage クラスを作成する
before
user_secret_file = 'client_id.json'
store = Storage(user_secret_file)
credentials = store.get()
after
import shutil
:
user_secret_file = 'client_id.json'
user_secret_tmp_path = '/tmp/' + user_secret_file
shutil.copy2(user_secret_file, user_secret_tmp_path)
store = Storage(user_secret_tmp_path)
credentials = store.get()