AWS Lambda で Ruby を使ってみる

# はじめに

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

特に Lambda 関連では、 

ALB のバックエンドに Lambda を指定できるようになったり
[Lambda functions as targets for Application Load Balancers | Networking & Content Delivery](https://aws.amazon.com/blogs/networking-and-content-delivery/lambda-functions-as-targets-for-application-load-balancers/)

Lambda Layers で関数ごとにパッケージングする必要がなくなったり
[New for AWS Lambda – Use Any Programming Language and Share Common Components | AWS News Blog](https://aws.amazon.com/jp/blogs/aws/new-for-aws-lambda-use-any-programming-language-and-share-common-components/)

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

その中でも、今回は AWS Lambda が Ruby をサポートしたとのことで、早速触ってみました。
[Announcing Ruby Support for AWS Lambda | AWS Compute Blog](https://aws.amazon.com/blogs/compute/announcing-ruby-support-for-aws-lambda/)

# Hello world

なによりも Hello World ということで、ブログで紹介されている[チュートリアル](https://aws.amazon.com/blogs/compute/announcing-ruby-support-for-aws-lambda/)を実行してみます。
まずは function を新規作成します。
![Screen Shot 2018-12-02 at 12.12.38.png](https://qiita-image-store.s3.amazonaws.com/0/118641/fccff7b3-9b64-ae72-667f-826f0d2fdbde.png)
おぉ。。。確かに Ruby が選択できるようになっています。（※東京リージョンでも利用可。）
ただし、現時点で選択できる Runtime は Ruby 2.5 のみです。

ということで、function を新規作成すると、例によってサンプルコードが載っています。
![Screen Shot 2018-12-02 at 12.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/118641/15670f8a-93bd-c476-353b-c955a8702de1.png)
なので、何も考えずにこれを実行していきます。 

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

作成したテストイベントを利用して、実行してみます。
![Screen Shot 2018-12-02 at 12.35.54.png](https://qiita-image-store.s3.amazonaws.com/0/118641/23a9e620-7d44-16a4-43d7-05aa89bc1dd3.png)

```
{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\""
}
```
と表示され、うまく実行できたようですね。

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

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

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

### 事前準備

[AWS SAM](https://aws.amazon.com/serverless/sam/) を利用するので予めインストールしておく必要があります。
pip を利用すれば、コマンド一つで導入できます。

```bash
> pip install aws-sam-cli
```

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

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

### サンプルアプリを Clone 

次にブログで紹介されている[サンプルコード](https://github.com/aws-samples/serverless-sinatra-sample)を Local に Clone します。

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

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

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

### パッケージング

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

```bash
> 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にアップロードされていることも確認できますね。

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

### デプロイ

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

```bash
> 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](https://qiita-image-store.s3.amazonaws.com/0/118641/94413ef2-30e6-3323-3a5c-b59cace3502f.png)

### 確認

Overview の Resources にある `SinatraAPI` をクリックすると、Amazon API Gateway のページに遷移するので、左ペインのDashboardを選択し、URL をコピーします。
![Screen Shot 2018-12-02 at 15.30.02.png](https://qiita-image-store.s3.amazonaws.com/0/118641/948b4e95-31ba-f8b5-264c-b12a433e7f30.png)

ブラウザから URL にアクセスします。
https://XXXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/
![Screen Shot 2018-12-02 at 15.28.35.png](https://qiita-image-store.s3.amazonaws.com/0/118641/033be1a2-5b62-98de-00be-06591cf7029e.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](https://qiita-image-store.s3.amazonaws.com/0/118641/b44e12ae-8519-d3fc-600e-d853c352b688.png)
うん、ちゃんと動いているようですね。

# おわりに

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