Serverless Consoleを使ってVSCodeでのAWSサーバーレス開発を加速させる🚀

# Serverless Consoleとは
Serverless ConsoleというAWSでのサーバーレス開発にうってつけなVS Code拡張機能を見つけたのでご紹介。

https://marketplace.visualstudio.com/items?itemName=devAdvice.serverlessconsole

# 準備
適当なServelessアプリを作ります。

```bash
$ serverless -v
Framework Core: 2.70.0
Plugin: 5.5.2
SDK: 4.3.0
Components: 3.18.1
$ serverless create --template aws-python3 --name MyServerlessApp --path MyServerlessApp
```

```python:handler.py
import json
import boto3
import logging
from decimal import Decimal

logger = logging.getLogger()
logger.setLevel(logging.INFO)

dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("MyServerlessApp")

def decimal_default_proc(obj):
    if isinstance(obj, Decimal):
        return float(obj)
    raise TypeError


def hello(event, context):

    res = table.scan()
    items = res.get("Items")

    logger.info(items)

    response = {
        "statusCode": 200,
        "body": json.dumps(items, indent=2, default=decimal_default_proc)
    }

    return response

```

```yaml:serverless.yml
service: MyServerlessApp

frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  stage: api
  region: ap-northeast-1
  iam:
    role:
      statements:
        - Effect: "Allow"
          Action:
            - dynamodb:Scan
          Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/MyServerlessApp"

resources:
  Resources:
    DynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        TableName: MyServerlessApp
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

functions:
  hello:
    handler: handler.hello
    timeout: 29
    events:
      - http:
          path: /hello
          method: get
          integration: lambda_proxy
```

```bash
$ serverless deploy
～中略～
....................................
Serverless: Stack update finished...
Service Information
service: MyServerlessApp
stage: api
region: ap-northeast-1
stack: MyServerlessApp-api
resources: 12
api keys:
  None
endpoints:
  GET - https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/hello
functions:
  hello: MyServerlessApp-api-hello
layers:
  None

$ curl https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/hello
[]

$ aws dynamodb put-item --table-name MyServerlessApp --item '{"id":{"S":"001"}, "name":{"S":"foo"}, "list":{"L":[{"S":"foo"}, {"S":"bar"}]}}'
$ aws dynamodb put-item --table-name MyServerlessApp --item '{"id":{"S":"002"}, "name":{"S":"bar"}, "map":{"M":{"foo":{"N":"1"}, "bar":{"N":"2"}}}}'

$ curl https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/hello
[
  {
    "id": "001",
    "name": "foo",
    "list": [
      "foo",
      "bar"
    ]
  },
  {
    "map": {
      "bar": 2.0,
      "foo": 1.0
    },
    "id": "002",
    "name": "bar"
  }
]
```

# Serverless Console

Serverless Consoleには大きく２つの機能があり、CloudWatch Logsを確認する機能とDynamoDBテーブルのデータを検索/追加/確認/編集/削除する機能です。

拡張機能をインストールしたら雷アイコンがサイドバーにできるのでそこから利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/a1dcdf31-8b67-c010-cd2a-91305233fc53.png)

## Logs

LogsとなっていますがCloudWatch Logs以外にLambdaやDynamoDBもここから追加できます。

`serverless.yml` から接続定義を作るやり方。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/2608b099-0e3f-dfa9-9243-4f9af89434ed.png)

CloudFormationスタックから接続定義を作るやり方。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/fb143dfb-0f13-b340-72c0-bd82db04f034.png)

マニュアルでロググループを選択して接続定義を作るやり方の三種類あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/a54f5e63-95e2-dbc1-4f1a-34454bfb1b01.png)

接続定義を作成すればこのようにCloudWatch Logの参照/検索がVSCode上で行えるようになります。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/a224dbc9-f111-685c-3e1c-87103d360458.png)

接続定義は`.vscode/settings.json`に書かれるので、AWSプロファイルを取り決めておけばプロジェクトでシェアすることも可能です。

```json:settings.json
{
    "serverlessConsole.services": [
        {
            "type": "custom",
            "title": "MyServerlessApp",
            "timeOffsetInMs": 0,
            "awsProfile": "default",
            "items": [
                {
                    "title": "/aws/lambda/MyServerlessApp-api-hello",
                    "tabs": [
                        {
                            "region": "ap-northeast-1",
                            "title": "dev",
                            "logs": "/aws/lambda/MyServerlessApp-api-hello"
                        }
                    ]
                }
            ]
        }
    ]
}
```

