下林明正のブログ

個人的かつ雑多なブログです。

お布団指数をLINE Notifyで通知してくれるアプリケーションをAWS SAMってやつで書き直してみたけど思ったより大変だった

これをつくった。

github.com

お布団指数というのは自分独自の指標で、その日どんな布団を被れば良いのかを教えてくれるやつです。 過去のバージョンはDropboxに置いていたので特にパブリックな場所にはありません(ちなみに書き直す前はLINE NotifyではなくTwitterのbot用アカウントから通知されていた)。

ついでにAWS SAMってやつに入門してみたんですが、思ったよりも色々とハマってしまったのでメモしておこうと思います。

SAM大変だった

SAMや周辺(CFnなど)のことを基本的には何も知らないので、

qiita.com

などを眺めながら適当に入門した。

ハマったポイント1: CloudWatch Eventsのcron書式の書き方

cronの書式の場合は日にちか曜日の指定のどちらかに ? を指定しないといけないので気をつけよう。 これは調べればすぐ分かる。

You can't specify the Day-of-month and Day-of-week fields in the same cron expression. If you specify a value (or a *) in one of the fields, you must use a ? (question mark) in the other. https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html

ハマったポイント2: Lambdaでmechanize gemを使う方法

これを回避するため、AWS SAMを用いて雛形作成した上で、 「sam build --use-container」を実行しAmazonLinux2のDockerコンテナ上でビルドを行いました。 https://qiita.com/Y_uuu/items/85c86df8773f7c225521

これでいけるけど、以後 sam build がめちゃ遅くなる。つらい。どうにかなりませんかね?

ハマったポイント3: 環境変数の指定の仕方

なんか --env-vars オプションを使った方法は見つかるんだけど sam deployそのオプションをサポートしてないっぽいので --parameter-overrides でやる方法を調べたところ、結局ここに書いてあるやり方が良さそうという感じだった。

github.com

ちなみにリンク先では --parameter-overrides SomeVar=123 という書き方をしているけどこれは手元で試したところ --parameter-overrides "KeyPairName=MyKey SomeVar=123" という書き方をしないと通してくれなかった。

同様の書式をsam local invokeはサポートしてるのでローカルで試したい場合はコマンドにコピペして使えば良い。

あと、Parametersセクションの方で宣言しているパラメーター名がResourcesセクションの方で宣言している環境変数名と同じだとなぜかうまくいかなくてハマっていた。 どうやら、以下のような制限によるものらしい(アンダースコアが使えない)。

論理 ID 論理 ID は英数字(A-Za-z0-9)とし、テンプレート内で一意である必要があります。論理名は、テンプレートの他の部分のリソースを参照するために使用します。たとえば、Amazon Elastic Block Store ボリュームを Amazon EC2 インスタンスにマップする場合、論理 ID を参照してブロックストアをインスタンスに関連付けます。 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html

つまり、Resourcesセクションの方でもUpperCamelCaseで環境変数名を宣言していれば同名でも問題なかった?このあたりは未確認。

特にエラーなど出してくれていなかったと思うので、分かりづらかった。