Windows環境でゼロからRuby + Lambda + API GatewayでAPI作って公開するまでの記事

# 概要
この記事では、Windows環境でゼロからRubyの開発環境を作って、ローカルで作成したコードをLambdaにアップし、API Gatewayを通して公開するまでの手順を記載します。


# 対象
・細かいことは良いから、とりあえずRubyでAPI作ってWeb公開したい人
・Lambdaとやらを使ってとりあえず何か動くものを作りたいが、何から初めて良いか分からない人

# 環境
- windows10
- Ruby 2.7

# 目次
- 開発環境を作る
- Lambda関数を作る
- ローカルのコードをLambdaにデプロイする
- API GatewayでWeb公開する

# 開発環境を作る
まずはRubyの開発環境を作ります。

### Rubyのインストール
以下からRubyをインストールします。
■Ruby
https://rubyinstaller.org/downloads/

RubyはRuby+Devkitのver 2.7をDLして下さい
ver 2.7なのは、Lambda上で動くRubyが2.7なので環境を合わせるためです。
+Devkit版なのは、VSCodeでRubyのデバッグをするために、Devkitが必要になるためです。

インストール後、コマンドプロンプトを開き
`ruby -v`と入力してrubyのバージョンが表示されれば成功です。

### VSCodeのインストール
以下からVSCodeをインストールします。
■VSCode
https://code.visualstudio.com/download

### VSCodeの拡張機能をインストール
VSCodeの拡張機能から、RubyとVSCode Rubyを入れます。
これを入れることでRubyの入力サポートをしてくれます。

- VSCodeを開いてCmd + Shift + Xを押す
- 表示された検索窓にrubyと入力し、表示された拡張機能 Rubyのインストールボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/4f099353-904c-f13a-a0c2-22f2af5f4be5.png)

■Ruby & VSCode Ruby
https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby

### VSCodeの設定
拡張機能をインストールしたら最低限の設定として
・language serverの有効化
・デバッグ機能の有効化
を行います。

#### language serverの有効化
language serverとは、マイクロソフトが提唱している言語入力サポートのプロトコルだそうです。
https://github.com/rubyide/vscode-ruby/blob/main/docs/language-server.md

色々とリッチな入力サポートをしてくれるので、有効化しておきましょう
拡張機能Rubyのドキュメントでも有効化が推奨されています。
- VSCodeを開いて`Cmd + Shift + X`を押し、コマンドパレットを開く
- settings jsonと入力し、表示された「基本設定： 設定(JSON)を開く」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/12e0e374-adf5-81b6-2a9d-952c09169668.png)
- settings.jsonが開くので`"ruby.useLanguageServer": true`を追加
![スクリーンショット 2022-05-12 085420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/0515a833-061b-9f6a-ee45-6396f450a8d5.png)

#### デバッグ機能の有効化
VSCode上でRubyのデバッグができるようにします。

こちらは先人の記事を参照
https://qiita.com/momoandbanana22/items/60682935ea8b01b30aec

# lambda関数を作る
AWSコンソール上でLambda関数を作ります。
実際のコードは後でローカルからデプロイするので、デプロイ先の箱だけ作っておくイメージです。

- Lambdaのコンソールを開き、「関数の作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/3a98748d-95d6-032f-c9df-c92d88eb8fa7.png)
- 作成する関数の設定画面に移るので関数名とランタイムを入力して、それ以外は変更せずに「関数の作成」を押します。
  - 今回は、関数名はtest_function、ランタイムはRuby 2.7を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/7b4f4e59-0dc9-1058-0dab-2b293d566e98.png)
- 以下ような画面が出れば関数作成は成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/fe79e65a-717f-de07-0d6e-7f47da0357c6.png)

# ローカルのコードをLambdaにデプロイする

### Lambdaにデプロイするコードの作成
VSCodeで以下コードを記述し、lambda_function.rbとして保存して下さい
※　Lambda関数作成時のデフォルトコードのレスポンス文字列を修正しただけのコードです。
```
require 'json'

def lambda_handler(event:, context:)
    { statusCode: 200, body: JSON.generate('Deploy Success!') }
end
```

### AWS CLIを使ってLambdaにデプロイする
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/ruby-package.html)の通りに、AWS CLIを使って作成したコードを先程作ったLambdaにデプロイします。


- 以下からAWS CLIをインストールして下さい
https://aws.amazon.com/jp/cli/
- インストールができたら、以下に従ってCLIのセットアップを行います。
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html
- セットアップができたら、以下コマンドで先程作ったlambda_function.rbがlambdaにデプロイできます。
```
# lambda_function.rbのzipを作成します。（zipにできれば手法は何でも良いです）
zip lambda_function.zip lambda_function.rb

# update-function-codeを使ってzipをlambdaにデプロイします。
# test_functionの部分は自身が作成したLambda関数名に置き換えてください
aws lambda update-function-code --function-name test_function --zip-file fileb://lambda_function.zip
```

- Lambdaのコンソールを開き、コードの内容がlambda_function.rbのものに置き換わっていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/70c08bc6-6ec6-80a2-8210-c1369a94e7af.png)


# API GatewayでWeb公開する
作成したコードをAPI Gatewayを使ってWeb公開します。

- API Gatewayのコンソールを開き、作成するAPIタイプに「REST API」を選択し「構築」を押す
 ![スクリーンショット 2022-05-12 102806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/6ea93499-4ddd-2775-2845-8e906fe47e52.png)
- 以下設定でAPIを作成する
  -  ”プロトコルを選択する”、は"REST”
  -  "新しい API の作成"は、"新しいAPI"
  -  "名前と説明"は、任意のAPI名を入力して、エンドポイントタイプはリージョンにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/0c3c3a95-6485-ad15-9e0e-5afc92673d08.png)
- リソースの設定画面に移るので"アクション"プルダウンから「メソッドの作成 > ANY」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/c8942d6b-f07e-97a2-b51b-a2ecc9fdbc53.png)
- APIのバックエンドに何を設定するか聞かれるので、”Lambda 関数”に作成したLambda関数名(今回はtest_function)を入力し、保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/3114ea6b-cfd9-bda9-0f42-01c45433e0a3.png)
- "アクションプル"ダウンから「APIのデプロイ」を選択する
- デプロイされるステージを聞かれるので以下設定でデプロイする
  - "デプロイされるステージ"に"新しいステージ"
  - "ステージ名"に任意の名前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/da01bec4-f8ec-8941-7948-7f31670c7ff8.png)
- 作成したステージの画面に遷移するので「URLの呼び出し」に記載されているURLにアクセスする
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/59207707-b29a-d9f0-19ff-227f5921a8b2.png)
- lambda_function.rbに記載していたレスポンスが返ってきていれば、web公開成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/3fc81249-dc2a-b746-2925-308ffedc5e74.png)

# 補足
ちゃんとしたlambdaの開発環境を作りたい場合、VScodeではAWS Toolkitという開発ツールが提供されているので
そちらを使うとローカルでlambdaの環境を再現したデバッグを行うことができます。
ただしrubyは対応していません

https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/serverless-apps.html