## DynamoDB

続いてDynamoDBですが、こちらも同じようにプロファイルとリージョンを選んで接続定義を作るだけです。
エンドポイントは任意のURLを指定できるので[DynamoDB Local](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.html)を使った開発にも対応できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/06c0d045-3ab7-1bff-4cb0-ee8bed42654a.png)

接続定義を作るとこのようにVSCode上でテーブルの項目が参照できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/fce497b4-f654-ea62-a917-bd18506ab68e.png)

こちらも同じように接続定義が`.vscode/settings.json`に書かれます。

```json:settings.json
{
    "serverlessConsole.services": [
        {
            "type": "dynamodb",
            "title": "MyServerlessApp",
            "tableName": "MyServerlessApp",
            "awsProfile": "default",
            "region": "ap-northeast-1"
        }
    ]
}
```

DynamoDB Consoleではただ参照するだけでなく検索/追加/JSONでの確認/編集/削除ができます。

### PK、SKやGSIを使った検索、フィルター
パーティションキー、ソートキーを使った検索や、GSIを切替ての検索。
フィルター条件の指定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/2b8b970f-2ed6-d49a-f2d4-fb1e0f0fdd80.png)

「items」を右クリックすると検索条件の保存ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/f727a563-d6eb-16c7-665a-072753a9a0ad.png)

#### 表示属性の制限
表示する項目の属性を制限して、確認したい項目だけに絞ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/4b610825-9265-1550-c207-2388784c3159.png)

### 項目の追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/9865dbe3-3960-1bd5-c8b2-975d801ebac7.png)
＋マークからエディターを開いて新しい項目を追加できます。
JSON形式で記述し「Execute」で確定します。
確定後リフレッシュすることで新しい項目を読み込みます。

追加も変更も確定前の変更を貯めておける便利仕様になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/8a2bd67d-fb48-f553-4a92-ac4fa5107b8d.png)

### 項目の確認
項目をダブルクリックすることでJSON形式でエディター表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/25a10358-a704-8333-3c21-942065ca05ec.png)
そのまま編集することで更新することができます。

Ctrlキーを押しながら属性をダブルクリックすることで、任意の属性を範囲選択した状態でエディターを開けます。

### 項目の編集
表示されたJSONを編集して保存すると更新確定前の状態になります。

確定するまでは更新前後の差分を取ることができます。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/ee4c9082-6ccd-b6e8-80ef-b5b9ad347bb0.png)

「Execute」で更新を確定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/4492f47e-c082-2929-a95b-c91d63625937.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/a3daa758-147e-1af5-f75b-561794c76dd1.png)

### 項目の複製
項目にホバーして右クリックで項目のコピーができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/db823646-92aa-2fec-be68-80ec1b942739.png)

PKとSKの組み合わせを重複がないように変えないと登録エラーになるので注意。

### 項目の削除
項目にホバーして右クリックで項目の削除ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/b9fbc4aa-1acf-7c5f-239a-f2cbe43314aa.png)

これも即時反映ではなく「Execute」で確定するまで反映されません。

### 項目や属性をクリップボードにコピー
項目や属性を選択してクリップボードにコピーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/95ccf26e-7470-f997-cebd-7798eae11c23.png)

### 項目のピン止め
項目にホバーして右クリックで項目のピン止めができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/0065fb5c-0c11-265a-a32e-88b9554a2445.png)

大量のデータを確認しているときなど便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/25eb49f9-ca59-0df5-318c-5eb6a4d6f3fc.png)

### 注意点
* 追加、変更時にJSON構文エラーがあると、Executeボタンが押せません。特にエラーメッセージが出ないのでなかなか気づかず苦労しました。
* 残念ながらセット型の作成、更新はできません。

---

DyanmoDBテーブルのデータをローカルからGUIで確認できるツールはいくつかありますが、どれも使い勝手がイマイチだったり有償のものだったりなのですが、私の調べた中では断トツで導入しやすく使いやすいです！
VSCode上で拡張機能として使えるのも開発時にとても便利。

ただ、こんな便利な拡張機能なのにGitHubのスターがとても少ない😢

https://github.com/domagojk/serverless-console

私と同じように開発が楽になった方は是非スターを押したり作者にコーヒーをおごってあげましょう☕

https://www.buymeacoffee.com/y39DWQf