AWS

AWS SAMでLambda開発を効率化!ローカル開発からデプロイまで解説

記事内に商品プロモーションを含む場合があります

こんにちは!今回は、AWS SAM (Serverless Application Model) CLIを使用したLambda関数の開発手順について、実践的な手順を交えながら解説していきます。

SAMとは?

AWS SAM(Serverless Application Model)は、AWSのサーバーレスアプリケーションを構築するためのオープンソースフレームワークです。

SAMを使用することで、Lambda関数、API Gateway、DynamoDBなどのサーバーレスリソースを簡単に定義し、デプロイすることができます。

SAMの主な特徴は以下の通りです:

  • シンプルな構文: CloudFormationの拡張として設計されており、サーバーレスアプリケーションを少ないコードで定義できます
  • ローカルテスト: Lambda関数やAPI Gatewayをローカル環境で実行してテストできます
  • デプロイの自動化: 開発からテスト、本番環境へのデプロイまでをシームレスに行えます
  • 既存のAWSツールとの統合: AWS CloudFormation、AWS CLI、IDEプラグインなどと連携できます

SAM CLIは、このSAMフレームワークをローカル環境で使用するためのコマンドラインツールです。

特にsam initコマンドを使うことで、プロジェクトの雛形を簡単に作成でき、すぐにサーバーレス開発を始めることができます。

開発手順

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

まずは

sam init

コマンドを実行して、新しいプロジェクトを作成します。対話形式で以下の項目を設定していきます:

  • テンプレートソース(AWS Quick Start Templatesなど)
  • アプリケーションテンプレート(Hello World、APIなど)
  • ランタイム(Node.js、Python、Javaなど)
  • パッケージタイプ(ZipまたはImage)
  • その他オプション(X-Ray tracingの有効化など)

以下が例です。
コマンドで聞かれた質問に番号を入力して答えていきます。

$ sam init

You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.

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

Choose an AWS Quick Start application template
        1 - Hello World Example
        2 - Data processing
        3 - Hello World Example with Powertools for AWS Lambda
        4 - Multi-step workflow
        5 - Scheduled task
        6 - Standalone function
        7 - Serverless API
        8 - Infrastructure event management
        9 - Lambda Response Streaming
        10 - Serverless Connector Hello World Example
        11 - Multi-step workflow with Connectors
        12 - GraphQLApi Hello World Example
        13 - Full Stack
        14 - Lambda EFS example
        15 - DynamoDB Example
        16 - Machine Learning
Template: 1

Use the most popular runtime and package type? (python3.13 and zip) [y/N]: N

Which runtime would you like to use?
        1 - dotnet8
        2 - dotnet6
        3 - go (provided.al2)
        4 - go (provided.al2023)
        5 - graalvm.java11 (provided.al2)
        6 - graalvm.java17 (provided.al2)
        7 - java21
        8 - java17
        9 - java11
        10 - java8.al2
        11 - nodejs22.x
        12 - nodejs20.x
        13 - nodejs18.x
        14 - nodejs16.x
        15 - python3.9
        16 - python3.8
        17 - python3.13
        18 - python3.12
        19 - python3.11
        20 - python3.10
        21 - ruby3.3
        22 - ruby3.2
        23 - rust (provided.al2)
        24 - rust (provided.al2023)
Runtime: 13

What package type would you like to use?
        1 - Zip
        2 - Image
Package type: 1

Based on your selections, the only dependency manager available is npm.
We will proceed copying the template using npm.

Select your starter template
        1 - Hello World Example
        2 - Hello World Example TypeScript
Template: 1

Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: N

Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: y
AppInsights monitoring may incur additional cost. View https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/appinsights-what-is.html#appinsights-pricing for more details

Would you like to set Structured Logging in JSON format on your Lambda functions?  [y/N]: N

Project name [sam-app]: my-lambda-app

    -----------------------
    Generating application:
    -----------------------
    Name: my-lambda-app
    Runtime: nodejs18.x
    Architectures: x86_64
    Dependency Manager: npm
    Application Template: hello-world
    Output Directory: .
    Configuration file: my-lambda-app/samconfig.toml
    
    Next steps can be found in the README file at my-lambda-app/README.md
        
Commands you can use next
=========================
[*] Create pipeline: cd my-lambda-app && sam pipeline init --bootstrap
[*] Validate SAM template: cd my-lambda-app && sam validate
[*] Test Function in the Cloud: cd my-lambda-app && sam sync --stack-name {stack-name} --watch

2. プロジェクト構造の確認と修正

生成されたプロジェクトには、主に以下のファイルが含まれています:

  • event.json: テストデータ
  • app.mjs(Node.jsの場合): メインのソースコード
  • template.yaml: SAMテンプレート(関数定義、API Gateway設定など)

Node.jsの場合だと、このapp.mjsがLambdaのコンソール画面でコードを書く部分になります。

3. ビルドとテスト

ローカルでの開発時は、以下のコマンドでビルドを実行します:

sam build --use-container

–use-containerオプションを使用することで、Dockerを利用したビルド環境が自動的に構築されます。

4. ローカルテスト

関数をローカルでテストする場合は、以下のコマンドを使用します:

sam local invoke [関数名] \ 
--event functions/[パス]/events/event.json \ 
--docker-network host

注意点:

  • RDSに接続する場合は、ホスト設定をhost.docker.internalに変更
  • SSHまたはSSM経由でRDSへの接続を確立しておく必要があります

–docker-network host

上の行は任意なので、なくても構いません。

ぼくは、RDSにローカルから繋いでいたため、上のコマンドをつけていました。

5. デプロイ

初回デプロイ時は、以下のコマンドを使用します:

sam deploy --guided CAPABILITY_IAM CAPABILITY_AUTO_EXPAND

2回目以降は単純に:

sam deploy

デプロイ時には以下の項目を設定できます:

  • スタック名
  • AWSリージョン
  • デプロイ前の変更確認
  • IAMロールの自動作成許可
  • ロールバックの設定

まとめ

SAM CLIを使用することで、サーバーレスアプリケーションの開発からデプロイまでを効率的に行うことができます。特に:

  • プロジェクトテンプレートの自動生成
  • ローカル環境でのテスト実行
  • 簡単なデプロイフロー

という特徴があり、開発効率を大きく向上させることができます。

ぜひ、みなさんもSAM CLIを使ってサーバーレス開発を始めてみてください!