この内容の記事ありそうでなかったので備忘録程度に書いておく。
例えばこのquickstartにあるみたいに普通にやろうとすると、途中でブラウザが立ち上がってgoogleアカウントにログインしろよって言われるけど、aws上からそんなことやるわけにもいかない。
そこでサービスアカウントというのを作る必要がある。
google cloud platformでの操作
- google cloud platformに行く
- 新しいプロジェクトを作成。プロジェクト名を適当に決める。他は空欄のまま作成。
- ハンバーガーボタン(三本線のメニュー)からAPIとサービス>認証情報
- +認証情報を作成>サービスアカウント
- 適当にサービスアカウント名をつけて、あとは空欄のまま作成して続行とかを押して作成。
- 作ったサービスアカウントをクリックして上あたりにタブでキーを選んで 鍵を追加>新しい鍵を作成
- JSONにチェックが入ってると思うけどそのまま作成。JSONファイルがダウンロードされる。
ここまで若干デザイン変わってたりするけど以下のリンクの『権限(ドメイン全体の委任)の設定』の前までと同じ。
ここまででgoogle cloud platformでやることは終わったのでgoogle calendarに飛ぶ。
google calendarでの操作
- 新しいカレンダーの作成 好きに名前をつけたりする。
- 特定のユーザーとの共有>ユーザーを追加
- メールアドレスにサービスアカウントのメールアドレス(Google Cloud Platformのプロジェクトのサービスアカウントのとこにある)xxx@xxx.iam.gserviceaccount.comみたいなやつを追加する。
- 左上のハンバーガーボタンからAPIとサービス>ライブラリ
- Google calendar apiを探して有効にする
ここまで以下のリンクとだいたいおなじ
実際に走らせるコードの原型
コードをかく。どう書くとかあんま覚えてなかったけどそれっぽいワードで検索して引っかかった以下の方のgithub先のコードを参考にした。
が、oauth2clientを使うのは非推奨らしい(どこかで見たけど2017年時点で非推奨らしいです)ので書き換える。てかそもそもこれはカレンダーの取得だけど自分の目的はカレンダーへの書き込みなので書き換えて、クラスも取っ払っちゃえとかやってたら結局コードの原型はなくなって以下のようになった。
cache_discovery=Falseをつけないとエラーになるらしい(なんか色んなとこで見たのでエラー出るのか検証せずに引数に入れた)
こんな感じのコードを手元で実験したらちゃんと通ったのでlambdaに載っける
aws lambdaに載せるための操作
今回は既存のlambda上のコードに追加する形でawsにのっけたかったので、レイヤーを追加して対応することにした。importするgoogle.oauth2とかそのへんのやつが下のリンクのリストに載ってないのでレイヤーを自作する必要がありそう(ちなみにpython3.7で走らせてるから下のリンクはそれ用になってる)。
適当な作業ディレクトリで
pip install google-api-python-client -t ./Python/lib/python3.7/site-packages
して
zip -r layer.zip python
する。レイヤーのことようわからんけどフォルダの構造はpython/lib/python3.7/site-packages/[なんかいろいろライブラリ]の形じゃないとダメらしい
aws lambda上での操作
layer.zipにしたやつをaws lambdaのハンバーガーボタンの中のレイヤー>レイヤーの作成のとこからzipをアップロード。名前は適当にgoogle-api-python-clientにしといた。
lambdaの関数の一番下のレイヤーのとこからこのつくったレイヤーを追加する。
あとは書いたコードの機構を適当に組み込めば完成!
うごかす
そもそもやりたかったのは大学の課題の通知を
PandAの課題を学科のslackに流すようにした pic.twitter.com/CbtEL3vfMa
— ポタージュ (@_2pt) 2021年4月23日
こんな感じでlambda叩いて大学の課題とかのサイトをスクレイピングしてデータとって流してたんだけど、カレンダーにも追加したい!と思っていたことから(そもそも上のここまでの作業がなんかめんどくてやりたくなかった)
ってことでlambda叩いてカレンダーにも追加されるようになった。
Macのカレンダーとgoogle calendarを連携させてるのでMacのアプリケーション方から確認してるけど、ちゃんと反映されました。めでたしめでたし。