Webhook 受信 (API Gateway + Lambda)¶
LINE / Backlog / GitHub Push を AWS API Gateway HTTP API + Lambda(spin-dd account,
ap-northeast-1)で受け、5 秒以内に reply する。
なぜ AWS Lambda か¶
MVP の機能要件 F3「友だち追加で登録クーポンが届く(5 秒以内)」を実現するには、LINE が push する Webhook を 即応で受ける 必要がある。
AWS Lambda + API Gateway なら:
- ウォーム時 300〜500 ms で reply 完了
- コールドスタートを含めても 1.5〜3 秒
- IAM ロールで認証完結、API キーの分散管理不要
- CloudWatch Logs に履歴集約
スコープ¶
| プロバイダ | 対応 | Lambda |
|---|---|---|
| LINE | ◯ | webhook-line (follow / message を 5 秒以内で reply) |
| Backlog | ◯ | webhook-backlog (status / コメントコマンド / 投稿日時更新を即応で拾う、主トリガ) |
| GitHub Push | ◯ | sync (テナント設定 .automedia/ を S3 にミラー) |
| HubSpot | × | コンタクト同期は当日中で OK (後続フェーズ) |
実装構成¶
spin-dd/automedia/
└─ aws/
├─ lambdas/
│ ├─ webhook-line/ # POST /line/webhook/{channel_id}
│ ├─ webhook-backlog/ # POST /backlog/webhook/{token}
│ ├─ sync/ # POST /github/webhook
│ ├─ scan/ # 日次セーフティネット
│ └─ deliver/ # 配信実行 (AI 生成 + 各 channel API)
└─ tofu/
├─ apigateway.tf # API Gateway HTTP API + routes + custom domain
├─ lambda.tf # Lambda function + IAM + log group
├─ secretsmanager.tf # 各種 secret
└─ ...
役割の限定 (webhook-* Lambdas)¶
- やる:
- HTTPS 受信(API Gateway HTTP API)
- 認証 (LINE 署名検証 / Backlog path token 検証 / GitHub HMAC 検証)
- 軽い dispatch (LINE follow welcome reply / EventBridge Schedule upsert / S3 mirror enqueue)
- 200 OK を即返却 (LINE は遅延すると再送する)
- やらない:
- 重い生成系(Claude 呼び出し含む)→ Deliver Lambda へ
- DB 書き込み・状態保持
- リトライ(SQS DLQ で処理)
URL 設計¶
POST https://api.automedia.spin-dd.com/line/webhook/{channel_id}
POST https://api.automedia.spin-dd.com/backlog/webhook/{token}
POST https://api.automedia.spin-dd.com/github/webhook
API Gateway HTTP API + カスタムドメイン (Route 53 + ACM 証明書)。
LINE Webhook → Reply の流れ¶
sequenceDiagram
participant U as 新規友だち
participant LP as LINE Platform
participant APIGW as API Gateway
participant WHL as webhook-line Lambda
participant SM as Secrets Manager
participant S3 as S3 (tenants bucket)
participant LM as LINE Messaging API
U->>LP: 友だち追加
LP->>APIGW: POST /line/webhook/{channel_id} (follow)
APIGW->>WHL: invoke
WHL->>S3: tenants.json から channel_id → tenant
WHL->>SM: /automedia/<tenant>/line を取得
WHL->>WHL: X-Line-Signature 検証
WHL->>S3: <tenant>/templates/line/welcome.json
WHL->>LM: Reply API (welcome message)
WHL-->>APIGW: 200 OK
Note over WHL,LM: ≤ 5 秒(ウォーム時 ~300ms)
welcome reply と並列で HubSpot リード upsert (search-first by
line_user_id、count++ / first・last_followed_at 更新) も実行している。詳細フロー・HubSpot プロパティ・redelivery 仕様は LINE follow フロー (welcome + HubSpot upsert) を参照。
シークレット参照¶
| 名前 | 在処 (Secret name → JSON key) | 用途 |
|---|---|---|
| LINE Channel Secret | /automedia/<tenant>/line → channel_secret |
署名検証 |
| LINE Access Token | /automedia/<tenant>/line → access_token |
Reply / push 送信 |
| Claude API キー | 不要 | Claude Platform on AWS の IAM 統合 |
詳細は セキュリティ・シークレット 参照。
失敗時¶
| 失敗 | 影響 | 対策 |
|---|---|---|
| 署名検証失敗 | 401 を返す | LINE 設定確認 |
| Reply API 失敗 | 500 を返す(LINE が再送) | Lambda 内で 3 回までリトライ |
| Lambda 全体ダウン | LINE follow が取り逃される | CloudWatch Alarm で通知、LINE 側のリトライに依存 |
デプロイ¶
GitHub Actions OIDC で AWS ロール assume → tofu apply で deploy。
# .github/workflows/aws-deploy.yml
on:
push:
paths: ['aws/**']
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::695590128753:role/automedia-deploy-role
aws-region: ap-northeast-1
- uses: opentofu/setup-opentofu@v1
- working-directory: aws/tofu
run: |
tofu init
tofu apply -auto-approve
Backlog Webhook (主トリガ)¶
Backlog 由来のイベント (課題追加 / 更新 / コメント) を webhook で受け、EventBridge Schedule に動的に登録する。
詳細フローは トリガー・スケジューラ を参照。
URL 設計¶
{token} = /automedia/<tenant>/backlog.webhook_secret の値。Backlog plan が webhook secret 機能を持たないため、URL path 自体を共有シークレットとして使う方式 (timing-safe 比較)。
Backlog Webhook イベント別アクション¶
| Backlog event | Lambda アクション |
|---|---|
IssueUpdated (status → automedia承認) |
投稿日時を見て EventBridge Schedule at(max(投稿日時, now+5s)) を upsert (即時送信も常に Schedule 経由) |
IssueUpdated (status ← automedia承認、内容変更による invalidate 含む) |
EventBridge Schedule を削除 |
IssueCommented (/automedia send …) |
EventBridge Schedule at(now+5s) を登録 (即時系も統一経路) |
IssueCommented (/automedia cancel) |
Schedule 削除 |
IssueCommented (/automedia status) |
Backlog コメントで返信 (read 系) |
シークレット¶
| 名前 | 在処 (Secret name → JSON key) | 用途 |
|---|---|---|
| Backlog Webhook path token | /automedia/<tenant>/backlog → webhook_secret |
URL path 検証 |
| Backlog API Key | /automedia/<tenant>/backlog → api_key |
コメント返却・課題取得 |
| Backlog space key | /automedia/<tenant>/backlog → space_key |
API endpoint 組み立て |
Backlog 側の設定¶
Backlog プロジェクト (TTRTAGSPIN) の Webhook を以下のように設定:
- URL:
https://api.automedia.spin-dd.com/backlog/webhook/<token>(token を URL に含める) - 通知対象: 課題の追加 / 課題の更新 / 課題へのコメント
Backlog API でも追加可能 (POST /api/v2/projects/{key}/webhooks)。
冪等性¶
- 同名 EventBridge Schedule の create_or_update で再現性を確保
- 配信完了後は Deliver Lambda が
[automedia] dispatched at <iso>コメントを投稿 → scan の dedup に使う
日次セーフティネット (Scan Lambda)¶
EventBridge rate(1 day) で起動。TTRTAGSPIN プロジェクトの コンテンツ運用 issueType を走査し、frontmatter approval=true + schedule が過去 + dispatched コメント未付与の課題を救済 invoke する。
設計の整合性¶
このモデルが Claude Code ランタイムモデル と整合する点:
- Webhook Lambda は HTTPS の受け口と即応 reply のみ。重い業務ロジックは Deliver Lambda (Claude Platform on AWS) に分離
- テナント設定は 各テーマリポの
.automedia/が SoT。Sync Lambda が S3 にミラー - Lambda 群はステートレス、状態は Backlog SoT + LINE 側 + CloudWatch Logs
まとめ¶
- Webhook 受信は AWS Lambda + API Gateway (LINE + Backlog + GitHub Push の 3 系統)
- Backlog Webhook が主トリガ。ポーリングは使わず、動的
at(投稿日時)schedule + 日次セーフティネット - 5 秒以内 reply はウォーム時 300〜500 ms で達成
- 重処理は Deliver Lambda + Claude Platform on AWS へ非同期 invoke