AWS Lambda + API GW + DynamoDB — 50+ コマンドを 6 カテゴリで

サーバレス三種の神器(Lambda / API Gateway / DynamoDB)は IaC で管理する前提でも、CLI で確認・診断・即応する場面が多々あります。 Console を行ったり来たりするより速い操作を整理。

目次

  1. Lambda 関数管理
  2. Lambda 実行・ログ確認
  3. API Gateway HTTP API (apigatewayv2)
  4. API Gateway REST API (apigateway)
  5. DynamoDB 基本操作 (get/put/query/scan)
  6. DynamoDB テーブル設定 (PITR / TTL / Stream)
  7. 運用レシピ
  8. 用語集

1. Lambda 関数管理

# 一覧
aws lambda list-functions
aws lambda list-functions --query 'Functions[].FunctionName' --output text
aws lambda get-function --function-name myfn
aws lambda get-function-configuration --function-name myfn

# 作成
zip -j fn.zip index.mjs
aws lambda create-function \
  --function-name myfn \
  --runtime nodejs22.x \
  --architectures arm64 \
  --memory-size 256 \
  --timeout 10 \
  --role arn:aws:iam::xxx:role/lambda-exec \
  --handler index.handler \
  --zip-file fileb://fn.zip \
  --environment 'Variables={LOG_LEVEL=info}'

# コード更新
aws lambda update-function-code --function-name myfn --zip-file fileb://fn.zip
aws lambda update-function-code --function-name myfn --s3-bucket b --s3-key fn.zip

# 設定更新
aws lambda update-function-configuration --function-name myfn \
  --memory-size 512 --timeout 15 \
  --environment 'Variables={LOG_LEVEL=debug,API_URL=https://...}'

# Permission(Resource Policy)— API GW から呼べるように
aws lambda add-permission --function-name myfn \
  --statement-id apigw-invoke \
  --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn 'arn:aws:execute-api:ap-northeast-1:xxx:apixxx/*/*/path'
aws lambda get-policy --function-name myfn
aws lambda remove-permission --function-name myfn --statement-id apigw-invoke

# Alias / Version
aws lambda publish-version --function-name myfn
aws lambda list-versions-by-function --function-name myfn
aws lambda create-alias --function-name myfn --name prod --function-version 5
aws lambda update-alias --function-name myfn --name prod --function-version 6
aws lambda list-aliases --function-name myfn

# 削除
aws lambda delete-function --function-name myfn

2. Lambda 実行・ログ確認

# 同期実行
aws lambda invoke --function-name myfn \
  --payload '{"key":"value"}' \
  --cli-binary-format raw-in-base64-out \
  out.json
cat out.json

# 非同期 (Event)
aws lambda invoke --function-name myfn --invocation-type Event \
  --payload '{"x":1}' --cli-binary-format raw-in-base64-out out.json

# DryRun (権限チェックのみ)
aws lambda invoke --function-name myfn --invocation-type DryRun out.json

# RequestResponse でレスポンス本体を表示
aws lambda invoke --function-name myfn \
  --payload '{}' --cli-binary-format raw-in-base64-out /dev/stdout

# ログを tail
aws logs tail /aws/lambda/myfn --follow
aws logs tail /aws/lambda/myfn --since 10m
aws logs tail /aws/lambda/myfn --filter-pattern 'ERROR'
aws logs tail /aws/lambda/myfn --format short

# 同時実行数
aws lambda put-function-concurrency --function-name myfn --reserved-concurrent-executions 10
aws lambda delete-function-concurrency --function-name myfn

# Provisioned Concurrency(コールドスタート対策)
aws lambda put-provisioned-concurrency-config \
  --function-name myfn --qualifier prod --provisioned-concurrent-executions 5

3. API Gateway HTTP API (apigatewayv2)

新しい HTTP API(v2)。REST API より高速・安価で多くのケースで第一選択。

# API 一覧 / 詳細
aws apigatewayv2 get-apis
aws apigatewayv2 get-api --api-id xxx

# API 作成(Lambda Proxy)
aws apigatewayv2 create-api --name my-api --protocol-type HTTP \
  --target arn:aws:lambda:ap-northeast-1:xxx:function:myfn

# Route / Integration / Stage
aws apigatewayv2 get-routes --api-id xxx
aws apigatewayv2 get-integrations --api-id xxx
aws apigatewayv2 get-stages --api-id xxx

# Route 追加
aws apigatewayv2 create-integration --api-id xxx \
  --integration-type AWS_PROXY --integration-uri 'arn:aws:lambda:...:function:myfn' \
  --payload-format-version 2.0
aws apigatewayv2 create-route --api-id xxx \
  --route-key 'POST /contact' --target 'integrations/<integrationId>'

# Stage ($default が標準)
aws apigatewayv2 create-stage --api-id xxx --stage-name v1 --auto-deploy

