sam-beta-cdkのlambdaのローカル実行をWindows10+Vagrant+VirtualBox+Ubuntuで試してみたメモ

## 概要
aws cdkでデプロイする前に、lambdaのローカル実行を試したい。
cdk synthでsamテンプレートを出して実行する方法もある([前の記事](https://qiita.com/hibohiboo/items/fa76084a207e5a3d5955))が、もっと楽にできないかと探したところ、sam-cdkのベータ版で行えるようであった。

[Better together: AWS SAM and AWS CDK](https://qiita.com/drafts/942cd4192523d82faf0f/edit)
[AWS Cloud Development Kit (CDK) (Preview)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-cdk.html)

基本的にはこれをなぞる。



## 環境

- Windows 10 Home 21H1 19043.1151
- Vagrant 2.2.18
- Virtualbox 6.1.26 r145957
- ubuntu/focal64     (virtualbox, 20210720.0.1)
- docker 20.10.7
- sam-beta-cdk 1.22.0
- Node.js v14.17.4
- aws-cdk 1.116.0


## Vagrantの準備
- dockerおよびsam-beta-cdkのインストールはansibleを使って行っている。
  - [ソースコード - vagrantfile](https://github.com/hibohiboo/develop/tree/fff0ff978342614b3cacd92f131ddcc429647082/Vagrantfile)
  - [ソースコード - ansible](https://github.com/hibohiboo/develop/tree/fff0ff978342614b3cacd92f131ddcc429647082/provision/playbooks)
  - [sam-beta-cdk - getting started](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-cdk-getting-started.html)と[Installing the AWS SAM CLI on Linux](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-linux.html)を主に参照
    - dockerがstartしていない旨のエラーが出たが、原因は不明。`vagrant destroy -f` -> `vagrant up`で直った

## VsCodeでVagrant内へと接続
ファイル共有でエラーが出たため、ここからの作業は仮想環境内で行う。
[【設定爆速】VS CodeのRemote Developmentを使ってSSH接続したEC2上のファイルを編集する](https://dev.classmethod.jp/articles/vs-code-remote-development-ec2/)を参考に、VsCodeのリモート機能を利用した。

### プロジェクトの準備
※ Windowsと共有していないフォルダ内で作業すること。
まずは、テンプレートのプロジェクトをダウンロードする。([*](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html))

```
cd /home/vagrant/src/
export SAM_CLI_TELEMETRY=0
sam-beta-cdk init --project-type CDK --package-type Zip --runtime nodejs14.x  --app-template hello-world --cdk-language typescript --name test
cd sam-cdk-app-demo
code .
```

initが成功すると以下のように表示される。

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

    -----------------------
    Generating application:
    -----------------------
    Name: test
    Runtime: nodejs14.x
    Dependency Manager: npm
    Application Template: hello-world
    Output Directory: .
    Project Type: CDK 
    CDK application language: typescript
```
1度のinitではうまくいかず、2度目に同じinitコマンドをうったらうまくいった例もあった。まだ不安定？


### aws-cdkのインストール
aws-cdkはバージョンアップが早いため、ncuで更新しておく。

```
npm i -D npm-check-updates
npx ncu -u
npm i
```

### invokeで動作確認
まずはlambda単体で動作確認。

```
sam-beta-cdk local invoke sam-cdk-app-demo/hello-world-lambda-function
```
Dockerが動いてhello worldが表示されたら成功。

```
Synthesizing CDK App[$(__git_ps1):~/src/sam-cdk-app-demo$ sam-beta-cdk local invoke sam-cdk-app-demo/hello-world-lambda-function 
Invoking app.lambdaHandler (nodejs14.x)
Image was not found.
Building image.......................................................................................................................................................................................................................................................................................
Skip pulling image and use local one: amazon/aws-sam-cli-emulation-image-nodejs14.x:rapid-1.22.0.dev202107140310.

Mounting /home/vagrant/src/sam-cdk-app-demo/hello-world as /var/task:ro,delegated inside runtime container
END RequestId: dea11ccb-dbf4-4e3b-a664-d8da3ef3a907
REPORT RequestId: dea11ccb-dbf4-4e3b-a664-d8da3ef3a907  Init Duration: 0.75 ms  Duration: 202.74 ms     Billed Duration: 300 ms Memory Size: 128 MB   Max Memory Used: 128 MB
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}
```

### api で確認

```
sam-beta-cdk local start-api --host 0.0.0.0
```

Vagrantfileで今回は192.168.50.10で仮想環境を立ち上げているので、
http://192.168.50.10:3000/hello にアクセスする。
`{"message":"hello world"}`と帰ってきたら成功。


## ファイル共有でnpm installのエラー
VagrantとWindowsのファイル共有でnpm installを行うと、以下のようなエラーが発生。

```
 Maximum call stack size exceeded
```

```
 ERR! EPROTO: protocol error, symlink '../jsesc/bin/jsesc' -> '/vagrant/project/sam-cdk-app-demo/node_modules/.bin/jsesc'
```

`npm rebuild`や`npm i no-bin-links`も試したがダメだったのであきらめた。