メインコンテンツへスキップ

Anthropic API キーを支出閾値超過で無効化する

このチュートリアルでは、CloudFlow Datastore に保存された API キーごとの USD 閾値を超えてひも付けられた支出が発生した場合に、Anthropic の API キーを非アクティブ化するフローの構築方法を説明します。その過程で、Anthropic の Cost と Usage アクションを、Date/time transformDatastoreCodeNotification ノードと組み合わせる方法を学びます。

Early preview

Anthropic Admin API アクションは Early preview で提供されています。アクセスをリクエストするには、サポートリクエストを送信してください。

Goal and objectives

  • Goal: Datastore からキーごとの支出閾値を読み込み、共通のローリング・ルックバックウィンドウで支出を計測し、閾値を超えたキーを非アクティブ化し、通知メールを送信し、強制適用イベントを記録するワークフローを作成すること。

  • Objectives: このチュートリアルでは、次のことを学びます。

    • date/time transform ノードを使用して、UTC の日単位にそろえたレポートウィンドウを構築する。

    • 設定可能な閾値を Datastore に保存し、有効な行のみを読み込む。

    • 同じフローから Anthropic の Cost と Usage の Admin API アクションを呼び出す。

    • Code ノードを使用して、組織の USD 支出をトークンシェアに基づいて API キーにアトリビュートする。

    • updateApiKey でキーを非アクティブ化し、参照フィールドを使用して受信者へ通知する。

次に、構築するフロー全体を示します。

The Anthropic API key spend threshold flow

How the spend check works

Anthropic の Cost API は組織の支出を USD で返しますが、結果を api_key_id ごとにグループ化することはできません。Messages Usage API は API キーごとのグループ化が可能ですが、ドルではなくトークン数を返します。

そのため、このフローでは次のように処理します。

  1. ルックバックウィンドウの組織コストを読み取る。

  2. 同じウィンドウで、api_key_id ごとにグループ化された Messages usage を読み取る。

  3. 組織全体の USD を、各キーのトークンシェアに比例して各キーにアトリビュートする。

  4. 各有効な Datastore の閾値を、そのアトリビュートされた金額と比較する。

Daily Cost の grupo では、UTC の真夜中の境界も必要です。午後のタイムスタンプは空の範囲にスナップして Cost リクエストが失敗する可能性があるため、date/time ノードは日付の開始に切り詰めます。

Before you begin

  1. API キーの一覧表示と更新、およびコストと使用状況レポートの読み取りが可能な Admin API キーを使用して、Anthropic Admin API connection を作成します。

  2. CloudFlow Datastore で、次の 2 つのテーブルを作成します。

    • Anthropic API Key Spend Thresholds フィールド:

      • apiKeyId (text, unique)

      • apiKeyName (text)

      • thresholdUsd (numeric)

      • notifyEmail (text)

      • enabled (boolean)

    • Anthropic API Key Spend Enforcement Events フィールド:

      • eventKey (text, unique)

      • apiKeyId, apiKeyName, notifyEmail, action (text)

      • spendUsd, thresholdUsd (numeric)

      • lookbackDays (integer)

      • periodStart, periodEnd, enforcedAt (timestamp)

  3. 少なくとも 1 行の閾値レコードを追加します。強制適用する準備が整うまでは enabledfalse のままにし、apiKeyId は Claude Console または listApiKeys アクションから取得した実際の Anthropic API キー ID に置き換えてください。

Start building

  1. DoiT コンソール にサインインし、上部ナビゲーションのメガメニューから Automation and operations を選択し、CloudFlow を選択します。

  2. Create CloudFlow を選択します。

Step 1: Add a trigger

What should start your flow ブロックで Manually start を選択します。後で custom schedule に切り替えて(たとえば毎日チェックを実行するなど)、スケジュール実行にすることもできますが、構築とテストの間は手動トリガーの方が簡単です。

Step 2: Build the rolling spend window

bucket_width=1d を指定した Anthropic Cost レポートでは、UTC の真夜中の境界が必要です。手動トリガーの startTime フィールドに対して date/time transform を設定します。

  1. Date/time transform ノードを追加し、名前を Build rolling spend window にします。

  2. 変換するフィールドとして 1. Manually start.startTime を選択します。

  3. 次の変換を順番に追加します。

    1. TruncateDay に設定し、新しいフィールドを periodEnd にします。

    2. periodEndISO 8601 として Format し、新しいフィールドを periodEndIso にします。

    3. 1. Manually start.startTime を再度 DayTruncate し、新しいフィールドを dayStart にします。

    4. dayStart から SubtractDays1 日差し引き、新しいフィールドを periodStart にします。共通のルックバック期間を広げる場合は、後でこの減算値を変更します。

    5. periodStartISO 8601 として Format し、新しいフィールドを periodStartIso にします。

    Date/time transform for UTC day bounds

減算値が 1 の場合、このウィンドウは昨日の 00:00 UTC から今日の 00:00 UTC まで、1 つの完全な Daily Cost grupo となります。Anthropic の日次集計の動作に合わせて、未完了の本日分は含まれません。

ヒント

同じノードを参照する date/time ステップでは、直前のステップで作成した新しいフィールドのみを使用できます。periodEnd を文字列にフォーマットした後は、減算する前にトリガーの startTime をもう一度切り詰めてください。

Step 3: Load enabled thresholds

  1. Datastore ノードを追加し、名前を Load API key thresholds にします。

  2. Anthropic API Key Spend Thresholds テーブルを選択します。

  3. ActionGet に設定します。

  4. フィルターを追加します: enabled == true

    Datastore get for enabled thresholds

