①まずSAM CLIをインストール
② sam build → sam deployでCloudFormationを動かす
AWS CLIをローカルPCへインストール
理由は、AWS SAM CLI が内部的に AWS CLI の認証情報を使ってクラウドへデプロイする仕組みだからです。
✅ 必要な前提と内容
AWSアカウント作成
- まだ持っていない場合のみ必要。
- https://aws.amazon.com/jp/ から登録。
- クレジットカードと電話認証が必須(無料枠あり)。
IAMユーザー作成 → アクセスキー発行
① IAMユーザー作成(アクセス権限を付与)
- AWSマネジメントコンソール → IAM を開く
- 左メニュー → 「ユーザー」→「ユーザーを追加」
-
ユーザー名:例)
sam-deploy-user - アクセスの種類:「AWS マネジメントコンソールへのアクセス」は不要(CLI用)
- 「次へ」→「既存のポリシーを直接アタッチ」→
AdministratorAccessを選択 - 「次へ」→「ユーザーを作成」
これでユーザー作成完了。
② アクセスキーの発行
- 作成したユーザー名(例:
sam-deploy-user)をクリック - タブから 「セキュリティ認証情報」 を選択
- 下へスクロール → 「アクセスキー」セクション
- 「アクセスキーの作成」ボタンをクリック
③ 用途の選択画面
「アクセスキーの使用目的」を聞かれるので
→ 「コマンドラインインターフェイス(CLI)」 を選択

④ タグはスキップして「アクセスキーを作成」
完了画面にて以下が表示される:
- アクセスキーID
- シークレットアクセスキー
⚠️ このシークレットキーは一度しか表示されません。
→ CSVをダウンロード。
★AWS CLIのインストール
ローカルPCで下記コマンドを実行(VSCode使用(PowerShellにインストールしている))
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
⑤ 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-******)を開き、
データが登録されていることを確認する。
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 が再利用する共通リソースなので残してもよい

