こんにちは!今回は、AWS SAM (Serverless Application Model) CLIを使用したLambda関数の開発手順について、実践的な手順を交えながら解説していきます。
SAMとは?
AWS SAM(Serverless Application Model)は、AWSのサーバーレスアプリケーションを構築するためのオープンソースフレームワークです。
SAMを使用することで、Lambda関数、API Gateway、DynamoDBなどのサーバーレスリソースを簡単に定義し、デプロイすることができます。
SAMの主な特徴は以下の通りです:
- シンプルな構文: CloudFormationの拡張として設計されており、サーバーレスアプリケーションを少ないコードで定義できます
- ローカルテスト: Lambda関数やAPI Gatewayをローカル環境で実行してテストできます
- デプロイの自動化: 開発からテスト、本番環境へのデプロイまでをシームレスに行えます
- 既存のAWSツールとの統合: AWS CloudFormation、AWS CLI、IDEプラグインなどと連携できます
SAM CLIは、このSAMフレームワークをローカル環境で使用するためのコマンドラインツールです。
特にsam initコマンドを使うことで、プロジェクトの雛形を簡単に作成でき、すぐにサーバーレス開発を始めることができます。
開発手順
1. プロジェクトの初期化
まずは
sam init
コマンドを実行して、新しいプロジェクトを作成します。対話形式で以下の項目を設定していきます:
- テンプレートソース(AWS Quick Start Templatesなど)
- アプリケーションテンプレート(Hello World、APIなど)
- ランタイム(Node.js、Python、Javaなど)
- パッケージタイプ(ZipまたはImage)
- その他オプション(X-Ray tracingの有効化など)
以下が例です。
コマンドで聞かれた質問に番号を入力して答えていきます。
$ sam init
You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Data processing
3 - Hello World Example with Powertools for AWS Lambda
4 - Multi-step workflow
5 - Scheduled task
6 - Standalone function
7 - Serverless API
8 - Infrastructure event management
9 - Lambda Response Streaming
10 - Serverless Connector Hello World Example
11 - Multi-step workflow with Connectors
12 - GraphQLApi Hello World Example
13 - Full Stack
14 - Lambda EFS example
15 - DynamoDB Example
16 - Machine Learning
Template: 1
Use the most popular runtime and package type? (python3.13 and zip) [y/N]: N
Which runtime would you like to use?
1 - dotnet8
2 - dotnet6
3 - go (provided.al2)
4 - go (provided.al2023)
5 - graalvm.java11 (provided.al2)
6 - graalvm.java17 (provided.al2)
7 - java21
8 - java17
9 - java11
10 - java8.al2
11 - nodejs22.x
12 - nodejs20.x
13 - nodejs18.x
14 - nodejs16.x
15 - python3.9
16 - python3.8
17 - python3.13
18 - python3.12
19 - python3.11
20 - python3.10
21 - ruby3.3
22 - ruby3.2
23 - rust (provided.al2)
24 - rust (provided.al2023)
Runtime: 13
What package type would you like to use?
1 - Zip
2 - Image
Package type: 1
Based on your selections, the only dependency manager available is npm.
We will proceed copying the template using npm.
Select your starter template
1 - Hello World Example
2 - Hello World Example TypeScript
Template: 1
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N
Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: y
AppInsights monitoring may incur additional cost. View https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/appinsights-what-is.html#appinsights-pricing for more details
Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]: N
Project name [sam-app]: my-lambda-app
-----------------------
Generating application:
-----------------------
Name: my-lambda-app
Runtime: nodejs18.x
Architectures: x86_64
Dependency Manager: npm
Application Template: hello-world
Output Directory: .
Configuration file: my-lambda-app/samconfig.toml
Next steps can be found in the README file at my-lambda-app/README.md
Commands you can use next
=========================
[*] Create pipeline: cd my-lambda-app && sam pipeline init --bootstrap
[*] Validate SAM template: cd my-lambda-app && sam validate
[*] Test Function in the Cloud: cd my-lambda-app && sam sync --stack-name {stack-name} --watch
2. プロジェクト構造の確認と修正
生成されたプロジェクトには、主に以下のファイルが含まれています:
- event.json: テストデータ
- app.mjs(Node.jsの場合): メインのソースコード
- template.yaml: SAMテンプレート(関数定義、API Gateway設定など)
Node.jsの場合だと、このapp.mjsがLambdaのコンソール画面でコードを書く部分になります。
3. ビルドとテスト
ローカルでの開発時は、以下のコマンドでビルドを実行します:
sam build --use-container
–use-containerオプションを使用することで、Dockerを利用したビルド環境が自動的に構築されます。
4. ローカルテスト
関数をローカルでテストする場合は、以下のコマンドを使用します:
sam local invoke [関数名] \
--event functions/[パス]/events/event.json \
--docker-network host
注意点:
- RDSに接続する場合は、ホスト設定をhost.docker.internalに変更
- SSHまたはSSM経由でRDSへの接続を確立しておく必要があります
–docker-network host
上の行は任意なので、なくても構いません。
ぼくは、RDSにローカルから繋いでいたため、上のコマンドをつけていました。
5. デプロイ
初回デプロイ時は、以下のコマンドを使用します:
sam deploy --guided CAPABILITY_IAM CAPABILITY_AUTO_EXPAND
2回目以降は単純に:
sam deploy
デプロイ時には以下の項目を設定できます:
- スタック名
- AWSリージョン
- デプロイ前の変更確認
- IAMロールの自動作成許可
- ロールバックの設定
まとめ
SAM CLIを使用することで、サーバーレスアプリケーションの開発からデプロイまでを効率的に行うことができます。特に:
- プロジェクトテンプレートの自動生成
- ローカル環境でのテスト実行
- 簡単なデプロイフロー
という特徴があり、開発効率を大きく向上させることができます。
ぜひ、みなさんもSAM CLIを使ってサーバーレス開発を始めてみてください!