# CORS
aws apigatewayv2 update-api --api-id xxx \
  --cors-configuration 'AllowOrigins=https://lab.iigtn.com,AllowMethods=GET,POST,OPTIONS,AllowHeaders=Content-Type'

# 削除
aws apigatewayv2 delete-api --api-id xxx

4. API Gateway REST API (apigateway)

# 一覧
aws apigateway get-rest-apis
aws apigateway get-resources --rest-api-id xxx
aws apigateway get-stages --rest-api-id xxx

# Stage / Deployment
aws apigateway create-deployment --rest-api-id xxx --stage-name v1
aws apigateway delete-stage --rest-api-id xxx --stage-name v1

# Usage Plan / API Key
aws apigateway get-usage-plans
aws apigateway get-api-keys
aws apigateway create-api-key --name my-key --enabled
aws apigateway create-usage-plan-key --usage-plan-id up-xxx \
  --key-id key-xxx --key-type API_KEY

# テスト呼び出し
aws apigateway test-invoke-method --rest-api-id xxx \
  --resource-id rsrc-xxx --http-method GET

5. DynamoDB 基本操作

# テーブル一覧
aws dynamodb list-tables
aws dynamodb describe-table --table-name users

# 単一 item 取得
aws dynamodb get-item --table-name users \
  --key '{"id":{"S":"u1"}}'

# 書き込み
aws dynamodb put-item --table-name users \
  --item '{"id":{"S":"u1"},"name":{"S":"alice"},"score":{"N":"92"}}'

# 上書き保護(item が存在する時だけ更新)
aws dynamodb put-item --table-name users \
  --item '{"id":{"S":"u1"},"name":{"S":"alice2"}}' \
  --condition-expression 'attribute_exists(id)'

# 削除
aws dynamodb delete-item --table-name users --key '{"id":{"S":"u1"}}'

# Update(部分更新)
aws dynamodb update-item --table-name users \
  --key '{"id":{"S":"u1"}}' \
  --update-expression 'SET score = :s, updated_at = :t' \
  --expression-attribute-values '{":s":{"N":"95"},":t":{"S":"2026-04-26T00:00:00Z"}}'

# Query(PK + 条件)
aws dynamodb query --table-name orders \
  --key-condition-expression 'user_id = :u AND order_date >= :d' \
  --expression-attribute-values '{":u":{"S":"u1"},":d":{"S":"2026-04-01"}}'

# Scan(全走査、本番は基本避ける)
aws dynamodb scan --table-name users
aws dynamodb scan --table-name users --limit 100
aws dynamodb scan --table-name users \
  --filter-expression 'score > :s' \
  --expression-attribute-values '{":s":{"N":"80"}}'

# BatchGet / BatchWrite(25 件/req)
aws dynamodb batch-get-item --request-items '{
  "users":{"Keys":[{"id":{"S":"u1"}},{"id":{"S":"u2"}}]}
}'

aws dynamodb batch-write-item --request-items '{
  "users":[
    {"PutRequest":{"Item":{"id":{"S":"u3"},"name":{"S":"carol"}}}},
    {"DeleteRequest":{"Key":{"id":{"S":"u4"}}}}
  ]
}'

# Transactions(最大 100 件、ACID)
aws dynamodb transact-write-items --transact-items '[
  {"Put":{"TableName":"orders","Item":{"id":{"S":"o1"}}}},
  {"Update":{"TableName":"users","Key":{"id":{"S":"u1"}},
   "UpdateExpression":"SET order_count = if_not_exists(order_count, :z) + :i",
   "ExpressionAttributeValues":{":z":{"N":"0"},":i":{"N":"1"}}}}
]'

6. DynamoDB テーブル設定

# テーブル作成(On-Demand)
aws dynamodb create-table --table-name users \
  --attribute-definitions AttributeName=id,AttributeType=S \
  --key-schema AttributeName=id,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST

# Provisioned + GSI
aws dynamodb create-table --table-name orders \
  --attribute-definitions \
    AttributeName=order_id,AttributeType=S \
    AttributeName=user_id,AttributeType=S \
    AttributeName=order_date,AttributeType=S \
  --key-schema AttributeName=order_id,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST \
  --global-secondary-indexes '[{
    "IndexName":"user-date-index",
    "KeySchema":[
      {"AttributeName":"user_id","KeyType":"HASH"},
      {"AttributeName":"order_date","KeyType":"RANGE"}
    ],
    "Projection":{"ProjectionType":"ALL"}
  }]'

# PITR 有効化(誤削除復旧)
aws dynamodb update-continuous-backups --table-name users \
  --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true

# TTL 有効化
aws dynamodb update-time-to-live --table-name sessions \
  --time-to-live-specification 'Enabled=true,AttributeName=expires_at'

# Stream 有効化
aws dynamodb update-table --table-name users \
  --stream-specification 'StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES'

# バックアップ
aws dynamodb create-backup --table-name users --backup-name users-2026-04-26
aws dynamodb list-backups --table-name users
aws dynamodb restore-table-from-backup --target-table-name users-restored \
  --backup-arn arn:...

