AWS Toolkit for Visual Studio CodeでLamdbaデバッグができるようになるまで(自分用メモ)

## 前提
 [Installing the AWS SAM CLI on Windows](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-windows.html)

```
	Step 1: Create an AWS Account
	Step 2: Create an IAM User with Administrator Permissions
	Step 3: Install Docker
	Step 4: Install the AWS SAM CLI
```

dockerのインストールはlocalテストのみ
deploy目的のみであれば利用しなくてもよい
(それでも個別にAPIGateway、Lambdaをデプロイしてテストするより楽)

ただし、docker Toolboxを以前利用していた環境(WinHomeでwsl2利用)だとdockerのエラーになりがち
環境変数削除で復帰(docker-machineの更新はなくても可)
対処法参考:
https://www.nuits.jp/entry/docker-could-not-read-ca-certificate

## python用仮想環境を作成
```
conda create -n myenv python=3.8
```

## 手順
 [Tutorial: Deploying a Hello World Application](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html)

```
#Step 1 - Download a sample application
sam init

#Step 2 - Build your application
cd sam-app
sam build

#Step 3 - Deploy your application
sam deploy --guided
```

**Step1. sam init**
テンプレートとなるファイル構成を作成する(ウィザード形式)

```
Which template source would you like to use?
1 - AWS Quick Start Templates

Which runtime would you like to use?
2 - python3.8

Project name [sam-app]: sample-sam

AWS quick start application templates:
1 - Hello World Example

```
nodeで作成する場合、「7 - nodejs10.x」を選択


**Step2. Build your application**
開発したコードおよび依存モジュールを.aws-sam\build以下に収集

```
cd sample-sam
sam build
```

Step3. Deploy your application
3-1. パッケージをS3へ格納
3-2. CloudFormation呼び出し
3-3. AWS CloudFormation stackとして結果出力

```
sam deploy --guided

Stack Name [sam-app]: sample-sam
AWS Region [us-east-1]: ap-northeast-1
Confirm changes before deploy [y/N]: y
Allow SAM CLI IAM role creation [Y/n]: Y
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to samconfig.toml [Y/n]: Y
(略)
Key                 HelloWorldApi
Description         API Gateway endpoint URL for Prod stage for Hello World function
Value               https://<restapiid>.ap-northeast-1.amazonaws.com/Prod/hello/
```

**Step3.5. デプロイの確認**
3-a. 表示されたエンドポイントに対してcurlでリクエスト実行
```
curl https://<restapiid>.execute-api.us-east-1.amazonaws.com/Prod/hello/
{"message": "hello world"}
```
3-b. AWSConsoleで確認(IAM Role,Lambda, API Gateway, CloudFormation, S3)
   Cloud Formation Stackは2つ作成されている(S3、それ以外)
   sam cliによるS3へのパッケージ展開、Cloud Formation呼び出しが2つに分かれる
3-c. 削除するときはFormation Stackの単位で削除するとよい



**Step 4: Testing Your Application Locally (Optional)**

docker環境を利用して評価環境を立ち上げる
コードを更新すると自動的に反映される(start-apiを再び呼び出さなくてもよい)

```
sam local start-api

Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
```

**4.5 確認**
4-a. エンドポイントに対してcurlでリクエスト実行

```
curl http://127.0.0.1:3000/hello/
{"message": "hello world"}
```
4-b. 呼び出し後のコンソール確認

```
[37mGET /hello/ HTTP/1.1[0m" 200 -
```
4-c. docker確認

```
docker image ls
lambci/lambda       python3.8
```
自動で保存される

```
docker container ls
3f10xxxxxxxx lambci/lambda:python3.8 "/var/rapid/init --b…"
```
リクエスト時のみ作成されてすぐ破棄される

4-d. Making One-off Invocations
sam local start-apiを呼び出さなくても起動、リクエスト送付、結果取得まで実施する

```
sam local invoke "HelloWorldFunction" -e events/event.json -d 5858
```

**5. AWS Toolkit for Visual Studio Code**

1. VS CodeにAWS Toolkitをインストール
2. AWS ExplorerからLambda呼び出し(on AWS)できる

5-a. ローカルで実行する場合(その1) 
CodeLensのRun Localy
Debug Localyでデバッグ開始できそうであったが動作未確認

5-b. ローカルで実行されたものにアタッチ
以下をコードに追加

```
import ptvsd
ptvsd.enable_attach(address=('0.0.0.0', 5858), redirect_output=True)
ptvsd.wait_for_attach()
```

debugオプションをつけてstart-api、invokeを起動

```
sam local start-api --debug --debug-port 5858
sam local invoke "HelloWorldFunction" -e events/event.json -d 5858
```

Launch.jsonを以下の通り更新

```
"launch": {
	"version": "0.2.0",
	"configurations": [
		{
			"name": "Attach to SAM CLI",
			"type": "python",
			"request": "attach",
			"host": "localhost",
			"port": 5858,
			"pathMappings": [
			{
			"localRoot": "${workspaceRoot}/hello_world",
			"remoteRoot": "/var/task",
			}
			],
		}
	]
},
```
ブレークポイントを設定、してVSCodeからアタッチ

## その他メモ
* 認証ありのAPI Gateway/Lambdaを扱いたい場合は  
[Controlling Access to API Gateway APIs](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-controlling-access-to-apis.html)


## 参考
* [AWS SAM CLI Config](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html)

* [Controlling Access to API Gateway APIs](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-controlling-access-to-apis.html)

* [「AWS Toolkit for Visual Studio Code」正式版がリリース。AWS Lambdaのステップ実行、ローカルデバッグなど可能](https://www.publickey1.jp/blog/19/aws_toolkit_for_visual_studio_codeaws_lmabda.html)

* [[AWSToolkit for Eclipse]AWS SAM Local を使用してサーバーレスアプリケーションをデバッグする](https://docs.aws.amazon.com/ja_jp/toolkit-for-eclipse/v1/user-guide/tke-sam-local.html)

* [AWS Toolkit for VS Codeユーザーガイド](https://docs.aws.amazon.com/ja_jp/toolkit-for-vscode/latest/userguide/aws-tookit-vscode-ug.pdf)

* [AWS Lambda をローカルでVisual Studio Codeを使ってデバックしてみる。](http://beetreehitsuji.hatenablog.com/entry/2019/03/07/144924)


* [サーバレスアプリケーションをローカルで構築、テスト、デバッグする](https://aws.amazon.com/jp/blogs/news/aws-serverless-application-model-sam-command-line-interface-build-test-and-debug-serverless-apps-locally/)