AWS Toolkitの使用例（AWS Lambdaのリモート実行）

# AWS が提供するAWS Toolkitを使い AWS Lambda Python を実行してみる
- この記事でやることは、
    - VSCodeを使いAWS Lambda の hello-lambdaをローカルから実行する（ローカルからリモート実行）
    - VSCode上でソース編集してAWSクラウドにアップロードする（Lambda関数をデプロイする）
    - `sam local invoke` 等の sam コマンドは利用しない
- 簡単なLambda作って、EC2インスタンス再起動する、CloudWatchLogsからlambda実行、みたいなインフラスクリプト相当を手軽に実行するくらいの用途です
- API Gateway等で実行するLambdaは`serverless framework`や`sam`や`cdk`を使う方が良いです
- 間違って別のLambdaを編集してしまうこともあったり、消してしまうこともあるので開発用です。ソースはGit等で管理しておきましょう。
- JetBrainsのPyCharmやWebSotrmでLamdba関数作成で利用したことはあったけど、VSCodeで使うのは始めてなので勝手が違う

## 前提
- VSCodeはローカルにインストールしていること
- Dockerコンテナを使います、リモートコンテナでPython3.8と、そのコンテナ内でVSCodeを使う
- AWS ToolkitのインストールはAWSのドキュメントを見るとわかります（後述）

## Python実行用のリモートコンテナ
- よもやま話、Mac・Jetbrains使わなくなり、WindowsメインになってからはVSCode＋Remote Containerで開発環境を作成するようになりリモートコンテナばかりどんどん増えていきます。Python3.9 使おうかと作成したんだけど、AWS Lambdaで対応しているバージョンは Python3.8 だった


- リモートコンテナ用の Dockerfile,devcontainer.json を GitHubのgistに置いています。
https://gist.github.com/ssugimoto/132e0785212be58b0c0a6b4b7b42bc91
- VSCodeで2つのファイルがあるディレクトリの１つ上の階層を開く、下記でいう`lambda-python`のディレクトリを開く

```
lambda-python
│
├─.devcontainer
│      devcontainer.json
│      Dockerfile
│
├─aws
│      config
│      credentials
│
└─ssh
        config
        known_hosts
```
- VSCodeからフォルダ `lambda-python` を開いた後に、さらに `ReOpen in Container` で開くとコンテナのビルドが始まる
- ビルド後のバージョン確認（aws cliとコンテナ内のPythonのバージョンはマイナーバージョンが違うが、このまますすめる）

```
root ➜ /workspaces $ aws --version
aws-cli/2.2.27 Python/3.8.8 Linux/5.4.72-microsoft-standard-WSL2 exe/x86_64.debian.10 prompt/off
root ➜ /workspaces $ python --version
Python 3.8.11

```


## AWS ToolkitをVSCodeで使えるようにする
https://docs.aws.amazon.com/ja_jp/toolkit-for-vscode/latest/userguide/welcome.html
（日本語のページです、私自身の場合はいつも英語のページが出てきて日本語ページ出てこない、日本語ページは訳がおかしかったりする）

- ドキュメントの通りにすすめ　以下をやる
    - 前提として、VScodeは先に記載のPython3.8用のリモートコンテナに接続して使います。aws toolkitはリモートコンテナごとにinstallとなるため、ローカル環境のVSCodeでaws toolkitが入っていてもそれは使われない。
    - AWS toolkitインストール
    - toolkitが使用するAWSへの接続情報（クレデンシャルなど）を設定、IAMユーザーによる接続、AWS SSOによる接続、
    - toolkitを使ってAWSへ接続、接続するリージョンの変更
    - toolkitの簡単な説明（AWS Explorer/ AWS CDK Explorer / Visual Studio Code コマンドパレット

## AWSマネジメントコンソールでLambda関数を作成する
- いきなりローカル環境でのLambdaはちょっと、ということで、GUIで手軽にできるマネジメントコンソールを使う

- hello-lambdaの参考
    https://aws.amazon.com/jp/getting-started/hands-on/run-serverless-code/


1. AWSマネジメントコンソールに接続し、サービスからLambdaを選択する
1. 「関数の作成」ボタンを押す
1. 関数を定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/b6044f57-481a-74f6-a2b5-381e1c78454a.png)
    - 選び、入力した内容の例
     
    ```
    sugimoto-hello-lambda-python
    Python3.8
    基本的な Lambda アクセス権限で新しいロールを作成
    ```

