爆速でモックAPIを構築する

AWS Chalice を使って爆速でモックAPIを作ってみました。

AWS Chalice は Python 製のフレームワークで API Gateway と Lambda をサクッと構築できます。(詳細は[公式](https://aws.github.io/chalice/index)を参照ください。)

### 構成

構築する環境はAPI Gateway + Lambdaとなります。

![composition.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167819/7fb64117-dfd2-937f-800d-f705428feb73.png)

今回は以下前提にて構築します。

- pythonインストール済み
- Lambdaに付与するロールは事前作成済み（ロールの自動生成は使わない）
- AWS CLIの設定済み


### 構築
何はともあれ作っていきます。

1. chalice インストール

    ```
    pip install chalice
    ```

2. プロジェクト作成

    ```
    chalice new-project chalice-example
    cd chalice-example
    ```
   
3. `app.py` を修正
    - 初期状態からコメントアウトを削除

    ```python:app.py
    from chalice import Chalice
   
    # app_nameに指定した値がAPI Gateway名になる
    app = Chalice(app_name='chalice-example-apigateway')
   
    # GETメソッドで'/'にアクセスした際{'hello': 'world'}を返す
    @app.route('/')
    def index():
        return {'hello': 'world'}
   
    # GETメソッドで'/hello/{name}'にアクセスした際{'hello': 'パスパラメータ(name)'}を返す
    @app.route('/hello/{name}')
    def hello_name(name):
       return {'hello': name}
   
    # POSTメソッドで'/users'にアクセスした際{'user': body}を返す
    @app.route('/users', methods=['POST'])
    def create_user():
        user_as_json = app.current_request.json_body
        return {'user': user_as_json}
    ```
   
4. `.chalice/config.json` を修正
     - ロールを自動生成させないように`manage_iam_role`を指定
     - Lambdaに付与するロールを`iam_role_arn`に指定
     - Lambda名`app_name`を変更

    ```json:config.json
    {
      "version": "2.0",
      "app_name": "chalice-example-lambda",
      "stages": {
        "dev": {
          "api_gateway_stage": "api",
          "manage_iam_role": false,
          "iam_role_arn": "arn:aws:iam::XXXXXXXXXXXX:role/XXXXXXXXXXXX"
        }
      }
    }
    ```
   
5. デプロイ

    ```
    chalice deploy --profile [AWS CLI プロファイル名]
    ```

6. リソース確認
   マネコンからAPI GatewayとLambdaが作成されているか見てみます。
   APIGatewayを見てみると`chalice-example-apigateway`という名前で作成されていて、Lambdaが紐づいているようです。
   ![apigateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167819/66406286-2d7f-3448-606f-afb9a7c9bc90.png)
   次は、紐づいているLambdaを見てみます。
   `chalice-example-lambda-dev`という名前で作成されてます。
   ※`-dev`がついているのは`confg.json`で指定したステージ名で、デプロイ時に指定することができます。
   デフォルトdevになります。
   ![lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167819/b870f205-5d4f-a63b-aa4a-4a2fb2043bb8.png)
   無事、API GatewayとLambdaが作成されてました！


7. アクセス確認
   今回はお手軽にCurlコマンドで確認します。URLはデプロイ後に出力されます。

    ```
    [user@server chalice-example]$ chalice deploy --profile [AWSプロファイル名]
    Creating deployment package.
    Creating lambda function: chalice-example-test-dev
    :
    # このURLに対してアクセス
      - Rest API URL: https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/
    ```
   結果はこんな感じですべて期待通りになりました！

    ```
    # GETメソッドで'/'にアクセスした際{'hello': 'world'}を返す
    [user@server chalice-example]$ curl https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/
    [user@server chalice-example]$ {"hello":"world"}
   
    # GETメソッドで'/hello/{name}'にアクセスした際{'hello': 'パスパラメータ(name)'}を返す
    [user@server chalice-example]$ curl https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/hello/AAA
    [user@server chalice-example]$ {"hello":"AAA"}
   
    # POSTメソッドで'/users'にアクセスした際{'user': body}を返す
    [user@server chalice-example]$ curl -X POST -H "Content-Type: application/json" -d '{"Name":"AAA", "Age":"100"}' https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/users
    {"user":{"Name":"AAA","Age":"100"}}
    ```

8. 削除
   不要なリソースは削除しましょう。

    ```
    chalice delete --profile [AWS CLI プロファイル名]
    ```



### 最後に

chaliceを使うことでわずか数コマンドで簡単にモックAPIが作れました。

Lambdaのコードも感覚的にわかりやすいので簡単なAPIであれば数分でいくつも開発できると思います。

この記事がどなたかの力になれれば幸いです。



### 補足

ローカル実行はこのコマンドをたたくだけです。

```
[user@server chalice-example]$ chalice local
Serving on http://127.0.0.1:8000
```

'/'へ接続してみると期待通りのレスポンスがありました。

```
[user@server chalice-example]$ curl http://127.0.0.1:8000
[user@server chalice-example]$ {"hello":"world"}
```