Python＋サーバレス開発を勉強する中でzappaがデプロイするリソースについて気になったので調べてみた

## はじめに
- [動かして学ぶ！Pythonサーバレスアプリ開発入門 著:本田崇智](https://www.shoeisha.co.jp/book/detail/9784798169729)　を読み<br>
Python+サーバレスを学習する中で<br>
作成したアプリケーションをAWS環境にデプロイしてくれる`zappa`というツールが<br>
どのようにApiGatewayとLambdaを構築したのか気になり、確認した際のメモ

## デプロイするアプリケーション構成
- 参考書のchapter9が完了した時点での構成をざっくり抜粋して書くと、以下のようになる

```
application
├sever.py                # アプリ起動プログラム
├zappa_settings.json     # zappa設定ファイル　
└ flask_blog
  ├__init__.py           # 初期処理プログラム
  ├config.py             # アプリケーション設定プログラム
  ├models/               # モデルプログラム群
  ├static
  │ └style.css           # CSS定義ファイル
  ├templates/            # HTMLファイル群
  └ views                # ビュープログラム群
```

## zappaでデプロイしたリソース確認
- 以下コマンドでデプロイ

```
$ zappa deploy dev
```

- ApiGatewayの確認
<img width="700" alt="zappa apigateway確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446648/2b5f6cbd-db7e-b1bc-3fc2-b3e984557b5a.png">


- Lambdaの確認
<img width="700" alt="zaapa lambda確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446648/3ca1d266-0cd9-a416-999d-1da0e1084602.png">


## でてきた疑問点
- HTMLファイルの実体どこにあるんだ？
  - よく目にするのは静的ファイルはs3に格納して表示するパターン
- lambdaのソースコードどうなっている？
  - 以下のようにコードのファイルサイズが大きすぎると表示されて、<br>
  コンソールからはファイルが確認できない

    ```
    the deployment package of your Lambda function "application-dev" is too large to enable inline code editing. However, you can still invoke your function.
    ```

## 調べた内容
### AWS Webアプリのサーバレスアーキテクチャ例
- そもそもサーバレスでどういったアーキテクチャが考えられるのか調べてみたところ<br>
やっぱり静的コンテンツをS3(またはs3を内包するamplify)に格納しておいて<br>
動的コンテンツはApigatewayとlambdaを使うといったアーキテクチャは公開されていた
- s3 + ApiGateway + Lambda
<img width="400" alt="s3-apigateway-lambda.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446648/06df7d35-782c-3492-0a2a-5504a516dc80.png">
  - 参考
     - [初めてのサーバーレスウェブアプリケーションを構築する](https://aws.amazon.com/jp/serverless/build-a-web-app/)<br>

- CloudFrontを使って設計するパターンもあるよう<br>
<img width="600" alt="cloudfront-severless.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446648/01362100-d6b3-94fc-da30-dfc25a4a6014.png">

  - 参考:
      - [AWS Well-Architected フレームワーク ウェブアプリケーション](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/serverless-applications-lens/web-application.html)
      - [Powering HIPAA-compliant workloads using AWS Serverless technologies](https://aws.amazon.com/blogs/compute/powering-hipaa-compliant-workloads-using-aws-serverless-technologies/)
      - [サーバーレス LAMP スタック – Part 3: Webサーバーの置き換え](https://aws.amazon.com/jp/blogs/news/the-serverless-lamp-stack-part-3-replacing-the-web-server/)

- ここまで調べた段階で、zappaが作成するs3を確認してみたが何も入ってなかった、、、
どうやら作成されたs3は一時的に使用しているだけのようで
調べてきたアーキテクチャとは違う模様
- 上記から結論づけるにHTMLもlambdaから返却している
->Flaskで作成して動的にHTMLを返すアプリケーションなので当たり前か
- 後述するがlambdaのソースコードを確認しても
作成したアプリケーションのコードが全部含まれていた

### Lambdaのソースコード取得方法
- Lambdaのソースコードは調べたところ以下コマンド取得できた
(コンソールから `アクション->関数のエクスポート`でも取得できるみたい)

```
$ aws lambda get-function --function-name [function名] --query 'Code.Location' | xargs curl -o [出力ファイル名指定(例 xxx.zip)]
```
取得した結果を確認したところ
[デプロイするアプリケーション構成](#デプロイするアプリケーション構成)に記載したファイルもまるっと含まれていた

## 終わりに
- いつかサーバレスアプリケーションを作ってみたいなと思っていたので<br>
Pythonの学習に加えてサーバレスのアーキテクチャパターンを調査できたのはよかった
- SPAとMPAの違いもろくに分かっていなかったので<br>
Webアプリ開発の理解が乏しすぎることを再認識しました、、、