はじめに
LambdaとAPI Gatewayを使用してサーバレスアプリケーションを構築します。Lambdaに直接関数を実装する方法があるが、Githubでのコード管理しやすさも考え、FastAPIで作成したものをLambdaへあげる方法にしました。
今回は下記について記載しています。
- サーバレスアプリケーションデプロイ奮闘記
- AWS SAMを使用したデプロイ手順
サーバレスアプリケーションデプロイ奮闘記
1. zipをLambdaにアップロードする
まずこの方法を試しました。
AWSコンソール画面を操作して手作業で構築するので、LambdaとAPI Gatewayの関連性など何が起きているのか分かりやすいので初めは多くの方がこの方法で構築すると思います。
こちらの記事が詳細な手順をご紹介してくれています。↓
だができなかった...
この手順でうまくいかない原因としてよくあるのは以下だと思います。
- 開発環境とランタイムのpythonバージョン不一致
- Lamdaのハンドラ間違い
- アーキテクチャ(x86_64 か arm64)の違い
トライアンドエラーで構築を繰り返したができませんでした。
2. ECR + Docker
ECRにFastAPIを動かすDockerイメージをあげてLambdaでDockerコンテナを実行するという方法も試したがこれもうまくいきませんでした。
3. AWS SAM
ようやくここにたどり着いた。結論この方法でできました。
再現性が高く、テンプレートあれば次から一瞬でデプロイできます。
下記で詳細を紹介します。
AWS SAMでFastAPIアプリをデプロイ
AWS SAMとは
IaC(Infrastructure as Code)を使用したサーバーレスアプリケーション構築するフレームワークです。
IaCというのはインフラ構成や設定をコード化できるもので、AWS SAMはデプロイ時にコードを元にインフラを構築してくれます。
これを使用すると手作業でLambdaやAPI Gatewayを作成する必要がなくなります。
SAMについて何も分かんない方は、AWSコンソールを触りながらチュートリアルをやるとどの項目が結びついているのかなど分かってきます。
デプロイ手順
こちらのGithubをクローンして、Readmeの通りにやってもできます。
-
FastAPIでアプリ作成
とりあえずHelloWordを返す簡単なもので良い -
IAMユーザーを作成する
アクセスキーとシークレットアクセスキーが必要なので作成しておく -
FastAPIAWS CLIをインストール
インストール
brew install awscli
バージョン確認
aws --version
- AWS CLI の設定
デプロイするための認証情報を設定する
aws configure
AWS Access Key ID:
AWS Secret Access Key:
Default region name:
Default output format:
(参考)
AWS Access Key ID: アクセスキー
AWS Secret Access Key: シークレットアクセスキー
Default region name: ap-northeast-1
Default output format: json
- ルートディレクトリにtemplate.yamlを作成
- 同じディレクトリのmain.pyのhandlerを実行する
- エンドポイントが / と /testや/user 等のGETやPOSTができる
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
FastApiApi:
Type: AWS::Serverless::Api
Properties:
StageName: Dev
FastApiFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: .
Handler: main.handler
Runtime: python3.12
MemorySize: 512
Timeout: 30
Events:
RootApi:
Type: Api
Properties:
RestApiId: !Ref FastApiApi
Path: /
Method: ANY
ApiGatewayProxy:
Type: Api
Properties:
RestApiId: !Ref FastApiApi
Path: /{proxy+}
Method: ANY
- ルートディレクトリにsamconfig.tomlを作成
- 50MB以上のデプロイに対応するため、s3の利用をtrueにする
- デプロイ失敗時は自動でロールバックさせる
version = 0.1
[default.deploy.parameters]
stack_name = "fastapi"
resolve_s3 = true
s3_prefix = "fastapi"
region = "ap-northeast-1"
capabilities = "CAPABILITY_IAM"
disable_rollback = false
image_repositories = []
- ビルドとデプロイ
ソース変更したらビルド
sam build
デプロイ
sam deplpy
デプロイ設定(samconfig.toml)を変更したい場合
sam deploy --guided
デプロイ後AWSコンソールにログインすると、LambdaとAPI Gatewayが作成されているのが確認できます。
- エンドポイントの確認方法
- 1. sam list endpoints --stack-name [samconfig.tomlのstack_name]
- 2. AWS マネジメントコンソール(API Gatewayのステージ)で確認
おわりに
SAMを使う前にAWSコンソールで何度も構築していたため、SAMへの理解が早かったと感じています。
zip化してアップロードしようとしていましたが、コマンドのみでデプロイできるこの方法を知れて良かったです。