やりたいこと
嫁さんとGoogleカレンダーの予定を共有しているのだが、カレンダーをチェックすることを忘れてて何回かトラブルが起きた。 例えば飲み会、弁当不要みたいな予定を確認し忘れて、1日4食になったり。次の日遊びに行く予定を完全に忘れてたり(主に自分が)。 これらのトラブルを解決するため、毎日夜23:30に次の日の予定をLINEに通知するスクリプトを作ってみた。もう何番煎じかわからないが備忘録として残す。
各種APIキーの取得
GoogleカレンダーAPIキー取得
ここのSTEP1
https://developers.google.com/tasks/quickstart/python
LINE Notify APIキー取得
きっとここからとれる(投げやり)
Lambdaでスクリプト実行
Lambdaとは
乱暴に一言でまとめると、プログラムだけ準備すれば実行できるAWSサービス
プログラム実行回数毎に課金される。実行に必要なメモリ量は指定できる。メモリ量によって料金も変動
関数の作成
まずは実行するプログラムの環境設定を行う。決めるのは大きく2つ。
- どんな言語を利用するか
- どんな権限が必要か
権限というのはこのプログラムがどのAWSリソースにアクセスできるかを設定する。
コンソールの画面
今回はS3へはアクセスしないが、今後使う予定なのでこの権限は残しておく。 もしも利用しないようであれば後でIAMロールからS3へアクセスする部分の権限を削除しておくことを推奨。
スクリプト
以前に作ってたやつのメイン関数を lambda_handler
に修正。今日中にコードをアップします...
参考にしたのはこのあたり。ほぼサンプルを使ってるのでGitHubにアップするのも心苦しいが。
https://developers.google.com/calendar/quickstart/python
デプロイ
Lambdaでpythonの外部ライブラリを利用したいときはソースコードと合わせてライブラリもアップロードする必要がある。今回は以下の記事を参考に実施してみた。
パッケージのインストール
mkdir workspace cd workspace pip install --upgrade google-api-python-client oauth2client requests -t .
アップロードファイルの作成
zip -r upload.zip *
アップロード
今回はcredentianやsecretも一緒にzipするが、どう考えても別の場所に保存して参照するほうがよい。S3に保管、それを参照するように改良予定。
実行
テストしてみると以下のようなエラーが出てきた
"errorMessage": "('Error opening file', 'client_secret.json', 'Permission denied', 13)", "errorType": "InvalidClientSecretsError",
Lambdaで実行するとき、client_secret.json
と credentials.json
は「その他」に「読み取り」権限が必要ということが判明。
良くない気がしながらもしょうがないので読み取り権限を追加して再度アップロードして実行。
実行結果
LINE通知
上の予定は個人名が入ってたのでモザイク
Cloudwatch Eventsでスケジューラ設定
Cloudwatch Eventsとは
Cloudwatchの一部機能で、AWSリソースの状態変化をイベントとして検知して任意のターゲットに処理を振り分けることができる。ターゲットとして様々なサービスが指定できる。
スケジューラ設定
cron形式で設定。linuxで使ってるcronの形式とは微妙に違うので注意 また、時刻はGMTでしか設定できないのでJSTを変換して考えること https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html
これですべて設定完了です。お疲れ様でした。
感想
Lambdaのデプロイは今回の方法で開発していると非常に非効率。このへんは工夫してもっと簡単にできると思う。また、ローカルでLambdaの検証ができるツールがAmazon公式であるようなので今度はこちらを使ってみようと思う。
2, 3時間で終わるかなーと思ってけど想像以上に時間がかかってしまった。初めてやることは躓くと時間がかかるし、ブログ書きながらだと更に時間がかかる。 まとめ方はもう少し試行錯誤が必要。
memo
ポリシーテンプレートの中身。今回は別にどの権限もいらないので作成後にIAM画面から不要な権限を削除 docs.aws.amazon.com