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?

2.SAM によるサーバレス API の最小構成構築練習

Last updated at Posted at 2025-11-29

①まずSAM CLIをインストール
② sam build → sam deployでCloudFormationを動かす

AWS CLIをローカルPCへインストール
理由は、AWS SAM CLI が内部的に AWS CLI の認証情報を使ってクラウドへデプロイする仕組みだからです。


✅ 必要な前提と内容

AWSアカウント作成

  • まだ持っていない場合のみ必要。
  • https://aws.amazon.com/jp/ から登録。
  • クレジットカードと電話認証が必須(無料枠あり)。

IAMユーザー作成 → アクセスキー発行

① IAMユーザー作成(アクセス権限を付与)

  1. AWSマネジメントコンソール → IAM を開く
  2. 左メニュー → 「ユーザー」→「ユーザーを追加」
  3. ユーザー名:例)sam-deploy-user
  4. アクセスの種類:「AWS マネジメントコンソールへのアクセス」は不要(CLI用)
  5. 「次へ」→「既存のポリシーを直接アタッチ」→ AdministratorAccess を選択
  6. 「次へ」→「ユーザーを作成」

これでユーザー作成完了。


② アクセスキーの発行

  1. 作成したユーザー名(例:sam-deploy-user)をクリック
  2. タブから 「セキュリティ認証情報」 を選択
  3. 下へスクロール → 「アクセスキー」セクション
  4. アクセスキーの作成」ボタンをクリック

image.png

③ 用途の選択画面

「アクセスキーの使用目的」を聞かれるので
「コマンドラインインターフェイス(CLI)」 を選択
image.png


④ タグはスキップして「アクセスキーを作成」

完了画面にて以下が表示される:

  • アクセスキーID
  • シークレットアクセスキー

⚠️ このシークレットキーは一度しか表示されません
→ CSVをダウンロード。


★AWS CLIのインストール

ローカルPCで下記コマンドを実行(VSCode使用(PowerShellにインストールしている))

msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

image.png

⑤ AWS CLI に認証情報を登録

PowerShellで以下を実行:

aws configure

入力:

AWS Access Key ID [None]: AKIAxxxxxxxxxxxxxx
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json

⑥ 動作確認

aws sts get-caller-identity

出力例:

{
  "UserId": "AIDAXXXXXXXXXXXXXXXX",
  "Account": "123456789012",
  "Arn": "arn:aws:iam::123456789012:user/sam-deploy-user"
}

これが出れば認証成功。

💡 補足:1回だけでOK

これらの手順は最初の1回だけ。
一度設定すると、SAMやTerraformなどAWS系ツールすべてが同じ認証を共有できます。


※プロファイルを分けてもよい

メリット 内容
環境を分離できる 開発用・検証用・本番用など複数アカウントを安全に使い分け可能
誤操作防止 誤って本番アカウントにデプロイするリスクを防げる
アクセス権を分離 IAM権限が異なる複数ユーザーを安全に扱える
ツール別設定が可能 Terraform、SAM、CLIなどでプロファイルを明示的に指定できる

分ける場合
→オプションを変更する必要あり

aws configure --profile sam-deploy
aws sts get-caller-identity --profile sam-deploy

この状態になったら、次のステップ

→ SAM CLIでLambda + API Gateway + DynamoDBのCloudFormationスタックをデプロイに進めます。


ここからは、AWS SAM CLI のインストール → 初回設定 → Lambdaデプロイ準備(sam build / sam deploy) の完全手順を順に説明します。
Windows + VS Code + PowerShell環境向けです。


🧩 手順全体

① SAM CLIをインストール
② 動作確認
③ SAMプロジェクト(index.jsとtemplate.yaml)を準備
④ sam build でパッケージ化
⑤ sam deploy --guided で初回デプロイ

✅ ① SAM CLIのインストール

以下を実行:

msiexec.exe /i https://github.com/aws/aws-sam-cli/releases/latest/download/AWS_SAM_CLI_64_PY3.msi

✅ ② 動作確認

VS Codeのターミナルで確認:

sam --version
SAM CLI, version 1.125.0 #例

