0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SAM で Lambda をデプロイして Hello World

0
Last updated at Posted at 2026-02-15

はじめに

AWS SAMによるサーバーレスアプリケーション開発入門

上記の記事通りに SAM を設定してリソースをデプロイしただけの備忘録になります。

前提環境

  • Windows 11
  • PowerShell
  • VSCode
  • aws-cli
    • 2.33.6
  • Python
    • 3.12.7
  • GitLab

準備

  • SAM CLI のインストール
  • インストールできているか確認する
sam --version

手順

SAM による Lambda のデプロイでは

  1. zip ファイルによるデプロイ
  2. Docker Image によるデプロイ

の 2 つがあり、本記事では zip ファイルを使用する方法で進めます。

1. SAM プロジェクトの新規作成

sam init コマンドで公式のテンプレートをダウンロードしてから改変する方法で進めます。

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

どのテンプレートを選ぶか選択肢が出るので、1 を入力して Enter を押します。

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:

Python 3.14 + zip でデプロイするか尋ねられます。
Python のバージョン指定をしたいのでそのまま Enter を入力します。

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

使いたいプログラミング言語を選択します。
今回は 19 と入力します。

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

Lambda はコードを zip ファイルにいれるか Docker Image を使うかの選択肢が表示されます。
今回は zip ファイルなので 1 を入力します。

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

詳細なログをとるための機能たちを有効にするか聞かれますが、今回は不要なためすべて Enter で進めます。

Would you like to enable X-Ray tracing on the function(s) in your application?  [y/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]:

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

最後にプロジェクトの名前を尋ねられます。
今回は sam-app-handson とします。

Project name [sam-app]: sam-app-handson

作成後は、以下のファイル群が作成されます。

image.png

2. template.yaml に CloudWatch Logs の設定を追記

template.yaml に CloudWatch Logs の設定を追記

LogGroup の設定を明示しない場合、Lambda の実行時に自動的に LogGroup が作成されますが、SAM の Stack の外 に作成されます。
そのため、SAM アプリを削除して Stack が削除されても LogGroup は削除されずに残ってしまいます。

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.12
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
+  # CloudWatch Logsの設定。ログもSAMで管理したいなら明示的な設定が必要
+  HelloWorldFunctionLogGroup:
+    Type: AWS::Logs::LogGroup
+    Properties:
+      LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
+      RetentionInDays: 14  # ログの保持日数

変更したら、sam validate で template.yaml に構文エラーがないか確認します。

sam validate

3. アプリのビルド

SAM ではアプリをデプロイする前にビルドを行う必要があります。
以下のコマンドでビルドを行います。

sam build

4. アプリのデプロイ

次のコマンドでアプリをデプロイします。

sam deploy

途中で、デプロイしても問題ないか聞いてくるので、y を選択します。

Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]:y

5. 動作確認

template.yaml の Outputs のセクションにて API の URL を出力するようになっているので、デプロイ時に URL を確認できます。

CloudFormation outputs from deployed stack
-----------------------------------------------------------------------------------------------------------------------------   
Outputs
----------------------------------------------------------------------------------------------------------------------------- 
...(中略)...

Key                 HelloWorldApi
Description         API Gateway endpoint URL for Prod stage for Hello World function
Value               https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

...(中略)...
----------------------------------------------------------------------------------------------------------------------------- 

この URL をブラウザで開くか curlコマンドで GET リクエストを送ると

{"message": "hello world"}

と返ってくるはずです。

6. sam sync --watch の実行

ローカルでのコード変更を自動的にクラウド環境へ反映するための設定を行います。
これを実行することで開発効率が大きく上がります。

sam sync --watch

コマンドを実行すると以下の警告文が表示されます。

The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code without
performing a CloudFormation deployment. This will cause drift in your CloudFormation stack.
**The sync command should only be used against a development stack**.

Confirm that you are synchronizing a development stack.

Enter Y to proceed with the command, or enter N to cancel:
 [Y/n]: Y

sam sync --watch は CloudFormation を通さず直接 Lambda を更新するため、
スタック定義と実体にズレが生じることを警告しています。

sam sync --watch は便利ではありますが使用するのは開発環境だけにとどめて、
本番環境では使わないようにしましょう。

7. コードの変更

Lambda のコードを定義している app.py を編集し、
リアルタイムに変更が反映されるか確認してみましょう。

def lambda_handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world!!!!!!!!!!!!!!!!!!!", # レスポンス文の末尾に ! を多数追加
            # "location": ip.text.replace("\n", "")
        }),
    }

上記の変更をした上で、
API の URL をブラウザで開くか curlコマンドで GET リクエストを送ると

{"message": "hello world!!!!!!!!!!!!!!!!!!!"}

が返ってくるはずです。

また変更を戻して、

def lambda_handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world", # レスポンス文の末尾の ! を削除
            # "location": ip.text.replace("\n", "")
        }),
    }

API の URL をブラウザで開くか curlコマンドで GET リクエストを送ると

{"message": "hello world"}

が返ってくるはずです。

7. リソースの削除

SAM で管理しているリソースは次のコマンドで一括削除できます。

sam delete

コマンドを実行すると以下が尋ねられます。

Are you sure you want to delete the stack sam-app-handson in the region ap-northeast-1 ? [y/N]: y
Do you want to delete the template file 67b381ee6d8782cf9b04917ed8adbb89.template in S3? [y/N]: y
  1. 本当にスタックを削除しても良いか?
  2. SAM が S3 にアップロードしたデプロイ用テンプレートファイルも削除するか?

と聞かれているので、すべて y を入力します。

デプロイ用テンプレートファイルとは?

sam deploy を実行すると、
ローカルの template.yaml と Lambda コードは一度 S3 にアップロードされます。
そして CloudFormation は、その S3 に置かれたテンプレート を使ってリソースを作成・更新します。

まとめ

AWS SAMによるサーバーレスアプリケーション開発入門の解説に沿って、SAM で Hello World テンプレートを作成してみました。

これを基本にして、サーバーレスアプリ開発に応用していけたらいいなと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?