# 削除
aws dynamodb delete-table --table-name users

運用レシピ

レシピ 1 — Lambda の最近のエラーをサクッと確認

aws logs tail /aws/lambda/myfn --since 1h --filter-pattern 'ERROR'

レシピ 2 — API GW の URL を取得

API_ID=$(aws apigatewayv2 get-apis --query 'Items[?Name==`my-api`].ApiId | [0]' --output text)
echo "https://${API_ID}.execute-api.ap-northeast-1.amazonaws.com/"

レシピ 3 — DynamoDB を JSON でダンプ → 別テーブルに移行

# scan で全件取得
aws dynamodb scan --table-name old --output json > dump.json

# jq で BatchWrite 形式に整形
jq -c '.Items[] | {PutRequest:{Item:.}}' dump.json > items.ndjson

# 25 件ずつバッチ書込
split -l 25 items.ndjson chunk_
for f in chunk_*; do
  echo "{\"new-table\":[" > req.json
  paste -sd, $f >> req.json
  echo "]}" >> req.json
  aws dynamodb batch-write-item --request-items file://req.json
done

レシピ 4 — Lambda の memory / timeout を一括調整

for fn in $(aws lambda list-functions --query 'Functions[].FunctionName' --output text); do
  aws lambda update-function-configuration --function-name $fn \
    --memory-size 256 --timeout 10
done

レシピ 5 — API GW の slow request 抽出

# Access logging を CloudWatch に出している前提
aws logs filter-log-events --log-group-name '/aws/apigateway/my-api/v1' \
  --filter-pattern '{ $.responseLatency > 3000 }' \
  --start-time $(date -d '1 hour ago' +%s)000 \
  | jq -r '.events[].message' | jq

コマンド早見表

# Lambda
aws lambda invoke --function-name F --payload '{}' --cli-binary-format raw-in-base64-out out.json
aws logs tail /aws/lambda/F --follow
aws lambda update-function-code --function-name F --zip-file fileb://fn.zip
aws lambda update-function-configuration --function-name F --memory-size 512

# API GW (HTTP)
aws apigatewayv2 get-apis
aws apigatewayv2 get-routes --api-id A
aws apigatewayv2 update-api --api-id A --cors-configuration ...

# DynamoDB
aws dynamodb get-item --table-name T --key '{...}'
aws dynamodb put-item --table-name T --item '{...}'
aws dynamodb query --table-name T --key-condition-expression 'pk = :p'
aws dynamodb update-continuous-backups --table-name T --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true

用語集

Lambda
関数を呼び出された時だけ実行するサーバレス実行環境。Node.js/Python/Java/Go 等。arm64 (Graviton) で安価。
Cold Start
Lambda コンテナの初回起動オーバーヘッド。Provisioned Concurrency で回避できるが追加料金。
Lambda Alias / Version
Version = イミュータブルなコードスナップショット、Alias = それを指す可変ポインタ(例: prod → version 5)。Blue/Green デプロイに使う。
Resource Policy (Lambda Permission)
「誰が この Lambda を呼べるか」のポリシー。API GW などからのトリガ設定で必要。
API Gateway HTTP API (v2)
新型の API GW。REST API より高速・安価。OAuth2/JWT、CORS、自動デプロイなどモダン機能を持つ。
Lambda Proxy 統合 (payload v2)
HTTP API → Lambda の統合方式。リクエスト全体を Event として渡し、レスポンスをそのまま HTTP レスポンスにする。
DynamoDB
AWS のフルマネージド NoSQL。PK/SK 設計、On-Demand vs Provisioned 課金、PITR / Stream / TTL 等。
PK / SK / GSI / LSI
Partition Key / Sort Key / Global Secondary Index / Local Secondary Index。クエリパターンに合わせて設計。
Query vs Scan
Query = PK 指定で効率的。Scan = 全走査で重い。本番では Query 一択 + 必要な GSI を準備する。
PITR (Point-in-Time Recovery)
過去 35 日間の任意時点に復旧できるバックアップ機能。誤削除復旧の最後の砦。
TTL
属性に設定した UNIX タイムスタンプを過ぎた item を自動削除する機能。セッションキャッシュ等に。
DynamoDB Stream
テーブル変更を順次配信するイベントソース。Lambda トリガで cross-table 整合性や監査ログに利用。
BatchGet / BatchWrite / Transact
BatchGet = 100 件 / 16MB まで、BatchWrite = 25 件まで(部分失敗あり)、Transact = 100 件 ACID 保証(部分失敗なし)。
Conditional Write
condition-expression で「ある条件を満たす場合のみ書き込む」操作。楽観的ロック実装の基本。
Provisioned Concurrency
Lambda の指定数を常時起動状態に保つ機能。Cold Start を消せるが追加料金。レイテンシ重視の本番のみ使う。