これが出れば成功。


✅ ③ プロジェクト構成の準備

lambda-api フォルダを任意の場所に作成し、その中に
index.js(Lambda関数)と template.yaml(SAMテンプレート)を置きます。

PS C:\Users\XXXX\Projects\lambda-api

構成:

lambda-api/
├── index.js
└── template.yaml

index.js

import { DynamoDBClient, PutItemCommand, ScanCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient({ region: "ap-northeast-1" });

export const handler = async (event) => {
  const body = event.body ? JSON.parse(event.body) : {};
  if (event.httpMethod === "POST") {
    const params = {
      TableName: "MemoTable",
      Item: {
        id: { S: Date.now().toString() },
        text: { S: body.text || "" },
      },
    };
    await client.send(new PutItemCommand(params));
    return { statusCode: 200, body: JSON.stringify({ message: "Added" }) };
  }
  const data = await client.send(new ScanCommand({ TableName: "MemoTable" }));
  return { statusCode: 200, body: JSON.stringify(data.Items) };
};

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  MemoFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Handler: index.handler
      Runtime: nodejs20.x
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /memo
            Method: ANY
  MemoTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST

✅ ④ ビルド

VS Codeのターミナルで:

sam build

結果例:

Building codeuri: . runtime: nodejs20.x metadata: {} functions: MemoFunction
Running NodejsNpmBuilder:NpmPack

→成功すれば .aws-sam/ フォルダが作成される。

buildとは
Lambda 関数を AWS にデプロイできる形にまとめる処理。
CloudFormation が実行できる成果物を、自動で作っている。
<動作内容>
まず、プロジェクト内のコード(index.js など)を読み取って、Lambda で動かせる構成にコピーする。
次に、Node.js の依存パッケージがあれば、それを自動で取得する。
その後、CloudFormation に渡すためのテンプレート(template.yaml)を、デプロイ用に変換する。
最後に、まとめた成果物を .aws-sam/build に保存する。


✅ ⑤ デプロイ(初回)

初回は対話式ガイド付きで実行:

sam deploy --guided --profile sam-deploy

質問に対して以下のように回答:

質問 回答例
Stack Name lambda-memo-api
AWS Region ap-northeast-1
Confirm changes before deploy n
Allow SAM CLI IAM role creation y
#Preserves the state of previously provisioned resources when an operation fails Disable rollback [y/N]: n
Save arguments to configuration file y
SAM configuration file Enter
SAM configuration environment [default]: Enter

完了後:

Successfully created/updated stack - lambda-memo-api
Outputs
─────────────────────────────
Key                 ApiUrl
Description         API Gateway endpoint URL
Value               https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/memo

sam deployとは
AWS 上に環境を実際に作る処理。
CloudFormation スタックを作成し、テンプレートどおりに Lambda や API Gateway などのAWSリソースを立ち上げる。
<具体的>
まず、sam build で作った成果物を AWS S3 にアップロードする。
次に、CloudFormation に template.yaml を渡してスタックを作らせる。
その後、Lambda 関数、API Gateway、DynamoDBテーブルなどを順番に作成する。
最後に、API Gateway のURLなど、作られたリソースの情報を出力する。


✅ ⑥ 動作確認

  • GET → DynamoDB内のデータ一覧
  • POST → JSONボディでデータ登録

SAM でデプロイした API の動作確認として、
API Gateway → Lambda → DynamoDB が正しく連携しているかを PowerShell で確認する。

デプロイ後、CloudFormation の Outputs から以下の URL が得られる:

https://**********.execute-api.ap-northeast-1.amazonaws.com/Prod/memo

以降この URL を API_ENDPOINT とする。


1. GET(データ取得)

まず、API が正常に起動しているかを確認する。

Invoke-RestMethod -Method Get `
  -Uri "https://**********.execute-api.**-********-1.amazonaws.com/Prod/memo"

初回実行時の出力例:

StatusCode        : 200
StatusDescription : OK
Content           : []
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    X-Amzn-Trace-Id: Root=1-********-***************************;Parent=****************;Sampled=0;Lineage=1:********:0
                    x-amzn-RequestId: ********************************
Forms             : {}
Headers           : {[Connection, keep-alive], [X-Amzn-Trace-Id, Root=1-********-***************************;Parent=****************;Sampled=0;Lineage=1:********:0], 
                    [x-amzn-RequestId, ********************************], [x-amz-apigw-id, *************]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 2

ポイント:

  • StatusCode : 200 → API Gateway までは正常
  • Content : [] → DynamoDB のテーブルが空(正常)

2. POST(データ登録)

PowerShell で以下を実行し、メモを1件登録する。

curl -Method Post `
  -Uri "https://**********.execute-api.ap-northeast-1.amazonaws.com/Prod/memo" `
  -Headers @{ "Content-Type" = "application/json" } `
  -Body '{"text":"first memo"}'

成功時のレスポンス:

StatusCode        : 200
StatusDescription : OK
Content           : {"message":"Added"} ←★この出力結果が得られていればOK
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    X-Amzn-Trace-Id: Root=1-********-***************************;Parent=****************;Sampled=0;Lineage=1:********:0
                    x-amzn-RequestId: ********************************
Forms             : {}
Headers           : {[Connection, keep-alive], [X-Amzn-Trace-Id, Root=1-********-***************************;Parent=****************;Sampled=0;Lineage=1:********:0], 
                    [x-amzn-RequestId, ********************************], [x-amz-apigw-id, *************]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass

→ Lambda が DynamoDB に書き込み成功。


3. GET(登録後の取得)

登録が正しく反映されているか、再度 GET を実行する。

Invoke-RestMethod -Method Get `
  -Uri "https://**********.execute-api.ap-northeast-1.amazonaws.com/Prod/memo"

出力例:

id                 text
--                 ----
@{S=1764336863692} @{S=first memo}

ポイント:

  • DynamoDB の item が 1 件返っている
  • id は自動生成(Date.now)
  • text が POST した "first memo" と一致

DynamoDB に保存されたデータが正常に返ってきているため、
API Gateway → Lambda → DynamoDB の連携が成功していることが確認できる。


4. DynamoDB コンソールでも内容確認

AWS コンソール → DynamoDB → 項目を探索
作成されたテーブル(例:lambda-memo-api-MemoTable-******)を開き、
データが登録されていることを確認する。image.png


5. ここまでで確認できること

  • API Gateway → Lambda → DynamoDB が正常に連携
  • API Gateway が正しくデプロイされている
  • Lambda が正常に実行され、POST(登録)と GET(取得)が成功
  • DynamoDB に対して
    • PutItem(登録)
    • Scan(取得)
      が正常に行われている
  • IAM(DynamoDBCrudPolicy)、環境変数、テーブル名、コードの整合性が取れている
  • ローカル → SAM → AWS のデプロイまでの一連の流れ

これで SAM によるサーバレス API の最小構成 の動作確認が完了。


6.「削除手順」

## 作成したリソースの削除

デプロイしたアプリケーションは、CloudFormation のスタックを削除することでまとめて削除できます。

今回は `lambda-memo-api` というスタック名でデプロイしているので、AWS コンソールから CloudFormation を開き、`lambda-memo-api` を選択して「削除」を実行します。

CLI から削除する場合は次のコマンドでも同じことができます。

```powershell
aws cloudformation delete-stack --stack-name lambda-memo-api --region ap-northeast-1 --profile sam-deploy

これで Lambda 関数、API Gateway、DynamoDB テーブルなど、このスタックで作成したリソースはすべて削除されます。

なお、sam deploy --guided を使うと、SAM CLI が内部的に aws-sam-cli-managed-default という別のスタックも作成します。これはデプロイに使う S3 バケットやロールを管理するためのもので、今後も SAM を使う場合は残しておいて問題ありません。

完全にクリーンアップしたい場合は、S3 コンソールで aws-sam-cli-managed-default-... という名前のバケットを空にしたうえで、CloudFormation から aws-sam-cli-managed-default スタックも削除します。


備考

  • aws-sam-cli-managed-default は SAM が再利用する共通リソースなので残してもよい
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?