ひよっこエンジニアの雑多な日記

なんとかWeb系のエンジニアをやっています。

AWS LambdaでSinatraを動かしてみる

12月から晴れてWebエンジニアになりました。

ということでアウトプットを増やしていかねばと久々の執筆です。

概要

今回はRubyのランタイムが追加されたAWS LambdaでSinatraを動かしてみたいと思います。

GitHub - aws-samples/serverless-sinatra-sample: Demo code for running Ruby Sinatra on AWS Lambdaを使ってREADMEに書かれているコマンドを実行していけばサクッとできます。
ただ個人的に何が起きているのかさっぱりで釈然としなかったので自分なりに理解しながら新しく作ってみました。

↓ 今回作ったサンプルコード
https://github.com/kimuray/sinatra_lambda_sample

登場人物

今回登場する役者は3つです。

AWS Lambda

言わずと知れたサーバーレスのコード実行サービスです。
サーバーを管理する必要がなくなるのでサーバーの準備や運用を考えなくてよくなります。

aws.amazon.com

Sinatra

Ruby製のシンプルにWebアプリケーションが作れるフレームワークです。
Railsほど機能はいらんけど、ルーティングあたりの機能は欲しいなどの要望に応えてくれます。

Sinatra

AWS CloudFormation

AWSでのインフラ構築を自動化してくれるサービスです。
一度設定してしまえばそれに従って同一環境を何度でも簡単に作れるようになります。
今回はCloudFormationが主役になります。

AWS CloudFormation (設定管理とオーケストレーション) | AWS

Sinatraアプリを作る

今回はサンプル的に雑にテキストボックスを用意して、POSTリクエストを投げたら、投稿内容が画面に追加されていくようなアプリを作りました。

f:id:kimuraysp:20181211084603g:plain

AWSのサンプルコードでもよかったのですがDynamoDBが使われていたりして、 俺は単純にviewをレンダリングさせて、POSTしてみたいだけなんじゃ!という気持ちになったので新しく作りました。

AWS Lambdaのコードを書く

コードは以下になります。

https://github.com/kimuray/sinatra_lambda_sample/blob/master/lambda.rb

これは完全にAWSサンプルをそのまま持ってきました。
AWS Lambdaを使う際は

def handler(event:, context:)
  # なんらかの処理
end

という形で処理を書いていきます。
AWS LambdaでHello worldしてみるとわかると思います。

コードの内容的には受け取ったリクエストを整形してSinatraに食わせてレスポンスを整形して返却といったことをやっているようです。

CloudFormationを設定する

CloudFormationの設定はtemplate.yamlというファイルに書いています。

https://github.com/kimuray/sinatra_lambda_sample/blob/master/template.yaml

これも大体AWSサンプルと同じです。
唯一違うとしたらDynamoDBを用意する設定を書いていないぐらいです。

設定内容のざっくり説明としては

  • AWS Lambdaを準備
  • AWS Lambdaを叩くためのAPI Gatewayを準備
  • AWS Lambdaへのアクセスポリシーを設定
  • エンドポイントへのURLを設定

といった設定が書いてあります。 template.ymlを設定し終わったらCloudFormationの準備は環境です。

デプロイ

デプロイはAWSのサンプルに書いてある通りawscliのコマンドを叩いていくだけで完了します。

※ 前提としてS3にソースを配置するバケットを作っている必要があるので作っておきましょう。

まずはデプロイをするための設定ファイルを作成します。
以下のコマンドでserverless-output.yamlという名前で作成されます。

aws cloudformation package \
     --template-file template.yaml \
     --output-template-file serverless-output.yaml \
     --s3-bucket { your-bucket-name }

{your-bucket-name}には自分で作ったS3のバケットを設定します。

次に生成された設定を使ってAWS Lambdaにデプロイします。

aws cloudformation deploy --template-file serverless-output.yaml \
     --stack-name { your-stack-name } \
     --capabilities CAPABILITY_IAM

{your-stack-name}は任意の名前になります。

これでデプロイが完了します!

デプロイの完了を見届けたらAWSコンソールにアクセスして、AWS Lambdaに作成したアプリケーションがデプロイされていること確認します。

f:id:kimuraysp:20181213084717p:plain

作成された項目にアクセスするとAPI Gatewayの欄をクリックすると、画面下の方にアプリケーションのエンドポイントが表示されます。

f:id:kimuraysp:20181213084742p:plain

このエンドポイントにアクセスして、自分が作ったSinatraアプリが表示されたら成功です。

最後に

久々のブログだった...
ちゃんとエンジニアになったのでもっとインプット・アウトプットの量を増やさねば...