AWS SAM徹底解説:サーバーレス開発を加速する強力ツール

2026年04年05日カテゴリー: 技術記事
タグ:AWSServerlessSAMIaCLambda

AWS Serverless Application Model (SAM) は、サーバーレスアプリケーションの構築、デプロイ、管理を大幅に簡素化する強力なフレームワークです。本記事では、AWS SAMの基本から実践的な使い方、ベストプラクティスまでを詳しく解説し、サーバーレス開発を加速させるヒントを提供します。

サーバーレス開発の課題とAWS SAMの役割

近年、サーバーレスアーキテクチャは、そのスケーラビリティ、運用コストの削減、迅速な開発サイクルといったメリットから、多くの企業で採用が進んでいます。しかし、Amazon API Gateway、AWS Lambda、Amazon DynamoDBなど、複数のAWSサービスを連携させてアプリケーションを構築する際には、インフラの定義やデプロイの複雑さが課題となることがあります。

ここで登場するのが、AWS SAMです。SAMは、これらのサーバーレスリソースを単一のテンプレートファイルで定義し、一貫したワークフローで管理することを可能にします。これにより、開発者はインフラ構築の複雑さから解放され、ビジネスロジックの開発に集中できるようになります。

AWS SAMとは?基本的な概念とメリット

AWS SAM (Serverless Application Model) は、AWS CloudFormationの拡張であり、サーバーレスアプリケーション専用のシンタックスシュガーを提供します。SAMテンプレートは、YAMLまたはJSON形式で記述され、Lambda関数、API Gatewayエンドポイント、DynamoDBテーブルなどのリソースを簡潔に定義できます。

SAMの主な構成要素

  • SAMテンプレート: サーバーレスリソースを定義するファイル。CloudFormationの拡張であり、より簡潔に記述できます。
  • AWS SAM CLI: ローカルでのアプリケーション開発、テスト、デプロイをサポートするコマンドラインインターフェースツールです。

AWS SAMを利用するメリット

  • 開発の簡素化: 複雑なCloudFormationの記述を簡素化し、サーバーレスリソースを簡単に定義できます。
  • ローカルでの開発とテスト: SAM CLIを使用することで、クラウドにデプロイする前にローカル環境でLambda関数やAPIをテストできます。
  • デプロイの自動化: sam deploy コマンド一つで、必要なAWSリソースを構築し、コードをデプロイできます。
  • CI/CDとの統合: SAM CLIは、既存のCI/CDパイプラインに簡単に組み込むことができます。

SAMテンプレートの基本構造

SAMテンプレートは、CloudFormationテンプレートと同様の構造を持ちますが、Transform: AWS::Serverless-2016-10-31 が必須です。これにより、SAM固有のリソースタイプ(例: AWS::Serverless::Function)が利用可能になります。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: A simple serverless API with Lambda and API Gateway.

Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: app.lambda_handler
      Runtime: python3.9
      CodeUri: hello_world/
      Events:
        HelloWorldApi:
          Type: Api
          Properties:
            Path: /hello
            Method: get
Outputs:
  HelloWorldApiUrl:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"

上記の例では、Python 3.9で記述されたLambda関数 HelloWorldFunction と、それに対応するAPI Gatewayのエンドポイント /hello を定義しています。

AWS SAM CLIによる開発ワークフロー

AWS SAM CLIは、サーバーレス開発のライフサイクル全体をサポートします。基本的なコマンドとその役割を理解しましょう。

# 1. プロジェクトの初期化
sam init --runtime python3.9 --name my-serverless-app --app-template hello-world

# 2. ビルド(依存関係の解決とパッケージング)
sam build

# 3. ローカルでの実行とテスト (Lambda関数を直接呼び出す)
sam local invoke "HelloWorldFunction" -e event.json

# 4. ローカルでのAPI Gatewayエミュレーション
sam local start-api

# 5. AWSへのデプロイ
sam deploy --guided

sam init で基本的なプロジェクト構造を作成し、sam build でコードと依存関係をパッケージ化します。sam local invokesam local start-api でローカルでのテストを行い、sam deploy --guided でインタラクティブにAWSへデプロイします。

実践!AWS SAMでシンプルなAPIを構築

