これのことです。意外と2年前につくったものなんですね(もっと昔につくった気がしていた)。
当初はherokuで動かしていたんですが無料枠をめちゃくちゃ圧迫するのでVPSに移して、今度はAWSの勉強がてらVPS撤退を進めようということにしたのでこのアプリケーションについてもAWSへ移植しました。
構成としては、以前はXPathFeedのようにストレージなどは持たずにリクエストがきたらパラメーターから動的にフィードを生成してレスポンスするというものだったところから、AWSでLambdaを定期実行してDynamoDBから設定を読み込んでフィードを生成してS3へ外部からアクセス可能な形でアップロードするというものに変更しました。
こういう構成にした理由としては基本的にはコスト削減以上の理由は無いですね。常時リクエスト可能なインスタンスを建てるとそれだけでVPS契約できるくらいのコストがかかりそうだったのでそれは避けたという形です。DynamoDBを使っているのはAWSコンソールからテーブルを操作できるので設定が楽だからというだけです。
多分そのまま sam build --use-container; sam deploy --guided
しても皆さんのお手元では動かないけど(めんどくさがってDynamoDBがCFnの管理下になっていないため)、ソースコードは一応公開しています。
それにしても大したアプリケーションじゃないんですがAWSに不慣れということで変なところでいちいちつまづきました。 sam local invoke
しながら動作確認して開発していたんですが、最後にエイヤッとLambdaにデプロイしてから不思議と動かない要素が多くて苦労したので、あんまりlocalで動作確認しても意味ないなと思いました。
以下、苦しみです。
一週間前に定期実行するようにしたつもりだったLambdaが全部タイムアウトしてたことに今更気づいた……
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
まあさすがに調べるかと思ってチマチマやってみたところ、何らかのgemをrequireするとタイムアウトするまで何かがスタックしているということが分かってきた。勘弁してくれ
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
require 'aws-sdk'すると破滅するということが分かってきた、この辺なんも分かってないな……
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
require 'aws-sdk-dynamodb'とかにチマチマ置き換えたら動くようになった
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
S3へのputObjectでなぜか失敗してるけどAccess Deniedということしか教えてくれないので疲れてきた
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
template.yamlでResourceをARNじゃなくて*で雑に指定すると動くということが分かった。今日はもうギブアップ
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
いや、Actionのほうが*じゃないと動かないのか??なんか朦朧としてきた
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
よく知らんけどどうせ内部的には存否確認にPutObject以外のなにかを使っているとかじゃないかという気がしてきた
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
s3:PutObjectじゃなくてs3:PutObjectAclってのがあったからこれか??と思ったけど違った、今度こそギブアップ
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
なんかAWSのSGとかもそうだけどキツめに絞ろうと思うとめちゃくちゃハマるので諦めてゆるくしといたほうが良いんだろうけど、じゃあなんでこれ書いてんの??みたいな気持ちにはなる
— 𝙨𝙝𝙞𝙢𝙤𝙗𝙖𝙮𝙖𝙨𝙝𝙞 (@shimobayashi) 2020年1月18日
特に require 'aws-sdk'
はアンチパターンということが分かりました。なぜか動作がスタックするという以外にも、依存が大量に含まれているせいかビルド時間もデプロイ時間も急増するので、個別に指定したほうが良いです。
ともあれ、これでVPSで動いていたものは全部AWSへ移植できた気がするので先程VPSをシャットダウンしてみました。これで実生活に問題が無ければVPSを晴れて解約できそうです。
次は何を勉強しようかなあというところで、今んとこのネタとしては
- CFn
- template.yamlを勘で書いていて何もわからないので
- CDK
- SAM使ってるうちは使わなさそうだけど自分でCFnを使ってなんかやろうと思ったらYAML書きたくないので
- TypeScript
- CDKでも使えるっぽいしフロントエンドでもサーバーサイドでも使えて良さそうという雰囲気があるので
- AWS SAA取得を目指してみる
- そもそも体系的な知識がまったくないので
あたりかなあ。なんか良い勉強法などあれば教えて下さい。