コンテンツにスキップ

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>/linechannel_secret 署名検証
LINE Access Token /automedia/<tenant>/lineaccess_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 設計

POST https://api.automedia.spin-dd.com/backlog/webhook/{token}

{token} = /automedia/<tenant>/backlog.webhook_secret の値。Backlog plan が webhook secret 機能を持たないため、URL path 自体を共有シークレットとして使う方式 (timing-safe 比較)。

Backlog Webhook イベント別アクション

Backlog event Lambda アクション
IssueUpdated (statusautomedia承認) 投稿日時を見て EventBridge Schedule at(max(投稿日時, now+5s)) を upsert (即時送信も常に Schedule 経由)
IssueUpdated (statusautomedia承認、内容変更による 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>/backlogwebhook_secret URL path 検証
Backlog API Key /automedia/<tenant>/backlogapi_key コメント返却・課題取得
Backlog space key /automedia/<tenant>/backlogspace_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