👌

AWS SAMでサーバレスアプリケーションをつくる!

に公開

概要

AWS SAM(Serverless Application Model)は、AWS Lambda・API Gateway・DynamoDB などを使ったサーバレスアプリケーションを、少ないコードで定義・デプロイできるフレームワークです。

AWSの公式ツールであり、AWS認定試験(SAA、DVA、SOA)でも頻出のテーマです。
この記事では、AWS SAMの基本CloudFormationとの違い、そして実際にHello Worldアプリケーションを構築する手順を紹介します。

1. AWS SAMとは?

AWS SAM(Serverless Application Model)は、CloudFormationをベースにしたサーバレス特化の拡張フレームワークです。

通常のCloudFormationでは、LambdaやAPI Gatewayを定義する際に数十行のYAMLが必要ですが、SAMを使えば数行で済みます。

SAMを使うとできること

  • ✅ サーバレスアプリをYAMLで簡潔に定義
  • ✅ ローカルでLambda/APIを実行・デバッグ
  • ✅ 1コマンドでAWSへデプロイ

2. CloudFormationとの違い

項目 AWS CloudFormation AWS SAM
定義対象 すべてのAWSリソース サーバレス特化(Lambda, API Gateway, DynamoDBなど)
記述量 多い(リソースを詳細に記述) 少ない(専用構文で省略可)
ローカルテスト 非対応 sam local コマンドで可能
CLI aws cloudformation sam
構文 詳細なCloudFormation形式 AWS::Serverless::*構文で簡潔に

SAMはCloudFormationの拡張仕様(Transform)で動作しており、
「サーバレス構成に特化したCloudFormationテンプレート」 と言えます。

SAMで利用できる主なリソース

AWS SAMは、CloudFormationの上に構築された抽象化レイヤーとして、サーバレス開発で頻出するリソースを簡潔に定義できる構文を提供します。
以下はSAMで利用できる代表的なリソースです。

リソース名 概要
AWS::Serverless::Api Amazon API Gatewayを定義。Lambdaとの統合が容易。
AWS::Serverless::Function AWS Lambda関数を定義。最も基本的なSAMリソース。
AWS::Serverless::HttpApi HTTP APIを簡単に構築するためのリソース。
AWS::Serverless::SimpleTable DynamoDBテーブルを簡単に作成できる。
AWS::Serverless::Application 他のSAMアプリケーションをスタック内に統合可能。
AWS::Serverless::LayerVersion Lambdaレイヤーを定義。コードの再利用に便利。
AWS::Serverless::StateMachine AWS Step Functionsのステートマシンを定義。
AWS::Serverless::Connector リソース間のアクセス権限を簡潔に定義可能。

詳細はAWS公式ドキュメントを参照してください。
👉 AWS SAM リソースとプロパティ

AWS SAMでアプリ構築

ここからは、実際にAWS SAMを使って「Hello World API」を構築してみます!

1. 開発環境の準備

🔧 必要なもの

  • AWSアカウント
  • AWS CLI(設定済み)
  • Python 3.9以上
  • AWS SAM CLI

SAM CLIのインストール

AWS SAM CLI のインストールを参考に各環境にSAM CLIをインストールしてください。

2. プロジェクトの作成

以下のコマンドでSAMプロジェクトを作成します。

sam init

対話形式で進めます👇

Which template source would you like to use?
        1 - AWS Quick Start Templates
Choice: 1

Choose an AWS Quick Start application template
        1 - Hello World Example
Template: 1

Use the most popular runtime and package type? (python3.13 and zip) [y/N]: y
Would you like to enable X-Ray tracing on the function(s)? [y/N]: N
Would you like to enable monitoring using CloudWatch Application Insights? [y/N]: y
Would you like to set Structured Logging in JSON format? [y/N]: y
Project name [sam-app]: hello-sam

完了後、次のようなディレクトリができます。

hello-sam/
├── README.md
├── __init__.py
├── events/
├── hello_world/
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
├── samconfig.toml
├── template.yaml
└── tests/

3. Lambda関数のコードを記載

hello_world/app.py を開くと、次のようなコードがあります。

import json

def lambda_handler(event, context):
    message = "Hello World!"
    return {
        "statusCode": 200,
        "body": json.dumps({"message": message})
    }

この関数は、HTTP GETリクエストを受け取ると {"message": "Hello World!"} を返すシンプルなAPIです。

4. SAMテンプレートの確認

template.yaml の中身を見てみましょう👇

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: A simple AWS SAM app

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Events:
        HelloWorldApi:
          Type: Api
          Properties:
            Path: /hello
            Method: get

このテンプレートは「Lambda関数」と「API Gateway」を定義しています。

5. ローカルで動作確認

次のコマンドでAPI Gatewayイベントをシミュレートして実行できます。

sam local invoke HelloWorldFunction`

またはローカルサーバーを立ち上げてAPIをテスト:

sam local start-api

ブラウザで http://127.0.0.1:3000/hello にアクセスすると、以下のようなJSONが返ります。

{"message": "hello world"}`

6. AWSへデプロイ

AWS上にデプロイします。

sam build
sam deploy --guided

対話形式でスタック名やリージョンを入力します

Stack Name [sam-app]: hello-sam-stack
AWS Region [ap-northeast-1]: ap-northeast-1
Confirm changes before deploy [y/N]: y
Allow SAM CLI IAM role creation [Y/n]: Y
Save arguments to configuration file [Y/n]: Y

完了後、出力にAPI Gateway Endpointが表示されます。

Outputs
---------------------------------------------------------------------------
Key                 HelloWorldApi
Description         API Gateway endpoint URL
Value               https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
---------------------------------------------------------------------------

7. 後片付け(削除)

もう使わない場合は、次のコマンドで削除します。

sam delete

まとめ

AWS SAMを使うことで、サーバレスアプリケーションを短いコードで簡単に開発・デプロイできます。
CloudFormationの力をそのまま活かしつつ、LambdaやAPI Gatewayなどサーバレスに特化した構文で記述できるのが大きな利点です。

Discussion