ここでは、SAMを使って「Hello, World!」を返すシンプルなAPIを構築する手順を紹介します。

  1. プロジェクトの初期化

    以下のコマンドで、PythonのHello Worldテンプレートを使ってプロジェクトを初期化します。

    sam init --runtime python3.9 --name my-hello-api --app-template hello-world
    cd my-hello-api
    
  2. Lambda関数のコード確認

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

    import json
    
    def lambda_handler(event, context):
        return {
            "statusCode": 200,
            "body": json.dumps({
                "message": "hello world",
            }),
        }
    
  3. SAMテンプレートの確認

    my-hello-api/template.yaml を開くと、HelloWorldFunction が定義されていることが確認できます。

  4. ローカルでのテスト

    APIをローカルで起動し、ブラウザやcurlでアクセスしてみましょう。

    sam build
    sam local start-api
    

    出力されたURL (例: http://127.0.0.1:3000/hello) にアクセスすると、「hello world」というレスポンスが返ってくるはずです。

  5. AWSへのデプロイ

    以下のコマンドでAWSへデプロイします。初回は対話形式でStack名、AWSリージョンなどを設定します。

    sam deploy --guided
    

    デプロイが完了すると、API GatewayのURLが出力されます。そのURLにアクセスして、クラウド上で動作するAPIを確認できます。

AWS SAM デプロイフロー

AWS SAMを使用した開発からデプロイまでの一般的なフローは以下のようになります。

AWS SAMとその他のIaCツールの比較

サーバーレスアプリケーションを構築するためのツールはSAM以外にも存在します。ここでは、代表的なツールとの比較を行います。

特徴AWS SAMAWS CloudFormationServerless Framework
目的AWSサーバーレス特化AWSリソース全般マルチクラウド対応サーバーレス
抽象度中(CloudFormationのシンタックスシュガー)低(AWSリソースを詳細に定義)高(プラグインによる拡張性)
学習コスト
ローカル開発低(SAM CLIで補完可能)
AWSサービス連携ネイティブネイティブプラグイン経由
カスタマイズ性

AWSエコシステム内で完結するサーバーレス開発であれば、AWS SAMは非常に強力な選択肢となります。

AWS SAM活用におけるベストプラクティス

  • 環境分離を徹底する

    開発、ステージング、本番といった環境ごとに異なるSAMテンプレートや設定ファイルを使用し、安全なデプロイを確保します。sam deploy --stack-name my-app-prod --template template.yaml --parameter-overrides Environment=Prod のように、パラメータで環境を切り替えることも可能です。

  • CI/CDパイプラインと連携する

    Gitリポジトリへのプッシュをトリガーに、自動的にテスト、ビルド、デプロイを行うCI/CDパイプラインを構築することで、開発効率と品質を向上させます。AWS CodePipelineやGitHub Actionsなどとの連携を検討しましょう。

  • IaC (Infrastructure as Code) を維持する

    SAMテンプレートは常にバージョン管理システムで管理し、インフラの変更履歴を追跡可能にすることで、ロールバックやチーム開発を容易にします。

  • セキュリティを考慮した設計

    Lambda関数に付与するIAMロールは、必要最小限の権限のみを与える「最小権限の原則」を遵守します。また、環境変数に機密情報を直接格納せず、AWS Secrets ManagerやAWS Systems Manager Parameter Storeを利用しましょう。

まとめ

AWS SAMは、サーバーレスアプリケーション開発を簡素化し、効率を向上させるための強力なツールです。SAMテンプレートによるリソース定義、SAM CLIによるローカル開発とデプロイといった機能により、開発者はインフラ管理の複雑さから解放され、アプリケーションの価値創出に集中できます。ベストプラクティスを取り入れることで、さらに堅牢で効率的なサーバーレス開発を実現できるでしょう。

関連データ・統計

サーバーレスフレームワーク利用状況 (2024年調査)
グラフを読み込み中...
サーバーレスアプリケーション開発における主要なフレームワーク/ツールの利用率を比較した架空データです。
サーバーレス技術の採用トレンド (過去5年間)
グラフを読み込み中...
サーバーレス技術を採用している企業の割合の推移を示す架空データです。年々その採用が加速していることがわかります。
AWS Lambdaデプロイ方法のシェア (2024年)
グラフを読み込み中...
AWS Lambdaへのデプロイにおいて、AWS SAM CLIが最も多く利用されていることを示す架空データです。