ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

Lambdaで明日の予定をLINEで通知する

やりたいこと

嫁さんとGoogleカレンダーの予定を共有しているのだが、カレンダーをチェックすることを忘れてて何回かトラブルが起きた。 例えば飲み会、弁当不要みたいな予定を確認し忘れて、1日4食になったり。次の日遊びに行く予定を完全に忘れてたり(主に自分が)。 これらのトラブルを解決するため、毎日夜23:30に次の日の予定をLINEに通知するスクリプトを作ってみた。もう何番煎じかわからないが備忘録として残す。

各種APIキーの取得

GoogleカレンダーAPIキー取得

ここのSTEP1

https://developers.google.com/tasks/quickstart/python

LINE Notify APIキー取得

きっとここからとれる(投げやり)

notify-bot.line.me

Lambdaでスクリプト実行

Lambdaとは

qiita.com

乱暴に一言でまとめると、プログラムだけ準備すれば実行できるAWSサービス プログラム実行回数毎に課金される。実行に必要なメモリ量は指定できる。メモリ量によって料金も変動

関数の作成

まずは実行するプログラムの環境設定を行う。決めるのは大きく2つ。

  • どんな言語を利用するか
  • どんな権限が必要か

権限というのはこのプログラムがどのAWSリソースにアクセスできるかを設定する。

コンソールの画面

f:id:oneal-desu:20181005075634p:plain

f:id:oneal-desu:20181005080317p:plain

f:id:oneal-desu:20181005204739p:plain

今回はS3へはアクセスしないが、今後使う予定なのでこの権限は残しておく。 もしも利用しないようであれば後でIAMロールからS3へアクセスする部分の権限を削除しておくことを推奨。

スクリプト

以前に作ってたやつのメイン関数を lambda_handler に修正。今日中にコードをアップします...

github.com

参考にしたのはこのあたり。ほぼサンプルを使ってるのでGitHubにアップするのも心苦しいが。

PythonでLINEに通知を送る

https://developers.google.com/calendar/quickstart/python

デプロイ

Lambdaでpythonの外部ライブラリを利用したいときはソースコードと合わせてライブラリもアップロードする必要がある。今回は以下の記事を参考に実施してみた。

qiita.com

パッケージのインストール

mkdir workspace
cd workspace
pip install --upgrade google-api-python-client oauth2client requests -t .

アップロードファイルの作成

zip -r upload.zip *

アップロード

f:id:oneal-desu:20181005205003p:plain

今回はcredentianやsecretも一緒にzipするが、どう考えても別の場所に保存して参照するほうがよい。S3に保管、それを参照するように改良予定。

実行

テストしてみると以下のようなエラーが出てきた

  "errorMessage": "('Error opening file', 'client_secret.json', 'Permission denied', 13)",
  "errorType": "InvalidClientSecretsError",

Lambdaで実行するとき、client_secret.jsoncredentials.json は「その他」に「読み取り」権限が必要ということが判明。 良くない気がしながらもしょうがないので読み取り権限を追加して再度アップロードして実行。

実行結果

f:id:oneal-desu:20181006150626p:plain

LINE通知

上の予定は個人名が入ってたのでモザイク f:id:oneal-desu:20181006150742p:plain

Cloudwatch Eventsでスケジューラ設定

Cloudwatch Eventsとは

Cloudwatchの一部機能で、AWSリソースの状態変化をイベントとして検知して任意のターゲットに処理を振り分けることができる。ターゲットとして様々なサービスが指定できる。

docs.aws.amazon.com

スケジューラ設定

f:id:oneal-desu:20181006153640p:plain

cron形式で設定。linuxで使ってるcronの形式とは微妙に違うので注意 また、時刻はGMTでしか設定できないのでJSTを変換して考えること https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html

f:id:oneal-desu:20181006155346p:plain

f:id:oneal-desu:20181006154143p:plain

これですべて設定完了です。お疲れ様でした。

感想

Lambdaのデプロイは今回の方法で開発していると非常に非効率。このへんは工夫してもっと簡単にできると思う。また、ローカルでLambdaの検証ができるツールがAmazon公式であるようなので今度はこちらを使ってみようと思う。

qiita.com

2, 3時間で終わるかなーと思ってけど想像以上に時間がかかってしまった。初めてやることは躓くと時間がかかるし、ブログ書きながらだと更に時間がかかる。 まとめ方はもう少し試行錯誤が必要。

memo

ポリシーテンプレートの中身。今回は別にどの権限もいらないので作成後にIAM画面から不要な権限を削除 docs.aws.amazon.com