ある程度コードを書くというのをやっていると、軽率な気持ちで作ったのになぜか自分以外が使うようになって、消すに消せなくなったアプリとかあるのではないかと思います。それをaws-serverless-expressに書き換えて(ほぼ)タダで運用しようと移行した結果を書いておきます。
ソースはここです。
https://github.com/celeron1ghz/gomitter-nodejs
1. NodeJSに移植
一番大事な箇所かもしれませんがあまり本質的ではないので要点を書きます。
memcachedとmysqlをDynamoDBに置き換える
多分一番の障壁はここではないかと思います。
色々と調べましたが、無尽蔵にスケールが可能なLambdaに対し、mysql(RDS)はコネクション数で限界がきます。まぁ自分アプリなのでコネクションが限界まで行くとは思えませんが、コネクションプールの問題はハマると面倒なので、ここは潔くNoSQLに書き換えます。
自分アプリなのでそんな規模が大きくないとは思いますが、そこは頑張りましょう。がんばルビィ。
memcached(というかsessionの保存先)は connect-dynamodb
というモジュールがありますのでほぼ何も考えることなく設定を書くだけでいいと思います。
2. aws-serverless-expressを参考にセットアップ
aws-serverless-express/example にチュートリアルがあるので従います。
細かい点は本家を読んでください。
git clone https://github.com/awslabs/aws-serverless-express.git
-
example
ディレクトリから下記4つのファイルをコピってくる
- api-gateway-event.json
- cloudformation.yaml
- lambda.js
- simple-proxy-api.yaml
-
package.json
が既にあったらいい感じにexmaple/package.json
のscripts
とconfig
の部分を移植する。なかったらそのまま持って来ればいい。 npm run config -- --account-id="<accountId>" --bucket-name="<bucketName>" [--region="<region>" --function-name="<functionName>"
- 自分の場合は引数指定が面倒だったので
credstash
から読み込むように書き換えました。でもpackage.json
のconfig
で参照している箇所があって書き換えられなかったのであんまり意味はなかったかも。ここは真似はしなくていいと思います。
npm install --save aws-serverless-express
npm run package-deploy
- ぃぇーーーーーーーーーーーぃ!
とゴールしたいところですがもうちょっとやることがあります。
さすがに独自ドメインで運用している(と思われる)自分アプリをいきなりAWSな感じのアドレスにはできないと思うのでドメイン設定です。
ドメイン設定
API Gatewayで独自ドメインを使うにはHTTPSが必須なので、証明書を取得してから各種設定をしていきます。
独自ドメインはRoute53で設定済みのつもりで書いてます。
ここでは moge.com
にて gomi.moge.com
に対して設定する場合の例。
- Certificate Manager
-
*.moge.com
で証明書を取る - メールのリンクをクリックし、リンク先にある
Approve
ボタンを押して認証
-
- API Gateway
- カスタムドメインを作成する
- ドメイン名 :
gomi.moge.com
- ACM証明書 :
*.moge.com
- パス : 空白
- 送信先 :
GomitterCloudNative
- ステージ :
prod
- ドメイン名 :
- 作成後40分くらい待つ
- 表示される ディストリビューションドメイン名 をコピー
-
abcdefg.cloudfront.net
みたいな文字列
-
- カスタムドメインを作成する
- Route53
-
moge.com
のHostedZoneを開く -
moge.com
に以下のレコードを作成する- Name :
gomi.moge.com
- Type : A
- Alias :
Yes
- Alias Target : ディストリビューションドメイン名 を入力
- Name :
-
- API Gatewayで発行されたURLと独自ドメインのURLの内容が同じかを確認する
- https://abcfed.execute-api.ap-northeast-1.amazonaws.com/prod/ (API Gatewayが発行したURLの例)
- https://gomi.moge.com (独自ドメインのURL)
感想とか
- 思ったよりは簡単に動いた
- 自分アプリはNodeJSに書き換えちゃおうかなと思う程度にはいい感じである
- アクセスごとに時間計算されて行く様はおもしろい
- Lambdaはほぼ一ヶ月のリソースがタダなので自分アプリの置き所としてはかなりよいと思う
- DynamoDBも25RCU/25WCUまでタダなのでかなりよい
- NodeJSの辛ささえ許容できれば全然有りな手段
- とはいえほぼアクセスがない自分アプリ前提の話なので、ある程度の規模ならば普通にEC2+RDSのが良いと思う
- Lambdaは早くver7対応してawait/async使わせて