はじめに
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 ~~~
と出れば成功です。
確認
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 アプリをどんどん世に出していくことにしよう、そうしよう。