AWS Lambda で Ruby を使ってみる


はじめに

2018年の AWS re:Invent では多くの新機能が発表されていましたね。

特に Lambda 関連では、

ALB のバックエンドに Lambda を指定できるようになったり
Lambda functions as targets for Application Load Balancers | Networking & Content Delivery

Lambda Layers で関数ごとにパッケージングする必要がなくなったり
New for AWS Lambda – Use Any Programming Language and Share Common Components | AWS News Blog

と、いろいろ興味深い発表がありました。

その中でも、今回は AWS Lambda が Ruby をサポートしたとのことで、早速触ってみました。
Announcing Ruby Support for AWS Lambda | AWS Compute Blog

Hello world

なによりも Hello World ということで、ブログで紹介されているチュートリアルを実行してみます。
まずは function を新規作成します。

おぉ。。。確かに Ruby が選択できるようになっています。(※東京リージョンでも利用可。)
ただし、現時点で選択できる Runtime は Ruby 2.5 のみです。

ということで、function を新規作成すると、例によってサンプルコードが載っています。

なので、何も考えずにこれを実行していきます。

Test ボタンをクリックするとウィンドウが立ち上がるので、Envent Name に適当に名前を入力します。それ以外は変更せず、Create をクリックしてテストを作成します。

作成したテストイベントを利用して、実行してみます。

{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\""
}

と表示され、うまく実行できたようですね。

Web アプリケーションのデプロイ

さすがに、Hello World だけでは物足りないので、チュートリアルにある Sinatra を利用した
Webアプリケーションをデプロイするところまでやってみたいと思います。
GitHub - Demo code for running Ruby Sinatra on AWS Lambda

ちなみに、サンプルは Lambda だけでなく、API Gateway と DynamoDB も利用します。
(これぞ、サーバーレス。。。)

事前準備

AWS SAM を利用するので予めインストールしておく必要があります。
pip を利用すれば、コマンド一つで導入できます。

> pip install aws-sam-cli

また、アプリケーションを配置するため、S3 にバケットを作成しておきます。
今回はバケット名を sample-sinatra-application としています。

> aws s3 mb s3://sample-sinatra-application

サンプルアプリを Clone

次にブログで紹介されているサンプルコードを Local に Clone します。

> git clone https://github.com/aws-samples/serverless-sinatra-sample

bundler を使って、依存するパッケージをインストールします。

> cd serverless-sinatra-sample
> bundle install --deployment

パッケージング

次のコマンドでパッケージングおよび、先程作成した、S3 バケット名を指定してアプリケーションをアップロードします。

> sam package --template-file template.yaml \
 --output-template-file packaged-template.yaml \
 --s3-bucket sample-sinatra-application

実行して少し待つと、、、

Uploading to XXXXXXXXXXXXXXXXXXXX  64727 / 64727.0  (100.00%)
Successfully packaged artifacts and wrote output template to file packaged-template.yaml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /path/to/serverless-sinatra-sample/packaged-template.yaml --stack-name <YOUR STACK NAME>

Successfully ~~~ と出れば成功です。

S3にアップロードされていることも確認できますね。

> aws s3 ls s3://sample-sinatra-application
2018-12-02 14:17:40    3557087 XXXXXXXXXXXXXXXXXXXX

デプロイ

最後にアプリケーションをデプロイします。

> sam deploy --template-file packaged-template.yaml \
 --stack-name LambdaSinatra \
 --capabilities CAPABILITY_IAM

実行して少し待つと、、、

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - LambdaSinatra

Successfully ~~~ と出れば成功です。

AWS のコンソールからも作成されたことが確認できます。

確認

Overview の Resources にある SinatraAPI をクリックすると、Amazon API Gateway のページに遷移するので、左ペインのDashboardを選択し、URL をコピーします。

ブラウザから URL にアクセスします。
https://XXXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/

わーいわーい。アクセスできました。

API のサンプル:
https://XXXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/hello-world

{"Output":"Hello World!"}

FeedBackページ:
https://XXXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/feedback

うん、ちゃんと動いているようですね。

おわりに

ということで、Ruby on AWS Lambda の紹介でした。
これを機に Lambda 経由で Ruby アプリをどんどん世に出していくことにしよう、そうしよう。