閾値を Datastore に保持しておくことで、フロー自体を編集することなく、リミットや通知先、強制適用対象のキーを変更できます。

Step 4: Read organization costs

  1. Anthropic の Perform an action ノードを追加し、名前を Read Anthropic org costs にします。

  2. Cost サービスから getCostReport アクションを選択します。

  3. Connection タブで、Anthropic Admin API connection を選択します。

  4. Parameters タブで、次のように設定します。

    • Starting_at: 2. Build rolling spend window.periodStartIso

    • Ending_at: 2. Build rolling spend window.periodEndIso

    • Bucket_width: 1d

    • Limit: 31

    group_by[]=api_key_id は追加しないでください。Cost API はこのディメンションを受け付けません。

    Anthropic getCostReport parameters

コスト金額は、最小通貨単位の 10 進数文字列として返されます。USD の場合は、100 で割ってドルに変換します。

Step 5: Read usage by API key

  1. もう 1 つ Anthropic のアクションノードを追加し、名前を Read Anthropic API key usage にします。

  2. Usage サービスから getMessagesUsageReport アクションを選択します。

  3. 同じ connection と periodStartIso / periodEndIso の参照を使用します。

  4. Bucket_width1dLimit31 に設定します。

  5. Add additional parameters を選択し、group_by[] を選択して、値を api_key_id に設定します。

    Anthropic getMessagesUsageReport parameters

Step 6: Find keys over threshold

標準ノードで閾値の読み込みと Anthropic の呼び出しはできますが、日次 grupo の合計、セントから USD への変換、トークンシェアに基づく支出のアトリビュート、閾値超過キーごとの違反レコード出力を行うには、code node を使うのが最もわかりやすい方法です。

  1. Code ノードを追加し、名前を Find keys over threshold にします。

  2. eventKey, apiKeyId, apiKeyName, spendUsd, thresholdUsd, lookbackDays, periodStart, periodEnd, notifyEmail, action, enforcedAt などのフィールドを持つオブジェクトの配列用に、Advanced schema を使用します。

  3. コードエディタで、Cost 金額を組織全体の USD に集約し、Usage のトークン数を api_key_id ごとに合計し、トークンシェアに基づいて支出をアトリビュートし、アトリビュートされた支出が thresholdUsd に達しているか、または上回っているキーのみを返します。

    比較ロジックは次のようになります。

    const keyTokens = tokensByKey.get(apiKeyId) ?? 0;
    const spendUsd =
    totalTokens > 0
    ? Number(((orgSpendUsd * keyTokens) / totalTokens).toFixed(6))
    : 0;
    if (spendUsd < thresholdUsd) continue;

    Code node that finds keys over threshold

プレースホルダー行や無効化された閾値はスキップし、ドラフトの Datastore シードによって誤ったキーが非アクティブ化されないようにします。

Step 7: Deactivate over-limit keys

  1. Anthropic のアクションノードを追加し、名前を Deactivate Anthropic API key にします。

  2. Api Keys サービスから updateApiKey を選択します。

  3. api_key_id6. Find keys over threshold.message.apiKeyId に、statusinactive に設定します。

    Anthropic updateApiKey parameters

CloudFlow は、Code ノードが返した違反レコード 1 件ごとに、このアクションを 1 回実行します。

Step 8: Email a notice

  1. Send a message ノードを追加し、名前を Email key disabled notice にします。

  2. Notification providerEmail に設定します。

  3. 受信者を 6. Find keys over threshold.message.notifyEmail に設定します。

  4. apiKeyName, apiKeyId, spendUsd, thresholdUsd, lookbackDays などの参照フィールドから、件名とメッセージ本文を組み立てます。通知テンプレートがサポートしている場合は、通貨値には format(..., "#,##0.00") を使用してください。

  5. Don't send notification if no results を有効にして、違反がない実行では通知が送信されないようにします。

    Email notification for deactivated keys

ステップ 9: エンフォースメントイベントを記録する

  1. Datastore ノードを追加し、Record enforcement event と名付けます。

  2. Anthropic API Key Spend Enforcement Events テーブルを選択します。

  3. ActionUpsert に設定し、Upsert キーに eventKey を指定します。

  4. 6. Find keys over threshold.message から列をマッピングします。例:eventKeyapiKeyIdspendUsdthresholdUsdperiodStartperiodEndenforcedAt

    Datastore upsert for enforcement events

eventKey として apiKeyId:periodStart:periodEnd を使用すると、キー 1 つとレポート期間 1 つごとに 1 行の監査レコードが保持されます。

フローを公開して実行する

  1. Datastore で、実際の apiKeyId を設定し、検証したい動作に合う thresholdUsd を選択し、notifyEmail を設定し、フローがキーを非アクティブ化する準備ができたときにのみ enabledtrue に切り替えます。

  2. Publish を選択し、続けて Run を選択します。

  3. Run history ページで各ステップを展開し、出力を確認します。有効な閾値超過キーがない状態でドライランが成功すると、すべてのステップが完了し、エンフォースメント行の Upsert 件数は 0 件になります。

Completed run history for the spend threshold flow

キーが閾値を超えた場合、フローはそのキーを非アクティブ化し、設定された受信者にメールを送信し、後から Datastore やダッシュボードウィジェットで確認できるエンフォースメントイベントを書き込みます。

参考情報