はじめに
上記の記事通りに SAM を設定してリソースをデプロイしただけの備忘録になります。
前提環境
- Windows 11
- PowerShell
- VSCode
- aws-cli
- 2.33.6
- Python
- 3.12.7
- GitLab
準備
- SAM CLI のインストール
- 以下のドキュメント通りにインストール
- インストールできているか確認する
sam --version
手順
SAM による Lambda のデプロイでは
- zip ファイルによるデプロイ
- Docker Image によるデプロイ
の 2 つがあり、本記事では zip ファイルを使用する方法で進めます。
1. SAM プロジェクトの新規作成
sam init コマンドで公式のテンプレートをダウンロードしてから改変する方法で進めます。
sam init
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice:
どのテンプレートを選ぶか選択肢が出るので、1 を入力して Enter を押します。
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:
Python 3.14 + zip でデプロイするか尋ねられます。
Python のバージョン指定をしたいのでそのまま Enter を入力します。
Use the most popular runtime and package type? (python3.14 and zip) [y/N]:
使いたいプログラミング言語を選択します。
今回は 19 と入力します。
Which runtime would you like to use?
1 - dotnet10
2 - dotnet8
3 - dotnet6
4 - go (provided.al2)
5 - go (provided.al2023)
6 - graalvm.java11 (provided.al2)
7 - graalvm.java17 (provided.al2)
8 - java25
9 - java21
10 - java17
11 - java11
12 - java8.al2
13 - nodejs24.x
14 - nodejs22.x
15 - nodejs20.x
16 - python3.9
17 - python3.14
18 - python3.13
19 - python3.12
20 - python3.11
21 - python3.10
22 - ruby3.4
23 - ruby3.3
24 - ruby3.2
25 - rust (provided.al2)
26 - rust (provided.al2023)
Runtime:
Lambda はコードを zip ファイルにいれるか Docker Image を使うかの選択肢が表示されます。
今回は zip ファイルなので 1 を入力します。
What package type would you like to use?
1 - Zip
2 - Image
詳細なログをとるための機能たちを有効にするか聞かれますが、今回は不要なためすべて Enter で進めます。
Would you like to enable X-Ray tracing on the function(s) in your application? [y/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]:
Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]:
最後にプロジェクトの名前を尋ねられます。
今回は sam-app-handson とします。
Project name [sam-app]: sam-app-handson
作成後は、以下のファイル群が作成されます。
2. template.yaml に CloudWatch Logs の設定を追記
template.yaml に CloudWatch Logs の設定を追記
LogGroup の設定を明示しない場合、Lambda の実行時に自動的に LogGroup が作成されますが、SAM の Stack の外 に作成されます。
そのため、SAM アプリを削除して Stack が削除されても LogGroup は削除されずに残ってしまいます。
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.lambda_handler
Runtime: python3.12
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
+ # CloudWatch Logsの設定。ログもSAMで管理したいなら明示的な設定が必要
+ HelloWorldFunctionLogGroup:
+ Type: AWS::Logs::LogGroup
+ Properties:
+ LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
+ RetentionInDays: 14 # ログの保持日数
変更したら、sam validate で template.yaml に構文エラーがないか確認します。
sam validate
3. アプリのビルド
SAM ではアプリをデプロイする前にビルドを行う必要があります。
以下のコマンドでビルドを行います。
sam build
4. アプリのデプロイ
次のコマンドでアプリをデプロイします。
sam deploy
途中で、デプロイしても問題ないか聞いてくるので、y を選択します。
Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]:y
5. 動作確認
template.yaml の Outputs のセクションにて API の URL を出力するようになっているので、デプロイ時に URL を確認できます。
CloudFormation outputs from deployed stack
-----------------------------------------------------------------------------------------------------------------------------
Outputs
-----------------------------------------------------------------------------------------------------------------------------
...(中略)...
Key HelloWorldApi
Description API Gateway endpoint URL for Prod stage for Hello World function
Value https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
...(中略)...
-----------------------------------------------------------------------------------------------------------------------------
この URL をブラウザで開くか curlコマンドで GET リクエストを送ると
{"message": "hello world"}
と返ってくるはずです。
6. sam sync --watch の実行
ローカルでのコード変更を自動的にクラウド環境へ反映するための設定を行います。
これを実行することで開発効率が大きく上がります。
sam sync --watch
コマンドを実行すると以下の警告文が表示されます。
The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code without
performing a CloudFormation deployment. This will cause drift in your CloudFormation stack.
**The sync command should only be used against a development stack**.
Confirm that you are synchronizing a development stack.
Enter Y to proceed with the command, or enter N to cancel:
[Y/n]: Y
sam sync --watch は CloudFormation を通さず直接 Lambda を更新するため、
スタック定義と実体にズレが生じることを警告しています。
sam sync --watch は便利ではありますが使用するのは開発環境だけにとどめて、
本番環境では使わないようにしましょう。
7. コードの変更
Lambda のコードを定義している app.py を編集し、
リアルタイムに変更が反映されるか確認してみましょう。
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world!!!!!!!!!!!!!!!!!!!", # レスポンス文の末尾に ! を多数追加
# "location": ip.text.replace("\n", "")
}),
}
上記の変更をした上で、
API の URL をブラウザで開くか curlコマンドで GET リクエストを送ると
{"message": "hello world!!!!!!!!!!!!!!!!!!!"}
が返ってくるはずです。
また変更を戻して、
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world", # レスポンス文の末尾の ! を削除
# "location": ip.text.replace("\n", "")
}),
}
API の URL をブラウザで開くか curlコマンドで GET リクエストを送ると
{"message": "hello world"}
が返ってくるはずです。
7. リソースの削除
SAM で管理しているリソースは次のコマンドで一括削除できます。
sam delete
コマンドを実行すると以下が尋ねられます。
Are you sure you want to delete the stack sam-app-handson in the region ap-northeast-1 ? [y/N]: y
Do you want to delete the template file 67b381ee6d8782cf9b04917ed8adbb89.template in S3? [y/N]: y
- 本当にスタックを削除しても良いか?
- SAM が S3 にアップロードしたデプロイ用テンプレートファイルも削除するか?
と聞かれているので、すべて y を入力します。
デプロイ用テンプレートファイルとは?
sam deploy を実行すると、
ローカルの template.yaml と Lambda コードは一度 S3 にアップロードされます。
そして CloudFormation は、その S3 に置かれたテンプレート を使ってリソースを作成・更新します。
まとめ
AWS SAMによるサーバーレスアプリケーション開発入門の解説に沿って、SAM で Hello World テンプレートを作成してみました。
これを基本にして、サーバーレスアプリ開発に応用していけたらいいなと思います。
