サーバーデプロイツールの調査

※ Hello world のFastAPIをデプロイ（API Gateway + Lambda）して比較する。　

- Serverless Framework V.4 と AWS SAM は、サーバーレス用CFnフレームワーク
  - API GatewayとLambdaのリソースをまとめて記述できる構文
- CDK は、CFnテンプレートを json, yaml ではなく、プログラミング言語で記述できるもの
  - プログラミング言語であることだけでなく、よりコンポーネント化した記述ができる
  - 複雑度、規模が大きくなればなるほど有効 
  - 権限の設定の記述が楽

| | [Serverless Framework V.4](https://www.serverless.com/)  | [AWS SAM](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html) | [AWS CDK](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html) |
| ------------ | ------------- | ------------- | ------------- |
| コスト | サーバーレス・フレームワークCLI V.4+は無料だが、年間200万ドル以上の収入を得る組織は有料のサブスクリプションが必要 | 無償  | 無償 |
| デプロイ ※CLIベース | [serverless deploy ](https://qiita.com/tshibazaki8165/items/fe7a184df4463609ba65) |  [sam build, sam deploy --guided](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html) | [cdk synth, cdk deploy](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/hello_world.html) |


## 各ツールの立ち位置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176198/f40bfe64-6626-3daf-aba9-766a3ee7bedd.png)




### Serverless Framework V.4
※ プラグイン
※外部ライブラリ


serverless.yml
```
service: fastapi-apigateway-lambda
frameworkVersion: '4'

provider:
  name: aws
  runtime: python3.11

functions:
  api:
    handler: app.handler
    events:
      - httpApi: '*'

plugins:
  - serverless-python-requirements

```
### AWS SAM
※ Transform: AWS::Serverless-2016-10-31, AWS::Serverless::Function
※ CFnの場合は、Former2で生成したもの比較してみる AWS::Lambda::Function ＋ AWS::ApiGatewayV2::Api → AWS::Serverless::Function
※外部ライブラリ

template.yml
```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3
    MemorySize: 128

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: HttpApi # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
              Path: /
              Method: ANY


Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  # HelloWorldApi:
  #   Description: "API Gateway endpoint URL for Prod stage for Hello World function"
  #   Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn
```

###  AWS CDK

AWS CDK 概要 (Basic #1)【AWS Black Belt】
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CDK-Basic-1-Overview_0731_v1.pdf

**Construct**
**synthesize（合成する）** 


CDKの起源
- 複数チームが開発、デプロイしやすくしたい
- 繰り返し複雑なものを使うのを避けたい
- プロラム言語の方が表現しやすい






#### サンプル
- [サーバーレス Hello World アプリケーションを作成する](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/serverless_example.html)　をもとに修正して　Hello world のFastAPIをデプロイ（API Gateway + Lambda）した
- VSCodeで確認する
※外部ライブラリ aws_lambda → aws_lambda_python_alpha にして、　requirements.txt を置く

- その他紹介
  - CDK アプリケーションの複雑さを軽減する L2 Construct の活用 https://aws.amazon.com/jp/blogs/news/leverage-l2-constructs-to-reduce-the-complexity-of-your-aws-cdk-application/
  - オープンソースのコンストラクトをConstruct Hub で公開 している https://constructs.dev/