1. Lambda functionができました
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/ddd2f581-a979-e671-c54b-4ffc9f8812f0.png)



1. テストをしてみます
オレンジ色のTestボタンを押して、イベントテンプレート「hello-world」、イベント名は何らか入力して、他はデフォルトのまま、「作成」ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/e045b7c8-8f7b-3282-d15d-0d50911c3da1.png)

1. Testを押すと、先に設定したイベントが表示されるので選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/55e88fdc-f0d1-0a8e-c22e-648452b8ab79.png)

1. 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/c62e4b7a-cb9b-b39d-83eb-a2aff5d7a5a4.png)

## AWS toolkitで作成したLambdaを表示する

1. VSCodeの 左サイドバーのAWSを選択 , EXplorer ->Lambdaを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/b2598bbf-df38-471a-72e1-660de6f53896.png)

1. 先にAWSマネジメントコンソールで作成したLambda関数の「sugimoto-hello-lambda-python」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/bc801fec-9a8a-b976-90d5-220ff4738a7d.png)

1. クリックして、「Download」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/24a02a1e-4ab3-2138-6191-dfe947780fdf.png)

1. 保存場所で `/workspaces` を選ぶと、その直下に関数一式がダウンロードされる
    
    ```
    root ➜ /workspaces $ ls -la
    total 24
    drwxr-xr-x 1 root root 4096 Aug  8 12:44 .
    drwxr-xr-x 1 root root 4096 Aug  6 07:04 ..
    drwxr-xr-x 5 root root 4096 Aug  8 11:46 .venv.
    drwxr-xr-x 2 root root 4096 Aug  8 12:44 .vscode
    drwxr-xr-x 2 root root 4096 Aug  8 12:44 sugimoto-hello-lambda-python
    ```
    - VSCodeでファイルを開くと
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/f7e57847-e83a-2605-e567-fd8e63e94650.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/ff21dec3-d2cc-cd4d-de22-29e6fedaf962.png)

    ```
    {
        "configurations": [
            {
                "type": "aws-sam",
                "request": "direct-invoke",
                "name": "sugimoto-hello-lambda-python:lambda_function.lambda_handler (python3.8)",
                "invokeTarget": {
                    "target": "code",
                    "projectRoot": "${workspaceFolder}/sugimoto-hello-lambda-python",
                    "lambdaHandler": "lambda_function.lambda_handler"
                },
                "lambda": {
                    "runtime": "python3.8",
                    "payload": {},
                    "environmentVariables": {}
                }
            }
        ]
    }
    ```

## ローカルからLambdaを実行する

1. AWS Explorerで、「invoke on AWS」を選択し、「Or, use a sample request payload from a template 」で「Hello World」を選び、「invoke」ボタンを押す  

    ![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/44a2e5c3-7012-d225-0d74-17b88ded65d5.png)
    - コンソールログに実行結果が表示される

## ローカルで編集したソースをアップロード
1. VSCodeでソースを変更

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/9a7f63af-b7de-834c-8a12-43d9ec080ae4.png)

    `Hello from Lambda! mod local machine` に変更
- AWS Explorerで変更するLambdaを選び、「Uplodad Lambda」を押す
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/44d8b8f7-0f9a-6e48-39a4-0a7646b6698e.png)
- アップロードするソースのあるディレクトリを選択する、zipではない
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/07a3acd9-1dc4-1c59-5f9f-0f1b2deaf5e8.png)
- zipではなく、directoryを使う（Yesを選択）
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/81b39345-5c1d-f5cb-c400-c8af410b703d.png)
- 「This will immediately publish the selected code as the$LATEST bersion of Lambda:....」にてYes を選択 Latestのバージョンでアップロード
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/7ab44f6e-62c4-bad3-624c-7141ab3dcc48.png)
- yesを選んだ後
    ![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/978238d5-af9f-25e2-5048-74ee5a632cb9.png)
- クラウド側にアップロードされ、Lambda関数が更新される
    ![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/2d349144-781d-9a6b-ea4e-009f6d9f4aba.png)
    ![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/e6729a97-47a0-32f6-da09-99d81566bbfd.png)