※ Hello world のFastAPIをデプロイ(API Gateway + Lambda)して比較する。
- Serverless Framework V.4 と AWS SAM は、サーバーレス用CFnフレームワーク
- API GatewayとLambdaのリソースをまとめて記述できる構文
- CDK は、CFnテンプレートを json, yaml ではなく、プログラミング言語で記述できるもの
- プログラミング言語であることだけでなく、よりコンポーネント化した記述ができる
- 複雑度、規模が大きくなればなるほど有効
- 権限の設定の記述が楽
Serverless Framework V.4 | AWS SAM | AWS CDK | |
---|---|---|---|
コスト | サーバーレス・フレームワークCLI V.4+は無料だが、年間200万ドル以上の収入を得る組織は有料のサブスクリプションが必要 | 無償 | 無償 |
デプロイ ※CLIベース | serverless deploy | sam build, sam deploy --guided | cdk synth, cdk deploy |
各ツールの立ち位置
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 アプリケーションを作成する をもとに修正して 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/