
AWSでのサーバーレスアプリケーション開発において、リソース構成やデプロイ作業の複雑さに悩んでいませんか?AWS SAM(Serverless Application Model)を導入すれば、LambdaやAPI Gatewayなどのインフラを簡潔なコード(IaC)で定義し、ローカル環境でのテストやクラウドへの展開をスムーズに実現できます。本記事では、SAMの基礎知識から環境構築、ハンズオンによる実践的な使い方までを徹底解説します。CloudFormationとの違いやTerraformとの比較も交え、開発効率を最大化するノウハウをお届けします。
この記事で分かること
- AWS SAMの仕組みと導入するメリット
- CLIのインストールから環境構築までの手順
- ローカルテストやデプロイの実践的な操作方法
サーバーレス開発を変えるAWS SAMの特徴
AWS SAM(Serverless Application Model)は、AWS上でサーバーレスアプリケーションを構築するために設計されたオープンソースのフレームワークです。AWS LambdaやAmazon API Gateway、Amazon DynamoDBといったサーバーレスリソースを、より簡潔な構文で定義できる点が最大の特徴です。
従来、AWSのインフラ構成管理にはAWS CloudFormationが広く利用されてきましたが、サーバーレス構成においては記述が冗長になりやすいという課題がありました。AWS SAMはこの課題を解決し、少ないコード量で高品質なサーバーレス環境を定義・デプロイすることを可能にします。
AWS SAMが解決する開発の課題
サーバーレス開発において、開発者が直面しやすい課題として「設定の複雑さ」と「ローカル環境でのテストの難しさ」が挙げられます。AWS SAMは、独自の短縮構文(シンタックス)と専用のCLIツールを提供することで、これらのハードルを大幅に下げています。
例えば、AWS CloudFormationでLambda関数とAPI Gatewayを連携させる場合、IAMロールの設定やイベントソースの紐付けなど、数十行にわたる記述が必要でした。しかし、AWS SAMであれば数行の定義で同じ構成を実現できます。これにより、開発者はインフラの設定よりもアプリケーションのロジック作成に集中できるようになります。
AWS SAM導入前後の違いを整理すると、以下のようになります。
| 比較項目 | CloudFormationのみの場合 | AWS SAMを利用した場合 |
|---|---|---|
| テンプレート 記述量 |
非常に多く、詳細な設定が必須 | 短縮構文により大幅に削減可能 |
| 権限設定(IAM) | ロールやポリシーを個別に定義 | 事前定義されたポリシーテンプレートを利用可能 |
| ローカルテスト | 環境構築が複雑で困難 | SAM CLIで簡単にローカル実行が可能 |
| デプロイ手順 | パッケージ化とデプロイのコマンドが別 | シンプルなコマンドでビルドからデプロイまで完結 |
また、AWS SAM CLIを利用することで、AWS上にデプロイする前にローカル環境でLambda関数を実行し、Dockerコンテナ上で動作確認を行うことができます。これにより、デプロイして初めてエラーに気づくという手戻りを防ぎ、開発サイクルを高速化できます。
インフラストラクチャコードとしての利点
AWS SAMは、インフラストラクチャをコードとして管理する「IaC(Infrastructure as Code)」のベストプラクティスに沿って設計されています。SAMテンプレートはYAML形式またはJSON形式で記述され、Gitなどのバージョン管理システムでアプリケーションコードと共に管理できます。
特筆すべき点は、AWS SAMがAWS CloudFormationの拡張機能として動作するということです。デプロイ時にはSAM構文が標準のCloudFormationテンプレートに変換(トランスフォーム)されて実行されます。これには以下のような大きなメリットがあります。
- CloudFormationの全リソースが利用可能:SAMで定義できないリソース(例:VPCやS3の詳細設定など)が必要な場合でも、同じテンプレート内にCloudFormationの構文をそのまま記述できます。
- 信頼性の高いデプロイ:最終的なデプロイは実績のあるCloudFormationを通じて行われるため、ロールバック機能やスタック管理の恩恵をそのまま受けられます。
- 既存資産の活用:すでにCloudFormationを利用しているプロジェクトにも、部分的にSAMを導入することが容易です。
このように、AWS SAMは単なる便利ツールではなく、AWS公式のサーバーレスアプリケーションモデルとして、堅牢なインフラ管理と開発の柔軟性を両立させる仕組みを提供しています。
AWS SAMを利用するための環境構築ステップ
AWS SAM(Serverless Application Model)を使用してサーバーレスアプリケーションを開発するためには、いくつかのツールをローカル環境にインストールし、適切に設定を行う必要があります。開発をスムーズに進めるために、以下の手順に沿って環境を整えましょう。
AWSアカウントの準備とIAM設定
まずはAWSを利用するためのアカウントが必要です。すでにルートアカウントを持っている場合でも、日常的な開発作業にはセキュリティの観点から、管理者権限を持つIAMユーザー(またはIAM Identity Centerのユーザー)を作成して利用することが推奨されます。
AWS SAM CLIがAWSリソースを操作するためには、認証情報(アクセスキーIDとシークレットアクセスキー)が必要です。IAMユーザーを作成する際は、以下の点に注意して設定を行ってください。
- AWSマネジメントコンソールにログインし、IAMダッシュボードを開く
- 「ユーザーの作成」を選択し、任意のユーザー名を入力する
- 許可のオプションで「ポリシーを直接アタッチする」を選択し、AdministratorAccess(または開発に必要な最小限の権限)を付与する
- ユーザー作成後、「セキュリティ認証情報」タブからアクセスキーを作成し、csvファイルをダウンロードして安全に保管する
ここで取得したアクセスキーは、後のステップでAWS CLIを設定する際に使用します。アクセスキーとシークレットアクセスキーは漏洩しないよう厳重に管理してください。
DockerとAWS CLIのセットアップ
AWS SAMの特徴的な機能である「ローカル環境でのLambda関数の実行・デバッグ」を行うためには、Dockerが必要です。SAMはDockerコンテナを使用して、ローカル環境上にLambdaの実行環境をエミュレートします。
また、AWS SAM CLIは内部的にAWS CLI(Command Line Interface)の認証情報を利用してAWSへのデプロイを行います。以下の表を参考に、それぞれのツールをインストールしてください。
| ツール名 | 役割とインストールのポイント |
|---|---|
| Docker | ローカルでのテスト実行に必須です。公式サイトからDocker Desktop(Windows/Mac)またはDocker Engine(Linux)をインストールし、起動状態にしておきます。 |
| AWS CLI | AWSサービスをコマンドラインから操作するツールです。最新のバージョン2(v2)をインストールしてください。 |
AWS CLIのインストールが完了したら、ターミナル(またはコマンドプロンプト)で以下のコマンドを実行し、先ほど取得したIAMユーザーの認証情報を設定します。
aws configureコマンドを実行する- AWS Access Key ID:取得したアクセスキーIDを入力
- AWS Secret Access Key:取得したシークレットアクセスキーを入力
- Default region name:主に使用するリージョン(例:ap-northeast-1)を入力
- Default output format:jsonなどを入力(そのままでも可)
AWS SAM CLIのインストール方法
前提となるツールの準備ができたら、最後にAWS SAM CLI本体をインストールします。OSごとに推奨されるインストール方法が異なります。
- macOSの場合
Homebrewを使用するのが最も簡単です。ターミナルで以下のコマンドを実行します。brew tap aws/tapbrew install aws-sam-cli - Windowsの場合
AWS公式サイトから提供されているMSIインストーラーをダウンロードし、ウィザードに従ってインストールします。 - Linuxの場合
Zipファイルをダウンロードして解凍し、インストールスクリプトを実行する方法が一般的です。Homebrew for Linuxを使用することも可能です。
バージョン番号が表示されれば、AWS SAMを利用した開発環境の構築は完了です。詳細なインストール手順やトラブルシューティングについては、AWS SAM CLI のインストール(AWS公式ドキュメント)もあわせて参照してください。
ハンズオン形式で学ぶAWS SAMの実践的な使い方
AWS SAM(Serverless Application Model)の概念や環境構築が理解できたところで、実際に手を動かしながらアプリケーションを作成・デプロイする手順を解説します。ここでは、標準的な「Hello World」アプリケーションを構築し、AWSクラウド上へ展開するまでの一連の流れをハンズオン形式で進めていきます。
サンプルアプリケーションの作成と構造確認
まずは、SAM CLIの初期化コマンドを使用して、ベースとなるプロジェクトを作成します。ターミナル(またはコマンドプロンプト)を開き、任意の作業ディレクトリで以下のコマンドを実行してください。
コマンドを実行すると、対話形式でいくつかの設定項目が質問されます。ここでは学習用として、AWSが提供するテンプレート(AWS Quick Start Templates)を選択し、ランタイムには利用者が多い「Python」や「Node.js」などを指定するのがおすすめです。今回は例として「Hello World Example」を選択したと仮定して進めます。
プロジェクトの作成が完了すると、ディレクトリ内に以下のような主要ファイルが生成されます。それぞれの役割を理解しておくことが、スムーズな開発の第一歩です。
| ファイル/ディレクトリ名 | 役割と概要 |
|---|---|
| template.yaml | SAMテンプレートファイル。Lambda関数、API Gateway、DynamoDBなどのリソース定義を記述します。 |
| hello_world/ | Lambda関数のソースコードが格納されるディレクトリ(app.pyやapp.jsなど)。 |
| events/ | ローカルテストで使用するイベントデータ(JSON形式)を格納するディレクトリ。 |
| samconfig.toml | デプロイ時の設定(スタック名やリージョンなど)を保存する設定ファイル。 |
特に重要なのが template.yaml です。これはCloudFormationテンプレートの拡張版であり、少ない記述量でサーバーレスリソースを定義できる仕組みになっています。
テンプレートファイルの編集とリソース追加
生成された template.yaml をエディタで開き、中身を確認してみましょう。Resources セクションには、Lambda関数やAPI Gatewayの設定が記述されています。
開発の現場では、デフォルトの設定をそのまま使うことは少なく、要件に合わせてカスタマイズを行います。例えば、Lambda関数のタイムアウト時間を変更したり、環境変数を追加したりする場合は、以下のようにYAMLファイルを編集します。
- Timeoutの変更: デフォルトの3秒から処理時間に合わせて数値を変更します。
- Environmentの追加: データベースの接続文字列やAPIキーなどを環境変数として渡す設定を記述します。
テンプレートを編集することで、インフラ構成をコードとして管理(IaC)できるため、再現性の高い開発が可能になります。
ローカル環境でのLambda関数実行とデバッグ
AWSへデプロイする前に、ローカル環境で動作確認を行います。AWS SAM CLIはDockerコンテナを利用して、ローカルPC上でLambda関数の実行環境をシミュレートします。
まず、ソースコードやテンプレートの変更を反映させるためにビルドを行います。
ビルドが成功したら、以下のコマンドでLambda関数を単体実行できます。
また、API Gateway経由での動作を確認したい場合は、ローカルサーバーを立ち上げることが可能です。
このコマンドを実行すると、ローカルホスト(例: http://127.0.0.1:3000/hello)でAPIエンドポイントにアクセスできるようになります。これにより、クラウド上にデプロイする時間を待つことなく、高速なフィードバックループで開発を進められるのがSAMの大きなメリットです。
AWS環境へのデプロイと動作確認
ローカルでのテストが完了したら、いよいよAWS環境へアプリケーションをデプロイします。初回デプロイ時は、ガイド付きモードを使用するのが便利です。
このコマンドを実行すると、スタック名(Stack Name)、AWSリージョン、パラメータの確認などが対話形式で求められます。設定した内容は samconfig.toml に保存されるため、2回目以降は単に sam deploy と打つだけで、差分のみを自動的に更新・デプロイできます。
デプロイが完了すると、ターミナル上に作成されたAPI GatewayのエンドポイントURLが表示されます。ブラウザやcurlコマンドでそのURLにアクセスし、正常にレスポンスが返ってくれば、サーバーレスアプリケーションの公開は成功です。
- CloudFormationコンソールでスタックが作成されているか確認する
- Lambdaコンソールで関数が登録されているか確認する
- 不要になった場合は
sam deleteコマンドでリソースを一括削除し、課金を防ぐ
AWS SAMでの開発効率を高める便利機能
AWS SAM(Serverless Application Model)を利用する最大のメリットの一つは、AWS SAM CLIに組み込まれた開発支援機能です。単にリソースを定義してデプロイするだけでなく、日々のコーディングやデバッグ作業のストレスを軽減するためのコマンドが用意されています。ここでは、特に開発サイクルを加速させる2つの主要な機能について解説します。
sam logsコマンドによるログ確認の効率化
サーバーレス開発において、AWS Lambda関数のログを確認するためにAWSマネジメントコンソールとローカルのエディタを頻繁に行き来するのは、開発効率を下げる要因となります。「sam logs」コマンドを使用すると、ターミナルから直接CloudWatch Logsのログを取得・表示することが可能です。
このコマンドを利用することで、スタック名やリソースIDを指定するだけで、関連するロググループからログを自動的に集約して表示できます。特に便利なのが、ログをリアルタイムで監視できるテール機能です。
- ログの集約:CloudFormationスタック内の全関数のログをまとめて確認可能
- リアルタイム監視:
--tailオプションを付けることで、ログが生成されるたびにターミナルに流れるように表示 - 期間指定:
--start-timeや--end-timeオプションで、特定の時間帯のログのみを抽出
例えば、API Gateway経由でLambda関数を呼び出しながら、別のターミナルウィンドウでsam logs -n 関数名 --stack-name スタック名 --tailを実行しておけば、実行結果やエラーログを即座に手元で確認でき、デバッグのスピードが格段に向上します。
sam syncによる開発環境との高速同期
従来のサーバーレス開発では、コードを少し修正するたびにsam buildとsam deployを実行する必要があり、CloudFormationスタックの更新完了まで数分待たされることが課題でした。これを解決するのが、「AWS SAM Accelerate」の一環として提供されている「sam sync」コマンドです。
sam sync --watchコマンドを実行すると、ローカルでのファイル変更を検知し、必要な部分のみをAWSクラウド上の開発環境へ即座に同期します。Lambda関数のコード修正のようなインフラ構成に関わらない変更であれば、CloudFormationの完全なデプロイプロセスを経ずにサービスAPIを直接利用して更新するため、数秒で反映が完了します。
以下の表は、通常のデプロイコマンドと同期コマンドの主な違いを整理したものです。
| 機能 | sam deploy | sam sync --watch |
|---|---|---|
| 更新プロセス | CloudFormationのチェンジセットを作成・実行 | コード変更はAPIで直接更新、インフラ変更はCFnで更新 |
| 反映速度 | 数分(リソース量に依存) | 数秒(コード変更の場合) |
| 主な用途 | 本番環境への適用、CI/CDパイプライン | 開発中の動作確認、トライアンドエラー |
| 自動検知 | なし(手動実行が必要) | あり(ファイル保存時に自動実行) |
この機能により、ローカルでコードを保存した直後にクラウド上で動作確認を行うという、ホットリロードに近い開発体験が得られます。ただし、sam syncは開発環境での利用を想定しており、本番環境のデプロイには履歴管理や承認フローの観点から、引き続きsam deployやCI/CDパイプラインの利用が推奨されます。
AWS SAMに関するよくある質問
AWS SAM(Serverless Application Model)を導入するにあたり、エンジニアや開発担当者から頻繁に寄せられる疑問点をまとめました。既存のIaCツールとの違いやコスト面、トラブルシューティングについて解説します。
AWS SAMとCloudFormationの主な違いは何ですか?
AWS SAMは、AWS CloudFormationを拡張したフレームワークです。最大の違いは「抽象化のレベル」と「記述量」にあります。SAMはサーバーレスアプリケーションの構築に必要なリソース(Lambda関数、API Gateway、DynamoDBなど)を簡潔な構文で定義できるよう設計されています。
実際には、SAMテンプレートはデプロイ時にCloudFormationテンプレートへと変換(トランスフォーム)されて処理されます。つまり、SAMはCloudFormationの機能を内包しつつ、より効率的に記述できるラッパーのような存在と言えます。
両者の主な違いを以下の表に整理しました。
| 比較項目 | AWS SAM | AWS CloudFormation |
|---|---|---|
| 記述量 | 少ない(サーバーレスリソースに特化して簡略化) | 多い(詳細な設定まですべて記述が必要) |
| 対象リソース | 主にサーバーレス関連(Lambda, API, Tableなど) | AWSのほぼすべてのリソース |
| デプロイの 仕組み |
CloudFormationに変換されてデプロイ | 直接デプロイ |
| ローカル テスト |
SAM CLIにより容易に可能 | 単体では難しい(他ツールとの併用が必要) |
AWS SAM自体の利用に料金はかかりますか?
いいえ、AWS SAM自体(SAM CLIやSAMテンプレートの仕様)を利用することに追加料金はかかりません。オープンソースのフレームワークとして提供されています。
ただし、SAMを使用して構築・実行されるAWSリソース(AWS Lambda、Amazon API Gateway、Amazon DynamoDBなど)の利用料は通常通り発生します。また、デプロイ時に使用されるAmazon S3(アーティファクトの保存用)や、CloudFormationのスタック操作に対しても、通常のAWS料金体系が適用されます。
TerraformとAWS SAMはどちらを使うべきですか?
プロジェクトの要件やチームのスキルセットによって最適なツールは異なりますが、一般的に以下の基準で選定されることが多いです。
- AWS SAMが適しているケース:AWSのみを利用し、特にLambdaを中心としたサーバーレスアーキテクチャを構築する場合。AWS公式サポートやCloudFormationとの完全な互換性を重視するとき。
- Terraformが適しているケース:AWS以外のクラウド(GCP, Azure)やオンプレミス環境も含めたマルチクラウド管理が必要な場合。サーバーレス以外のインフラ構成要素が非常に多く、複雑な状態管理(State管理)を行いたいとき。
AWS環境でのサーバーレス開発スピードを最優先する場合は、ローカルテスト機能が充実しているAWS SAMが強力な選択肢となります。
AWS SAMを使ってローカル環境でテストする方法は?
AWS SAM CLIに含まれる sam local コマンド群を使用することで、AWSにデプロイする前にローカル環境でLambda関数やAPIの動作確認が可能です。
具体的には、Dockerコンテナ上でLambda実行環境をエミュレートします。そのため、ローカルテストを行うには事前にDocker Desktopなどのコンテナランタイムをインストールし、起動しておく必要があります。
sam local invoke:Lambda関数を単体で実行し、イベントデータを渡して処理結果を確認できます。sam local start-api:ローカルホスト上にAPI Gatewayのエンドポイントを立ち上げ、ブラウザやcurlコマンドからAPIリクエストをテストできます。
AWS SAM CLIのインストールがうまくいかない時の対処法は?
インストール時にエラーが発生する場合、いくつかの共通した原因が考えられます。環境構築でつまずいた際は、以下のポイントを確認してください。
- 前提ツールの確認:AWS SAM CLIは内部でAWS CLIやDockerを使用する機能があります。これらが正しくインストールされ、PATHが通っているか確認してください。
- Pythonのバージョン:pipでインストールする場合、サポートされているPythonのバージョンと一致しているか確認が必要です。
- Dockerの起動状態:インストール自体はできても、
sam localコマンドが動かない場合は、Dockerが起動していないケースが大半です。 - 権限の問題:WindowsやmacOSでインストーラーを使用する場合、管理者権限が必要なことがあります。
特にmacOSユーザーの場合はHomebrew、Windowsユーザーの場合はMSIインストーラーを使用するのが公式で推奨される最も安定した方法です。
AWS SAMとCloudFormationの主な違いは何ですか?
AWS SAM(Serverless Application Model)とAWS CloudFormationは、どちらもAWSのリソースをコードで定義して管理するIaC(Infrastructure as Code)ツールですが、その役割と得意分野には明確な違いがあります。結論から言えば、AWS SAMはCloudFormationをサーバーレス開発向けに拡張・簡略化したツールです。
AWS SAMで記述されたテンプレートファイルは、デプロイのプロセスにおいてCloudFormationの構文に変換(トランスフォーム)されて処理されます。そのため、SAMはCloudFormationと競合するものではなく、CloudFormationの機能を包含しつつ、サーバーレス特有の利便性を追加した上位互換のような存在と言えます。
テンプレート記述量の削減と可読性の向上
最も大きな違いは、インフラ定義に必要なコードの量です。CloudFormationですべてのリソースを定義しようとすると、IAMロールや権限設定などを含めて記述が冗長になりがちです。一方でAWS SAMは「短縮記法」と呼ばれる構文を採用しており、サーバーレスアプリケーションで頻繁に使用されるリソースを非常に少ない行数で定義できます。
例えば、API GatewayをトリガーとするLambda関数を作成する場合、CloudFormationでは数十行の記述が必要になることがありますが、AWS SAMであれば数行の記述で完結します。これにより、開発者はインフラの細かい設定よりもアプリケーションのロジックに集中しやすくなります。
ローカル環境でのテストとデバッグ機能
開発効率に直結する大きな違いとして、ローカル環境での実行能力が挙げられます。AWS SAM CLIを利用すると、Dockerコンテナ上でLambda関数をローカルにエミュレートし、デプロイ前に動作確認やデバッグを行うことが可能です。
CloudFormation単体では、基本的にAWS環境へデプロイするまで動作を確認できませんが、AWS SAMを使用することで、ローカルでのテストとデバッグを高速に繰り返すことができ、開発サイクルを大幅に短縮できます。
機能と特徴の比較一覧
AWS SAMとCloudFormationの主な違いを整理すると以下のようになります。
| 比較項目 | AWS SAM | AWS CloudFormation |
|---|---|---|
| 主な用途 | サーバーレスアプリケーションの開発・デプロイ | AWS全リソースの包括的な管理 |
| テンプレート 構文 |
簡潔な短縮記法(AWS::Serverless) | 詳細な完全記述(AWS::*) |
| ローカルテスト | SAM CLIで可能(sam local) | 標準機能では不可 |
| デプロイの 仕組み |
CloudFormationを経由してデプロイ | 直接CloudFormationスタックとして作成 |
どちらを使用すべきかの判断基準
基本的には、LambdaやAPI Gatewayを中心としたサーバーレスアーキテクチャを採用する場合は、AWS SAMの利用が推奨されます。ただし、SAMテンプレート内には通常のCloudFormationのリソース定義を混在させることが可能です。
したがって、完全にどちらか一方を選ぶ必要はありませんが、ベースとしてAWS SAMを採用し、SAMの短縮記法でカバーできないリソース(VPCの詳細設定や複雑なネットワーク構成など)が必要な場合のみ、同じファイル内にCloudFormationの構文を記述するというハイブリッドな運用が最も効率的です。
- サーバーレスリソース(Lambda, DynamoDBなど)はSAM構文で記述する
- ローカルテストを活用して開発スピードを上げる
- SAMで対応していないリソースはCloudFormation構文で補完する
AWS SAM自体の利用に料金はかかりますか?
結論から申し上げますと、AWS SAM(Serverless Application Model)というフレームワーク自体の利用には料金は一切かかりません。
AWS SAMはオープンソース(Apache 2.0 ライセンス)として提供されているツールであり、AWS SAM CLI(コマンドラインインターフェース)をパソコンにインストールしたり、テンプレートファイルを記述したりすることに対して課金されることはありません。しかし、AWS SAMを使って構築・デプロイした「AWSリソース」に対しては、それぞれの料金体系に基づいて利用料が発生します。
AWS SAM利用時の料金発生の仕組み
AWS SAMは、内部的にAWS CloudFormationを利用してインフラ構築を行います。そのため、料金の考え方はCloudFormationと同様です。ツールとしての利用料と、実際に稼働するリソースの利用料を区別して理解しておくことが重要です。
| 項目 | 料金 | 備考 |
|---|---|---|
| AWS SAM CLI のインストール | 無料 | ローカル環境での利用 |
| SAM テンプレートの記述 | 無料 | コードとしての定義 |
| AWS CloudFormation の利用 | 無料 | 標準的なスタック作成の場合 |
| 作成されたAWSリソース | 有料 | Lambda, API Gateway, DynamoDBなど |
課金対象となる主なAWSリソース
AWS SAMを使用してサーバーレスアプリケーションをデプロイすると、テンプレートに定義されたリソースがAWSアカウント上に作成されます。これらは従量課金制(Pay-as-you-go)が適用されるため、リクエスト数や実行時間、データ保存量に応じて料金が発生します。
具体的に課金対象となりやすいリソースは以下の通りです。
- AWS Lambda:関数のリクエスト数と実行時間(メモリ割り当て量に依存)に応じて課金されます。
- Amazon API Gateway:APIへの呼び出し回数やデータ転送量に応じて課金されます。
- Amazon DynamoDB:データの読み書き容量やストレージ使用量に応じて課金されます。
- Amazon S3:アプリケーションのコードやSAMテンプレートを保存するためのストレージ料金が発生します。
特にAmazon S3については、sam deployコマンドを実行する際に、デプロイ用のアーティファクト(ZIP化されたコードなど)をアップロードするための一時的なバケットが必要となります。このバケットに保存されるデータの容量に対しても、S3の標準的な料金がかかる点を認識しておきましょう。
コストを抑えるためのポイント
開発段階では、AWSが提供している「AWS 無料利用枠」を有効活用することで、コストを最小限に抑えることが可能です。LambdaやDynamoDBには期限なしの無料枠が含まれている場合があるため、学習や小規模なテストであれば無料で運用できることも少なくありません。
詳細な料金体系については、必ず公式の情報を確認するようにしてください。
参考:AWS Serverless Application Model (AWS SAM) の公式サイト
TerraformとAWS SAMはどちらを使うべきですか?
インフラストラクチャコード(IaC)を導入する際、AWS SAMとTerraformのどちらを採用すべきかは、プロジェクトの規模や要件によって大きく異なります。両者は競合するツールのように見えますが、解決しようとしている課題の領域が少し異なるため、それぞれの特性を理解して選択することが重要です。
機能と役割の比較表
まず、両者の主な違いを整理します。AWS SAMは「サーバーレスアプリケーションの開発」に特化しているのに対し、Terraformは「クラウドインフラ全体の管理」を得意としています。
| 比較項目 | AWS SAM | Terraform |
|---|---|---|
| 対応プラット フォーム |
AWS(サーバーレス特化) | AWS, Azure, GCPなどマルチクラウド |
| 記述言語 | YAML, JSON | HCL (HashiCorp Configuration Language) |
| バックエンド | AWS CloudFormation | Terraform Core (State file) |
| ローカルテスト | 強力(Lambdaのローカル実行が可能) | 限定的(基本はデプロイして確認) |
AWS SAMを選ぶべきケース
AWS SAMは、AWS CloudFormationの拡張機能として設計されており、特にLambda関数やAPI Gatewayを中心としたアーキテクチャにおいてその真価を発揮します。
- サーバーレス開発に集中したい場合
Lambda、DynamoDB、API Gatewayなどのリソース定義を簡略化して記述できるため、開発スピードが向上します。 - ローカル環境でのテストを重視する場合
sam localコマンドを使用することで、AWSにデプロイする前に手元のPCで関数の動作確認やデバッグが可能です。 - AWS CloudFormationの知識を活かしたい場合
SAMテンプレートは最終的にCloudFormationテンプレートに変換されるため、既存のAWSナレッジをそのまま活用できます。
Terraformを選ぶべきケース
HashiCorp社が開発するTerraformは、業界標準のIaCツールとして広く利用されており、AWS以外のリソースも含めた統合管理に優れています。
- マルチクラウド環境を利用している場合
AWSだけでなく、GCPやAzure、さらにはDatadogやGitHubなどのSaaS設定まで、同一のワークフローで管理したい場合に最適です。 - サーバーレス以外のインフラも細かく管理したい場合
VPCの複雑なネットワーク設計、EC2インスタンス、RDSなど、サーバーレス以外の基盤構築においては、HCLによる記述の方が柔軟性が高いケースがあります。 - ステート管理を厳密に行いたい場合
Terraformはインフラの状態を「tfstateファイル」で管理するため、リソースの差分検知や変更計画(Plan)の確認が非常に強力です。
ハイブリッドな構成という選択肢
必ずしもどちらか一方に絞る必要はありません。実際の開発現場では、それぞれの強みを活かして併用するパターンも増えています。
例えば、VPCやデータベース、セキュリティグループといった「変更頻度の低い土台となるインフラ」はTerraformで管理し、頻繁にコード修正が発生する「Lambda関数やAPI定義」はAWS SAMで管理するといった使い分けです。これにより、インフラ管理の堅実さとアプリケーション開発の俊敏性を両立させることが可能になります。
結論として、プロジェクトが「AWS上のサーバーレスアプリ開発」に特化しているならAWS SAMを、将来的な拡張性や「インフラ全体の統一管理」を重視するならTerraformを選択するのが定石と言えるでしょう。
AWS SAMを使ってローカル環境でテストする方法は?
AWS SAM(Serverless Application Model)の大きな利点の一つは、AWSクラウド上にリソースをデプロイすることなく、ローカル環境でLambda関数やAPI Gatewayの動作をシミュレーションできる点です。これにより、開発中のフィードバックループを短縮し、デバッグを効率的に行うことが可能です。
ローカルテストを実行するには、Dockerがインストールされ、起動している必要があります。AWS SAM CLIはDockerコンテナを利用して、AWS Lambdaの実行環境をローカルで再現するためです。
Lambda関数を単体で実行する(sam local invoke)
作成したLambda関数を単体でテストしたい場合は、sam local invokeコマンドを使用します。このコマンドは、指定した関数をDockerコンテナ上で一度だけ実行し、その結果を出力して終了します。
例えば、S3へのファイルアップロードやSNS通知など、特定のイベントトリガーによって実行される関数の挙動を確認する際に役立ちます。テスト用のイベントデータ(JSON形式)を渡すことで、本番環境に近い状況を作り出すことができます。
- 基本的な実行方法:関数名を指定してコマンドを実行すると、Lambda関数のログと戻り値がコンソールに表示されます。
- イベントデータの生成:
sam local generate-eventコマンドを使用すると、S3やDynamoDBなどの主要なAWSサービスのサンプルイベントペイロードを生成できます。 - ファイルからの入力:生成したJSONファイルを
-eオプションで指定することで、特定の入力値に対する関数の動作を検証できます。
詳細なコマンドの使用方法については、AWS SAM CLI コマンドリファレンスを参照してください。
API Gateway経由の動作をエミュレートする(sam local start-api)
API Gatewayと連携するLambda関数を開発している場合は、sam local start-apiコマンドが非常に便利です。このコマンドを実行すると、ローカル環境にHTTPサーバーが立ち上がり、テンプレートファイル(template.yaml)で定義されたAPIエンドポイントにアクセスできるようになります。
ブラウザやcurl、Postmanなどのツールを使って、http://localhost:3000/helloのようなURLへリクエストを送ることで、API GatewayからLambda関数が呼び出される一連の流れをテストできます。
- ローカルサーバーを起動したままコードを修正すると、再起動なしで変更が反映される(ホットリロード)ため、開発効率が向上します。
- HTTPリクエストのヘッダーやボディが正しくLambdaに渡されているかを確認できます。
- CORS(Cross-Origin Resource Sharing)の設定確認もローカルで行うことが可能です。
テスト実行時に役立つ主要なコマンドオプション
ローカルテストを行う際、環境変数の設定やデバッグポートの指定など、状況に応じたオプションを利用することで、より柔軟な検証が可能になります。以下に、頻繁に使用される主なオプションを整理しました。
| オプション | 説明 |
|---|---|
--env-vars |
JSONファイルを指定して、Lambda関数の環境変数をローカル実行時に上書き設定します。本番用とは異なるDB接続先などを指定する際に使用します。 |
--docker-network |
Lambda関数が実行されるDockerコンテナを、既存のDockerネットワークに接続します。ローカルで起動しているDBコンテナと通信させたい場合に必須となります。 |
--debug-port |
デバッガーを接続するためのポートを指定します。IDEのブレークポイント機能を使って、コードを一行ずつステップ実行したい場合に利用します。 |
--profile |
AWSリソース(DynamoDBやS3など)へアクセスする際に使用する、AWS CLIのプロファイルを指定します。 |
これらの機能を活用することで、デプロイ待ちの時間を削減し、手元の環境で高品質なサーバーレスアプリケーションを構築することができます。
AWS SAM CLIのインストールがうまくいかない時の対処法は?
AWS SAM CLIのインストール中にエラーが発生したり、インストール後にコマンドが認識されなかったりするトラブルは珍しくありません。原因の多くは、環境変数の設定漏れや前提となるソフトウェアの不足にあります。
ここでは、インストールがうまくいかない際に見直すべきポイントと、OS別の具体的な解決策を解説します。
前提条件と環境変数の確認
AWS SAM CLIを利用するためには、AWS CLIやDockerなど、いくつかの前提条件を満たしている必要があります。まずは以下のチェックリストで基本的な環境が整っているか確認しましょう。
- AWSアカウントの登録が完了しているか
- IAMユーザーのアクセスキーとシークレットキーが手元にあるか
- AWS CLIがインストールされ、
aws configureで設定済みか - Docker Desktopがインストールされ、起動しているか
PATH(パス)の設定漏れをチェックする
インストールが完了したはずなのに、ターミナルやコマンドプロンプトでsam --versionと入力しても「command not found」や「認識されていません」と表示される場合、実行ファイルのパス(PATH)が通っていない可能性が高いです。
インストーラーを使用した場合は自動的に設定されることが多いですが、手動で設定が必要な場合や、シェルの再起動が必要な場合があります。一度ターミナルを完全に閉じてから再起動し、再度コマンドを試してみてください。
Docker Desktopが起動しているか確認する
AWS SAMを使ってローカル環境でLambda関数をテストする場合、Dockerコンテナが裏側で動作します。そのため、Docker Desktopがインストールされていても、起動していなければエラーになります。
よくあるエラーメッセージとして、Error: Running AWS SAM projects locally requires Docker. Have you got it installed?が表示された場合は、Docker Desktopアプリを立ち上げ、ステータスが「Running」になっていることを確認してください。
OS別のよくあるエラーと解決策
利用しているオペレーティングシステムによって、発生しやすいトラブルの傾向が異なります。以下に代表的なエラーと対処法をまとめました。
| OS | よくある現象 | 主な対処法 |
|---|---|---|
| Windows | インストール中に権限エラーが出る | インストーラー(MSIファイル)を管理者として実行する |
| macOS | Homebrewでのインストールが失敗する | 公式のpkgインストーラーを使用する |
| Linux | Zip解凍や実行権限のエラー | sudoを用いて実行権限を付与する |
Windowsでのインストールエラー
Windows環境では、セキュリティソフトがインストーラーの挙動をブロックすることがあります。また、WSL2(Windows Subsystem for Linux 2)を使用している場合、Windows側とWSL側でパスの共有設定がうまくいっていないケースもあります。
基本的にはAWSが提供している公式のWindowsインストーラーを使用し、インストール後は必ずコマンドプロンプトやPowerShellを再起動してください。
macOS(Homebrew)でのインストールエラー
以前はHomebrewを使ったインストールが一般的でしたが、AWS公式によるHomebrewインストーラー(aws/tap/aws-sam-cli)のメンテナンスは2023年9月に終了しています。そのため、Homebrew経由でのインストールやアップグレードで警告が出たり、失敗したりすることがあります。
現在は、macOS向けのpkgインストーラー(ネイティブインストーラー)の利用が推奨されています。Homebrew版で不具合が出た場合は、一度アンインストールしてから公式インストーラーを試すことを強くおすすめします。
Linuxでのインストールエラー
Linux環境では、Linuxbrewを使う方法もありますが、パスや依存関係のトラブルが起きやすい傾向にあります。AWS公式ドキュメントでは、Zipファイルをダウンロードして手動でインストールする手順が案内されています。
特に/usr/local/binなどのシステムディレクトリへの書き込み権限がない場合、sudoを付けてコマンドを実行するか、ユーザーディレクトリ配下にインストール先を変更する必要があります。
インストール方法を変えて試す
もし、OS標準のインストーラーでどうしても解決しない場合は、Pythonのパッケージ管理ツールであるpipを使ってインストールする方法もあります(Python環境が構築されている場合)。
ただし、pipでのインストールは依存ライブラリのバージョン競合などが起きる可能性があるため、仮想環境(venvなど)の中で行うのが安全です。まずは推奨されているネイティブインストーラーでの導入を最優先に考え、最終手段として検討してください。
まとめ
本記事では、AWS SAMの特徴から環境構築、実践的なデプロイ手順までを解説しました。AWS SAMは、複雑になりがちなサーバーレスリソースの定義を簡略化し、開発サイクルを高速化するための強力なフレームワークです。
記事の要点は以下の通りです。
- CloudFormationの拡張版であり、少ないコード記述でインフラ管理が可能
- Dockerを活用したローカル環境でのLambda関数のテストやデバッグが容易
- sam syncなどの機能により、クラウド環境との同期やログ確認の効率が向上する
まずはAWSアカウントとCLIの準備を整え、簡単なサンプルアプリケーションのデプロイから始めてみましょう。AWS SAMを活用して、快適なサーバーレス開発を実現してください。









