挑戦！ AWS Lambda ～SAM を用いた環境構築編～

# はじめに

AWS Lambda は1年前おうちで使うツール作りに Ruby で実装したことがあり、
AWS SAM もその時に触っていた可能性はあるものの記憶に残ってない。。。

せっかくなので再入門しようと思ったのがこの投稿のきっかけです
そしてせっかくついでに、Bolt + Lambda + node.js で何かしら Slack アプリを作れたら勉強になるのでは？と思ったので色々実験しながらまとめていこうと思っています💪

今回はローカル開発環境も構築できる AWS SAM を用いた開発環境の構築を行っていきたいと思います
内容自体誤りがあればご指摘いただければと思います:bow: 

# 実施環境

* Windows 10
* nodist
    * 0.9.1 
* node 
    * v12.18.2
* AWS SAM CLI
    * SAM CLI, version 0.53.0
* python
    * 3.8
* docker for windows
    * 2.3.0.3

# 実施した内容

## 各ソフトウェアのインストール

[AWS Lambda ランタイム](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html) を見ると Node.js は12系を用いているので Node の最新 ver は14系だけど12を使用しています
※ windows 10 には python がデフォルトで 3.7 がインストールされているので本来であれば 3.8 をインストールする必要はないけれど、とあるエラーの原因がぱっとわからずつい3.7 -> 3.8をインストールしてしまった(後記)

python がインストールされているか確認するときは以下のコマンドを実行する

```powershell
pip -V
```

[AWS SAM CLI のインストール](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-windows.html)
こちらのステップ１～ステップ４まで実行すると Docker と AWS SAM CLI がインストール出来ていると思います

## SAM サンプルプロジェクトの作成

今回は試しに Hellow World まで実施予定で作業を進める

```powershell
C:\work>sam init --runtime nodejs12.x
Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1

Project name [sam-app]:sam-example

Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git

AWS quick start application templates:
        1 - Hello World Example
        2 - Step Functions Sample App (Stock Trader)
        3 - Quick Start: From Scratch
        4 - Quick Start: Scheduled Events
        5 - Quick Start: S3
        6 - Quick Start: SNS
        7 - Quick Start: SQS
        8 - Quick Start: Web Backend
Template selection:
Template selection: 1

-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: nodejs12.x
Dependency Manager: npm
Application Template: hello-world
Output Directory: .

Next steps can be found in the README file at ./sam-example/README.md
```
sam-example のディレクトリの中に Hellow World を出してくれる js ファイルが作成されました！

## 実行

README を読むと API として使いたい？だったら以下のコマンド叩いてね！

```powershell
sam local start-api
```

と書かれていたのでとりあえず実行

```powershell
Traceback (most recent call last):
  File "D:\obj\windows-release\37amd64_Release\msi_python\zip_amd64\runpy.py", line 193, in _run_module_as_main
  File "D:\obj\windows-release\37amd64_Release\msi_python\zip_amd64\runpy.py", line 85, in _run_code

(中略)

  File "C:\Program Files\Amazon\AWSSAMCLI\runtime\lib\site-packages\docker\transport\npipesocket.py", line 59, in connect
    0
pywintypes.error: (2, 'CreateFile', '指定されたファイルが見つかりません。')
```

python に問題があるのか！？って思って入れなおしたが改善せず、よくよくエラーを読むと Docker 云々のエラー:sweat:
いや最初から [SAM CLI をインストールする](https://aws.amazon.com/jp/serverless/sam/) に書かれていたのでよく読めよっていう話ですね:bow:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/a89220ea-fd1d-10b8-1d89-197ae66fc6bb.png)

Docker はインストールしていたけれど、API として実行する場合は、start-api を実行する前に Docker を立ち上げておかなければならないようです
Docker を起動したら気を取り直して、Docker を立ち上げたら再度 start-api を実施してみましょう

```powershell
C:\work\sam-example> sam local start-api
Error: Running AWS SAM projects locally requires Docker. Have you got it installed?
```

:neutral_face: < oh...
ローカル環境で動かしたいって言ってるけど、 Docker ねーよ！って怒られました

```powershell
npm install
```
ここら辺はよくわかりませんが、node の初期化してなかったよなーと思ったので上記コマンドを実行しました
すると Docker Image を Featch したりしていたので誤った選択肢ではない模様🤔
終わったら改めて、start-api を実行すると以下のようになりました

[あなたがnpm installをしてはいけない時](https://blog.minimalcorp.com/users/jigen/posts/6f325dc9b8a00370b6aedf47a34cb3ce)
ここを見る限りは `npm install` ではなく `npm ci` のほうがいいのかな？

```powershell
PS C:\work\sam-example> sam local start-api
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
2020-07-19 14:09:01  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
```

http://127.0.0.1:3000/hello にアクセスして以下のように表示されればプロジェクトの作成に成功したといってもよいでしょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/7f67d57b-eacf-b996-7386-9fae5f32f4b6.png)

# さいごに

Docker の起動し忘れと、node の初期化処理にハマってしまいました

プロジェクトは作れるようになったので、次回は Bolt を組み合わせて Slack に通知するようなものを作ってみたいと思いました