LoginSignup
5
3

More than 5 years have passed since last update.

消すに消せない自分アプリをaws-serverless-expressでserverlessにする

Last updated at Posted at 2017-08-01

ある程度コードを書くというのをやっていると、軽率な気持ちで作ったのになぜか自分以外が使うようになって、消すに消せなくなったアプリとかあるのではないかと思います。それを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 にチュートリアルがあるので従います。
細かい点は本家を読んでください。

  1. git clone https://github.com/awslabs/aws-serverless-express.git
  2. example ディレクトリから下記4つのファイルをコピってくる
    • api-gateway-event.json
    • cloudformation.yaml
    • lambda.js
    • simple-proxy-api.yaml
  3. package.json が既にあったらいい感じに exmaple/package.jsonscriptsconfig の部分を移植する。なかったらそのまま持って来ればいい。
  4. npm run config -- --account-id="<accountId>" --bucket-name="<bucketName>" [--region="<region>" --function-name="<functionName>"
    • 自分の場合は引数指定が面倒だったので credstash から読み込むように書き換えました。でも package.jsonconfig で参照している箇所があって書き換えられなかったのであんまり意味はなかったかも。ここは真似はしなくていいと思います。
  5. npm install --save aws-serverless-express
  6. npm run package-deploy
  7. ぃぇーーーーーーーーーーーぃ!

とゴールしたいところですがもうちょっとやることがあります。

さすがに独自ドメインで運用している(と思われる)自分アプリをいきなり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 : ディストリビューションドメイン名 を入力
  • API Gatewayで発行されたURLと独自ドメインのURLの内容が同じかを確認する

感想とか

  • 思ったよりは簡単に動いた
  • 自分アプリはNodeJSに書き換えちゃおうかなと思う程度にはいい感じである
  • アクセスごとに時間計算されて行く様はおもしろい
  • Lambdaはほぼ一ヶ月のリソースがタダなので自分アプリの置き所としてはかなりよいと思う
  • DynamoDBも25RCU/25WCUまでタダなのでかなりよい
  • NodeJSの辛ささえ許容できれば全然有りな手段
  • とはいえほぼアクセスがない自分アプリ前提の話なので、ある程度の規模ならば普通にEC2+RDSのが良いと思う
  • Lambdaは早くver7対応してawait/async使わせて
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3