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
言わずと知れたサーバーレスのコード実行サービスです。
サーバーを管理する必要がなくなるのでサーバーの準備や運用を考えなくてよくなります。
Sinatra
Ruby製のシンプルにWebアプリケーションが作れるフレームワークです。
Railsほど機能はいらんけど、ルーティングあたりの機能は欲しいなどの要望に応えてくれます。
AWS CloudFormation
AWSでのインフラ構築を自動化してくれるサービスです。
一度設定してしまえばそれに従って同一環境を何度でも簡単に作れるようになります。
今回はCloudFormationが主役になります。
AWS CloudFormation (設定管理とオーケストレーション) | AWS
Sinatraアプリを作る
今回はサンプル的に雑にテキストボックスを用意して、POSTリクエストを投げたら、投稿内容が画面に追加されていくようなアプリを作りました。
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を用意する設定を書いていないぐらいです。
設定内容のざっくり説明としては
といった設定が書いてあります。 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に作成したアプリケーションがデプロイされていること確認します。
作成された項目にアクセスするとAPI Gatewayの欄をクリックすると、画面下の方にアプリケーションのエンドポイントが表示されます。
このエンドポイントにアクセスして、自分が作ったSinatraアプリが表示されたら成功です。
最後に
久々のブログだった...
ちゃんとエンジニアになったのでもっとインプット・アウトプットの量を増やさねば...