Serverless Framework を使用して AWS Lambda を構築するためのテンプレートリポジトリです。 Python ランタイム、複数プラグイン、Docker コンテナを利用し、開発・デプロイを効率化します。
※このリポジトリはプロジェクト作成後の状態です。以下は参考情報としてご利用ください。
プロジェクト作成前は以下のファイル構成になっています:
./infra/:インフラ定義ファイル群.gitignoredocker-compose.ymlMakefileREADME.md
⚠️ serverless/ディレクトリは不要です(プロジェクト作成時に生成されます)
以下のコマンドで Serverless プロジェクトを作成します。 途中で手動での操作が必要です(次項で述べています)。
make sls-createプロジェクト作成中に、以下の手動操作が必要です:
- テンプレート選択:
AWS/Python/HTTP APIを選択
- プロジェクト名入力:
serverlessと入力(serverless/ディレクトリが自動生成される)
- ブラウザでログイン:
- Serverless Framework アカウントでログイン(ver4以上では必須)
- アプリ追加はスキップ:
- 「Skip Adding An App」を選択(dashboardは使用しないため)
- AWS SSO / ENV Vars 設定は後回し:
- 「Skip & Set Later」を選択(SSO認証を使用するため)
以下のコマンドで、デプロイ用・テスト用の Docker コンテナを立ち上げます:
make reset必要な Serverless プラグインをコンテナ内でインストールします:
docker compose exec sls-deploy serverless plugin install --name serverless-iam-roles-per-function
docker compose exec sls-deploy serverless plugin install --name serverless-python-requirements
docker compose exec sls-deploy serverless plugin install --name serverless-prune-plugin
docker compose exec sls-deploy serverless plugin install --name serverless-plugin-lambda-insights
docker compose exec sls-deploy serverless plugin install --name serverless-plugin-aws-alerts
docker compose exec sls-deploy serverless plugin install --name serverless-domain-managerstage®ion指定- ランタイムは Python 3.12
- その他関数の基本共通設定も可能
- Lambda 関数を複数定義
- メモリ/タイムアウトの個別指定
environmentで環境変数を注入layersの活用- 各種トリガー(HTTP, Schedule, S3, DynamoDB, SNS)に対応
- VPC対応Lambdaと非VPC Lambdaを混在
- 関数ごとに権限分離
iamRoleStatementsによる最小権限ポリシー設定
- DynamoDB, S3, SNS, RDS, SecretsManager
- CloudWatch Logs/Alarms、Lambda Insights
- VPC, NAT Gateway, Internet Gateway, Subnet, RouteTable などの基本ネットワーク構成
- VPC Endpoint (S3 / DynamoDB / SecretsManager)
.env.stg.ymlや.env.prd.ymlにパラメータを外出しparam:を用いた柔軟な参照を実現
serverless-iam-roles-per-function: IAM 分離を有効化serverless-python-requirements: Python の依存関係解決とレイヤー化serverless-prune-plugin: 古いデプロイの自動削除serverless-plugin-lambda-insights: Lambda Insights をデフォルトで有効化serverless-domain-manager: カスタムドメインに対応serverless-lambda-edge-pre-existing-cloudfront: cloudfrontへのlamdab@edgeの紐付け
以下のコマンドで、SSO プロファイルを使用してデプロイできます:
aws sso login --profile profile-name
make deploy aws_profile=profile-name初回デプロイ時はドメイン作成のため以下の用意をしてください:
⚠️ 必要に応じて.env.stg.ymlなどのenvファイルを事前に作成してください。 また、ホストゾーンや証明書なども事前に用意してください。CloudfrontへのAレコードはデプロイ後に手動で作成してください。 準備ができたら以下のコマンドでapigatewayのカスタムドメインを作成します。
aws sso login --profile profile-name
make create_domain aws_profile=profile-name以下のコマンドで、作成したAWSリソースを削除できます:
⚠️ ホストゾーンのレコードやACMなどは手動で削除が必要かもしれません。
aws sso login --profile profile-name
make remove-all aws_profile=profile-nametest-serverless/
├── docker-compose.yml
├── Makefile
├── README.md
├── infra/
│ └── docker/
│ └── development/
│ ├── python/
│ │ └── Dockerfile
│ ├── sls-create/
│ │ └── Dockerfile
│ └── sls-deploy/
│ └── Dockerfile
└── serverless/
├── .gitignore
├── handler.py
├── README.md
├── requirements.txt
├── .env.stg.yml
├── serverless.yml
└── handlers/
├── apigateway.py
├── dynamodb.py
├── handler.py
├── invoke.py
├── lambdainsightsCpu.py
├── lambdainsightsMemory.py
├── log.py
├── rds.py
├── s3.py
└── sns.py- Serverless のバージョンは v4 以上(v3 以前では一部機能非対応)
- Serverless.yml の構造や
!Ref,!GetAttの CloudFormation 構文は公式ドキュメント参照 .env.stg.ymlによる Secrets 情報も適切にハンドリング済- 今回は事前に認証されたACMおよびホストゾーンのみコンソールでセットアップしている
- 本来はserverlessで管理すべきは、Lambda, APIgateway, dynamoDB, Cloudwatch, SNS(serverlessの運用監視用), IAM(serverless関連), のみにすべきである
- 今回の例では、LambdaInsightsの遅延の影響もあり、アラーム状態が解除されない場合もある(アラームアクションが発火しない)ので適宜調整するようにしたい
- LambdaInsightsをクビにしてログメトリクスフィルタでアラームを飛ばすのもあり(cpuの値などはとれないけど、、メモリとかはいけるので適宜良さそうな構成にする)
- WAFとCloudFrontも追加したことにより、グローバルのスタックとリージョナルのスタックで二つのymlで管理している
- ssmでの受け渡しはうまくいかなかったのでMakefileでパラメータの受け渡しをして解決している
- LambdaEdgeも追加した、WAF&Lambda@Edge用のlambdaの作成->リージョナルのリソース(&CloudFront)の作成
- LambdaEdgeはserverlessの拡張機能を使っていい感じにやろうと思ったが、stackに残らないので自分で定義した
- リソース削除時はうまくいかないいこともあるのでその場合コマンドを都度うつ