- AWS
AWS SAM入門|template.yamlの書き方とbuild・deploy
AWS SAM(Serverless Application Model)は、Lambda と API Gateway などのサーバーレスの構成を、短い YAML で書いて作るための仕組みです。 template.yaml に AWS::Serverless::Function を1つ書くと、SAM がそれを CloudFormation のリソースに展開します。この記事の例では、関数1つと API 1つの記述から、6つのリソースができました。
| コマンド | 何をするか | 認証情報 | Docker |
|---|---|---|---|
sam validate |
テンプレートの形を確かめる | 要らなかった | 要らない |
sam validate --lint |
cfn-lint で、より細かく確かめる | 要らなかった | 要らない |
sam build |
requirements.txt の依存を入れて、デプロイ用にまとめる |
要らなかった | 要らない(--use-container なら要る) |
sam local invoke |
手元で関数を動かす | ― | 要る |
sam deploy |
AWS に作る | 要る | 要らない |
確認環境:SAM CLI 1.168.0、aws-sam-translator 1.114.0、Python 3.11(Linux)。AWS の認証情報を外した状態で確かめました(確認日 2026年10月12日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「AWS SAM入門|template.yamlの書き方とbuild・deploy」
1. SAM CLI を入れる
この記事では、SAM CLI を pip(pip install aws-sam-cli)で入れました。
sam --version
# SAM CLI, version 1.168.0
2. template.yaml を書く
フォルダの構成は次のとおりです。 sam init でひな形を作ることもできますが、ここでは中身が分かるように手で書きます。
app/
├── template.yaml
└── src/
├── app.py
└── requirements.txt ← requests
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: hello api
Globals:
Function:
Runtime: python3.13
Timeout: 10
MemorySize: 128
Resources:
HelloFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/
Handler: app.lambda_handler
Events:
HelloApi:
Type: Api
Properties:
Path: /hello
Method: get
Outputs:
HelloApiUrl:
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello"
| 項目 | 意味 |
|---|---|
Transform: AWS::Serverless-2016-10-31 |
これがあると SAM のテンプレートになる。無いと AWS::Serverless::Function が使えない |
Globals |
すべての関数に共通の設定(ランタイム・タイムアウトなど) |
CodeUri: src/ |
関数のコードがあるフォルダ |
Handler: app.lambda_handler |
app.py の lambda_handler 関数 |
Events → Type: Api |
API Gateway の GET /hello から呼ばれるようにする |
${ServerlessRestApi} |
SAM が自動で作る API の名前(論理ID) |
関数のコード(src/app.py)です。
import json
import requests
def lambda_handler(event, context):
name = (event.get("queryStringParameters") or {}).get("name", "world")
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps({"message": f"hello {name}", "requests": requests.__version__}),
}
3. SAM が展開するリソース
SAM の変換処理(aws-sam-translator)でこのテンプレートを変換すると、次の6つのリソースになりました。
| 論理ID | 種類 | 書いたところ |
|---|---|---|
HelloFunction |
AWS::Lambda::Function |
AWS::Serverless::Function |
HelloFunctionRole |
AWS::IAM::Role |
(自動)実行ロール |
ServerlessRestApi |
AWS::ApiGateway::RestApi |
Events の Type: Api |
ServerlessRestApiDeploymentbdb62fdebc |
AWS::ApiGateway::Deployment |
(自動) |
ServerlessRestApiProdStage |
AWS::ApiGateway::Stage |
(自動)Prod ステージ |
HelloFunctionHelloApiPermissionProd |
AWS::Lambda::Permission |
(自動)API から関数を呼ぶ許可 |
自動で作られた実行ロールには、CloudWatch Logs にログを書くための AWSLambdaBasicExecutionRole が付いていました。
"ManagedPolicyArns": ["arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]
S3 や DynamoDB を使うときは、Policies に SAM のポリシーテンプレート(S3ReadPolicy など)を書き足します。
Policies:
- S3ReadPolicy:
BucketName: my-bucket
変換すると、実行ロールに次の操作を許すポリシーが足されました。
s3:GetObject, s3:ListBucket, s3:GetBucketLocation, s3:GetObjectVersion, s3:GetLifecycleConfiguration
4. sam validate と --lint で確かめる
sam validate
# template.yaml is a valid SAM Template. This is according to basic SAM Validation, for additional validation, please run with "--lint" option
sam validate --lint
# template.yaml is a valid SAM Template
sam validate だけでは見つからない誤りが、--lint で見つかりました。 ランタイムに終了した python3.7 を書くと、sam validate は通り、--lint では止まりました。
[[E2531: Validate if lambda runtime is deprecated] (Runtime 'python3.7' was deprecated on '2023-12-04'. Creation was disabled on '2024-01-09' and update on '2027-03-03'. Please consider updating to 'python3.14') matched 4]
Error: Linting failed. At least one linting rule was matched to the provided template.
書いたら sam validate --lint を習慣にすると、デプロイの前に気づけます。
5. sam build:依存を入れてまとめる
sam build
Building codeuri: /…/app/src runtime: python3.13 architecture: x86_64 functions: HelloFunction
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Build Succeeded
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml
.aws-sam/build/HelloFunction に、app.py と、requirements.txt に書いた requests とその依存(certifi・charset_normalizer・idna)が入っていました。 Lambda で「No module named 'requests'」になる入れ忘れが、これで起きにくくなります。
.aws-sam/build/HelloFunction/
├── app.py
├── requests/ requests-2.34.2.dist-info/
├── certifi/ charset_normalizer/ idna/
└── requirements.txt
ビルドしたフォルダを、Lambda のランタイムクライアント(awslambdaric)で手元で動かすと、次の応答が返りました。
{"statusCode": 200, "headers": {"Content-Type": "application/json"},
"body": "{\"message\": \"hello world\", \"requests\": \"2.34.2\"}"}
C や Rust で書かれた部分を持つライブラリ(pydantic など)を使うときは、sam build --use-container にすると、AWS のドキュメントのとおり Lambda に近い Docker コンテナの中でビルドされます。Mac で入れたライブラリが Lambda で読み込めない問題は、関連記事「Lambda Unable to import moduleの直し方|Python」で扱っています。
6. sam local invoke(Docker が要る)
Docker が無い環境で sam local invoke を実行すると、次のメッセージで止まりました。
Error: Running AWS SAM projects locally requires a container runtime. Do you have Docker or Finch installed and running?
sam local invoke・sam local start-api は、Lambda に近いコンテナで関数を動かすので、Docker(または Finch)が要ります。
sam local invoke HelloFunction --event events/event.json
sam local start-api # http://127.0.0.1:3000/hello で呼べる
7. sam deploy:初回は --guided
認証情報が無い状態で sam deploy を実行すると、次のメッセージで止まりました。
Error: Unable to locate credentials
認証情報を設定してから、初回は --guided で、質問に答えながらデプロイします。
sam deploy --guided
認証情報を外した状態で sam deploy --guided を実行すると、次の順に聞かれ、答え終わったあとに「Unable to locate credentials」で止まりました。
| 聞かれること(表示どおり) | 既定値 | 意味 |
|---|---|---|
Stack Name |
sam-app |
CloudFormation のスタック名 |
AWS Region |
設定中のリージョン | デプロイ先 |
Confirm changes before deploy |
N |
y にすると、変更内容を見てから実行 |
Allow SAM CLI IAM role creation |
Y |
実行ロールを作るため Y |
Disable rollback |
N |
失敗したとき、作りかけを残すか |
HelloFunction has no authentication. Is this okay? |
N |
認証なしの API でよいか |
Save arguments to configuration file |
Y |
答えを設定ファイルに保存 |
SAM configuration file |
samconfig.toml |
保存先 |
SAM configuration environment |
default |
設定の組の名前 |
AWS のドキュメントでは、設定ファイルの既定は、プロジェクト直下の samconfig.toml です。 2回目からは sam deploy だけで同じ設定が使われます。
| よく使うコマンド | 意味 |
|---|---|
sam deploy |
samconfig.toml の設定でデプロイ |
sam deploy --resolve-s3 |
コードを置く S3 バケットを自動で作る(--guided なしのとき) |
sam logs -n HelloFunction --tail |
関数のログを流して見る |
sam delete |
スタックを削除する |
認証情報の設定は、関連記事「AWS CLI Unable to locate credentialsの直し方」で扱っています。
SAM と CDK・CloudFormation の違い
| CloudFormation | SAM | CDK | |
|---|---|---|---|
| 書くもの | YAML・JSON | YAML(CloudFormation + SAM の書き方) | TypeScript・Python など |
| Lambda と API | 6つのリソースを自分で書く | Events の数行 |
コンストラクトで書く |
| 手元での実行 | なし | sam local(Docker) |
なし(SAM と組み合わせる方法はある) |
| 向いている構成 | 何でも | Lambda・API が中心 | S3・VPC・RDS も含めて組む |
CDK は関連記事「AWS CDK入門|TypeScriptでS3とLambdaを作りsynthまで」で扱っています。
よくある質問
Q. Transform を書き忘れるとどうなりますか。
A. Transform の行だけを消して sam validate --lint を実行すると、E3038('AWS::Serverless::Function' type used without the serverless transform 'AWS::Serverless-2016-10-31')や、'Globals' was unexpected で止まりました。AWS::Serverless::Function も Globals も SAM の書き方なので、Transform が要ります。
Q. sam build のあと、.aws-sam は Git に入れますか。
A. ビルドのたびに作り直すフォルダなので、.gitignore に入れておくのが一般的です。samconfig.toml は、チームで同じ設定を使うなら入れます。
Q. API の URL はどこで分かりますか。
A. Outputs に書いた HelloApiUrl が、sam deploy の最後に表示されます。CloudFormation コンソールの「出力」タブでも見られます。
Q. sam validate は通ったのに、デプロイで失敗しました。
A. sam validate は基本的な形だけを確かめます。--lint を付けると、ランタイムの終了なども見つけられます。それでも見つからない誤り(権限や名前の重複など)は、CloudFormation の「イベント」タブで、最初に失敗したリソースの理由を見ます。
まとめ
- SAM は
Transformを付けた YAML で、Lambda と API を短く書く仕組み - 関数1つ・API 1つの記述から、ロール・API・ステージ・許可を含む6つのリソースに展開された
sam validate --lintで、sam validateでは通る誤り(終了したランタイム)が見つかったsam buildはrequirements.txtの依存を入れてまとめる。ネイティブ拡張は--use-containersam localは Docker が要る、sam deployは 認証情報が要る。初回は--guided
参考・出典
確認日はいずれも 2026年10月12日です。
- AWS SAM デベロッパーガイド「sam build」:https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-build.html
- AWS SAM デベロッパーガイド「sam deploy」:https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html
- SAM CLI 1.168.0・aws-sam-translator 1.114.0(
sam validate・sam build・sam local invoke・sam deployの出力、変換結果)
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「AWS SAM入門|template.yamlの書き方とbuild・deploy」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。