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-container
  • sam 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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?