25
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

トレタAdvent Calendar 2018

Day 2

AWS Lambda で Ruby を使ってみる

Posted at

はじめに

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 を新規作成します。
Screen Shot 2018-12-02 at 12.12.38.png
おぉ。。。確かに Ruby が選択できるようになっています。(※東京リージョンでも利用可。)
ただし、現時点で選択できる Runtime は Ruby 2.5 のみです。

ということで、function を新規作成すると、例によってサンプルコードが載っています。
Screen Shot 2018-12-02 at 12.21.02.png
なので、何も考えずにこれを実行していきます。

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

作成したテストイベントを利用して、実行してみます。
Screen Shot 2018-12-02 at 12.35.54.png

{
  "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 のコンソールからも作成されたことが確認できます。
Screen Shot 2018-12-02 at 15.17.30.png

確認

Overview の Resources にある SinatraAPI をクリックすると、Amazon API Gateway のページに遷移するので、左ペインのDashboardを選択し、URL をコピーします。
Screen Shot 2018-12-02 at 15.30.02.png

ブラウザから URL にアクセスします。
https://XXXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/
Screen Shot 2018-12-02 at 15.28.35.png
わーいわーい。アクセスできました。

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
Screen Shot 2018-12-02 at 15.35.54.png
うん、ちゃんと動いているようですね。

おわりに

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

25
26
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
25
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?