AWS SAM：Lambda × API Gateway で構築する Hello World チュートリアルをやってみた

## はじめに

サーバーレスアプリケーションの開発を簡単にしてくれる AWS SAM（Serverless Application Model）。

https://aws.amazon.com/jp/serverless/sam/

この記事では、Mac 上（Appleシリコン）で AWS SAM CLI をインストールし、Hello World アプリケーションを AWS にデプロイするまでの流れをまとめます。

**内容に不備などがございましたら、お手数ですが優しくご指摘いただけますと幸いです。**

## AWS SAM（Serverless Application Model）とは？

> AWS Serverless Application Model （AWS SAM) は、Infrastructure as Code (IaC) を使用してサーバーレスアプリケーションを構築するためのオープンソースフレームワークです。

引用元：https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html

CloudFormation をベースにしており、Lambda 関数、API Gateway、DynamoDB、S3 などのリソースを簡単な構文で定義できるのが特徴です！

`sam` コマンドを使うことで、ローカル開発・シミュレーション・クラウドへのデプロイを一貫して行うことができます（とても便利で感動しました！）。

**参考文献**

https://dev.classmethod.jp/articles/re-introducation-2022-aws-sam/

https://blog.serverworks.co.jp/sam-getting-started

## 書こうと思ったきっかけ

以前からSAMにめちゃくちゃ興味があり、実際に手を動かして検証してみたいと思っていました。サーバーレス構成やデプロイフローの理解を深めたかったこともあり、簡単な検証の記録として残していきます...！

**こんな感じの検証内容です**

![Screenshot 2025-06-07 at 7.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/955a1252-2d5e-47db-a7e3-c5dfdb513866.png)

引用元：https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html

## ■ 前提条件

以下のツールがインストール済みであること：

* AWS CLI（aws configure 設定済み）

**AWS CLIの設定がまだの方は、参考にしてみてください！**

https://qiita.com/free-honda/items/866986d98fdb2fc1a56e

* Docker（docker -v）
* AWS SAM CLI（sam --version）

## ■ AWS SAM CLI のインストール手順（Apple シリコンの場合）

**参考手順**

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html

公式から .pkg をダウンロード

   * `aws-sam-cli-macos-arm64.pkg`

**ダウンロードできました！**

![Screenshot 2025-06-06 at 21.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3bc1d0ce-d019-43f7-8a36-5e611f716071.png)


以下のコマンドでインストール

```bash
sudo installer -pkg ~/Downloads/aws-sam-cli-macos-arm64.pkg -target /
```

**インストールできました！**

![Screenshot 2025-06-06 at 21.43.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f17f91b4-ea37-4313-8b1b-4a4246e49707.png)

インストール確認

```bash
which sam
# /usr/local/bin/sam と出れば OK

sam --version
# SAM CLI, x.xx.x
```

**こんな感じです...！**

![Screenshot 2025-06-06 at 21.44.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/aa879ecc-d14c-421f-bcf0-d89c5991ff7a.png)

## 実際にやってみた

:::note info
**ここからは、以下のチュートリアルを参考にしながら進めていきます！**
:::

**参考文献**

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html

### ■ ステップ 1：サンプルの Hello World アプリケーションを初期化

```bash
sam init
```

プロンプトへの回答例：

```shell
Which template source would you like to use?
    → 1 (AWS Quick Start Templates)

Choose an AWS Quick Start application template
    → 1 (Hello World Example)

Use the most popular runtime and package type? (Python and zip) [y/N]:
    → y

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

Would you like to enable monitoring using CloudWatch Application Insights? [y/N]:
    → ENTER

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

Project name [sam-app]:
    → ENTER（もしくは任意の名前）
```

**対話形式で簡単にできました！**

![Screenshot 2025-06-06 at 21.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b41d5e61-c862-4ed2-b165-d6be5c333a5b.png)

作成後：

```bash
cd sam-app
tree  # ← なければ `brew install tree`
```

### ■ ステップ 2：アプリケーションを構築

```bash
sam build
```

#### AWS SAM ビルドエラー発生

:::note alert
**AWS SAM CLI は `template.yaml` に記述された `Runtime: python3.13` に従ってビルドしようとしたが、ローカルに Python 3.13 がインストールされておらず PATH にも存在しなかったため、バイナリ検証が失敗しました。**
:::

**実際のエラー画面**

```
Build Failed
Error: PythonPipBuilder:Validation - Binary validation failed for python, searched for python in following locations  :
['/usr/local/bin/python', '/Library/Frameworks/Python.framework/Versions/3.12/bin/python3', '/usr/local/bin/python3', '/usr/bin/python3']
which did not satisfy constraints for runtime: python3.13. Do you have python for runtime: python3.13 on your PATH?
```

### 私の環境での修正方法

#### `template.yaml` のランタイム変更

```yaml
template.yaml:
Runtime: python3.13  →  ご自身のバージョンに変更
```

**再度、アプリケーションを構築**

```bash
sam build
```

**問題なくビルドされました！**

![Screenshot 2025-06-06 at 21.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4d48638f-88ac-4bfc-a153-2ae7df2e1da8.png)

### ■ ステップ 3：アプリケーションを AWS にデプロイ

```bash
sam deploy --guided
```

プロンプトへの回答例：

```sh
Stack Name [sam-app]: ENTER
AWS Region [us-west-2]: ap-northeast-1（または任意）
Confirm changes before deploy [Y/n]: n
Allow SAM CLI IAM role creation [Y/n]: ENTER
Disable rollback [y/N]: ENTER
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: ENTER
SAM configuration file [samconfig.toml]: ENTER
SAM configuration environment [default]: ENTER
```

**作成後の画面**

![Screenshot 2025-06-06 at 22.01.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ddf86f9a-7cb6-4e63-ab33-e36877031727.png)

**マネコン上でも問題なく作成されていることが確認できました！**

![Screenshot 2025-06-06 at 22.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/54e9fbd9-3445-41a1-bada-2495955f2a86.png)


### ■ ステップ 4：デプロイ済みアプリケーションの呼び出し

出力の Outputs セクションにある HelloWorldApi を確認。

例：

```bash
curl https://xxx.ap-northeast-1.amazonaws.com/Prod/hello/
# 出力：{"message": "hello world"}
```

**ブラウザからも問題なくアクセスできました！**

![Screenshot 2025-06-06 at 22.03.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b78174fa-4b6c-40ad-b753-731d6ce1823b.png)

### ■ ステップ 5（任意）：ローカルでテスト

```bash
sam local invoke HelloWorldFunction
sam local start-api
# → http://127.0.0.1:3000/hello にアクセス
```

**ローカルでも問題なくアクセスできることが確認できました！**

![Screenshot 2025-06-06 at 22.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6fd479e4-e230-443b-8b2f-ee66cf1f808b.png)

### ■ ステップ 6：アプリケーションを削除

```bash
aws cloudformation delete-stack --stack-name sam-app
```

**こちらもいい感じに削除されました！**

![Screenshot 2025-06-06 at 22.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/77ebad22-7e97-4b59-aebe-5b6f8a836b12.png)

## まとめ

ここまで読んでいただき、ありがとうございました！

:::note warn
**AWS SAM CLI を使えば、ローカルでの開発・テスト・クラウドへのデプロイまでがスムーズに行えました。**
:::

ビルドや `sam local start-api` による API シミュレーションも便利で、Lambda＋API Gateway の構成を簡単に試せる点が非常に魅力的でした...！

今後は API Gateway に認証を追加したり、DynamoDB との連携も試してみたいと思います！！