cloud-functions について
cloud-functionsは、CloudBaseのイベント関数とHTTP関数の作成、デプロイ、確認、デバッグを支援する開発スキルです。コーディングエージェントが関数の種類を選び、実装資料を参照し、安全なデプロイ手順に従えるよう案内します。
主な機能
- 01イベント関数とHTTP関数のガイダンス
- 02関数のデプロイとデバッグ手順
- 03実装詳細の参照先案内
- 04デプロイ安全性とデータ保護の確認
活用シーン
- 01実行時ロジックに適した関数形式の選択
- 02関数ログやトリガーのデバッグ
- 03CloudBase SDKを使うHTTP関数の準備
- 04カスタムイメージ関数のデプロイと検証
MCP 対応
関数操作やデプロイ状況のポーリングに使うmanageFunctionsやqueryFunctionsなど、CloudBase MCPツールについて説明します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tencentcloudbase/ skills --skill cloud-functionsインストール後、Claude Code で/cloud-functionsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
checklist.mdLICENSE.mdreferences.mdreferences/event-functions.mdhttp-function-credentials.mdhttp-functions-custom-image.mdhttp-functions.mdoperations-and-config.mdvpc-and-tcp-database.md詳細
関連スキル(ローカルのみ)
関連する CloudBase スキルは、このスキルと同じ場所に配置されています。../auth-tool-cloudbase/SKILL.md のようなローカルの相対パスを使用してください。
参照先の関連スキルファイルがこの環境にない場合は、CloudBase プラグイン一式(または不足しているスキル)をインストールするようユーザーに依頼してください。リモートのスキルやプロトコルの Markdown を HTTP で取得して、エージェントのコンテキストに読み込んではいけません。
横断的なプロトコル(コード変更またはデプロイの前に必須):
- 変更安全性プロトコル:
../cloudbase-platform/references/protocols/change-safety-protocol.md - デプロイゲート:
../cloudbase-platform/references/protocols/deployment-gate.md - センシティブなランタイムデータの保護:
../cloudbase-platform/references/protocols/sensitive-runtime-data-protection.md
Cloud Functions の開発
有効化の条件
まずこのスキルを使用する場合
- アプリケーションのランタイムロジックを提供する CloudBase Event Function または HTTP Function の作成、更新、デプロイ、調査、デバッグがタスクである場合。
- リクエストに関数のランタイム、関数ログ、
scf_bootstrap、関数トリガー、または関数ゲートウェイへの公開が含まれる場合。
コードを書く前に読む場合
- Event Function と HTTP Function のどちらを使うか、まだ判断する必要がある場合。
- タスクで
manageFunctions、queryFunctions、manageGateway、または従来の関数ツール名に言及されている場合。 - ログまたはゲートウェイの設定に、代替手段として
callCloudApiが必要になる可能性がある場合。 - HTTP Function から
@cloudbase/node-sdkまたは@cloudbase/manager-nodeを介して CloudBase リソースを呼び出す場合 →./references/http-function-credentials.mdを読んでください。HTTP Function では認証情報を明示的に指定する必要があります。Event Function のパスワードレスなランタイム経路に依存してはいけません。
例外のみ(デフォルトでは読まないでください)
- クラシックな TCP DB クライアント(
DATABASE_URL/ Prisma /mysql2/pg/ Redis)をすでに使用している既存アプリを移行する場合 →./references.md経由で./references/vpc-and-tcp-database.mdを読んでください。新しいビジネスデータの CRUD では、TCP の代わりに CloudBase ネイティブ SDK(app.database()/app.rdb())または MCP SQL ツールを優先してください。
その後、以下も読んでください
- 詳細な参照先の案内 →
./references.md - 認証の設定またはプロバイダー関連のバックエンド作業 →
../auth-tool-cloudbase/SKILL.md - CloudBase Integration Center で生成された WeChat Pay または Official Account の関数 →
../cloudbase-wechat-integration/SKILL.md(公式ドキュメント:https://docs.cloudbase.net/integration/introduce.md) - 関数での AI 利用 →
../ai-model-nodejs/SKILL.md - 長時間稼働するコンテナーサービスまたはエージェントのランタイム →
../cloudrun-development/SKILL.md - クライアントまたはスクリプトから CloudBase 公式プラットフォーム API を呼び出す場合 →
../http-api-cloudbase/SKILL.md
使用しない場合
- CloudRun コンテナーサービス。
- Web 認証 UI の実装。
- データベーススキーマの設計または一般的なデータモデルの作業。
- CloudBase 公式プラットフォーム API のクライアント、またはプラットフォームのエンドポイントのみを利用する生の HTTP インテグレーション。
- 推測した API を使った Integration Center インスタンスの作成。WeChat Pay または Official Account の生成関数については、ビジネス上の仕様に
cloudbase-wechat-integrationを使用し、このスキルは関数の操作にのみ使用してください。 - CloudBase JS SDK で直接処理できるタスク — 簡単なデータの読み書き、ランキング、ファイルのアップロード、リアルタイムクエリ。関数を作成する前に、該当する SDK の機能を優先してください。確認済みの NoSQL コレクションには
db.collection(...).get/add/updateのみを使用し、CloudBase PG テーブルにはapp.rdb().from(...)を使用してください。関数を使うと、SDK なら完全に不要にできるデプロイの複雑さ、CORS 設定、HTTP ゲートウェイのバインドが増えます。
よくある間違い/注意点
- 間違った関数タイプを選び、後から補おうとすること。
- CloudBase 公式 API クライアントでの作業と、独自の HTTP 関数の構築を混同すること。
- Event Function のコード形式(
exports.main(event, context))と、HTTP Function のコード形式(ポート9000でのreq/res)を混在させること。 - HTTP Access を HTTP Functions の実装モデルとして扱うこと。HTTP Access は Event Functions 用のゲートウェイ設定であり、HTTP Function のランタイムモデルではありません。
db.collection("name").add(...)を実行すれば、存在しないドキュメントデータベースのコレクションが自動作成されると思い込むこと。コレクションの作成は別途管理する必要があります。- デプロイパッケージに静的コンテンツを埋め込むこと — メディアファイル、ユーザーアップロード、または独自のサイクルで変更されるアセット。 パッケージはデプロイのたびにアップロードされ、関数パッケージには厳格なサイズ上限があります。そのため、大容量のコンテンツや個別に変更されるコンテンツは、デプロイを毎回遅くし、パッケージが上限を超える原因にもなります。
- メディアファイル(
*.mp4、大きな画像、フォント)— パッケージに含めず、クラウドストレージに置いて URL で参照します。 - 関数のローカルファイルシステムに書き込むユーザーアップロード — 関数は一時的なもので、
/tmpの容量は小さく、共有もされません。アップロードはクラウドストレージに保存します。 - 頻繁に更新される静的リソースをパッケージにバンドルすること — 変更のたびに関数全体の再デプロイが必要になります。関数は コード が変更されたときだけ再デプロイされるよう、静的リソースはクラウドストレージから配信します。
- メディアファイル(
- 作成後にランタイムを変更できないことを忘れること。
- Web ログインに対する最初の解決策としてクラウド関数を使うこと。
- HTTP Functions には
scf_bootstrapを同梱し、ポート9000でリッスンさせ、依存関係も含める必要があることを忘れること。 - HTTP Function で CloudBase SDK を使うのに明示的な認証情報が不要だと思い込むこと。デフォルトの一時認証情報の経路は HTTP Functions では信頼できず、認証情報のローテーションによって実行中のサービスが停止する可能性があります。
@cloudbase/node-sdkには CloudBase サーバー API Key または Tencent Cloud キーペアを使用し、@cloudbase/manager-nodeには Tencent Cloud キーペアを使用してください。references/http-function-credentials.mdを参照してください。 - HTTP Function へのアクセス方法を忘れること。認証情報なしの呼び出しは
401 MISSING_CREDENTIALSで失敗し、認証情報があっても許可されていない呼び出しは403 EXCEED_AUTHORITYで失敗します。ブラウザー、ゲーム、アプリのクライアント向けには、関数のセキュリティルールを緩和するのではなく、ゲートウェイルート(manageGateway(action="createRoute", auth: false))を追加してください。PostgreSQL 環境では、このルールは環境全体に適用されるauthz.user.regoドキュメントにあるため、編集すると環境全体のポリシーが上書きされます。references/http-functions.mdを参照してください。 InsufficientBalanceによる呼び出し失敗を、アカウントの問題として捉えること。 クラウド関数はこのコードで HTTP 410 を返し、コード上はアカウント残高不足のように見えますが、実際に不足しているのは環境のリソースポイントです。これはアカウント残高より先に消費され、チャージしても復元されません。原因は4つ(トライアルポイントの枯渇/プランポイントの枯渇/プランの期限切れ/アカウントの未払い)で、それぞれ対処方法が異なり、チャージが関係するのは最後のケースだけです。そのため、案内する前にmanageEnv(action="usage")とアカウント残高を確認して原因を診断してください。../cloud-api-operations/references/recipes/credits-exhaustion.mdを参照してください。scf_bootstrapの Node.js バイナリパスと関数ランタイムを一致させないこと(例:runtime: "Nodejs16.13"を設定しているのに/var/lang/node18/bin/nodeを使用する)。- Custom Image HTTP Functions で、TCR、CloudApp ビルド、SCF を同じリージョンに配置する必要があることを忘れること、
latestの代わりに一意のタグを使わないこと、またはリクエスト駆動のポート9000のイメージモデルと、注入されたPORTでリッスンする長時間稼働の CloudRun コンテナを混同すること。 - MCP ですべてのイメージパイプラインをカバーできると思い込むこと。
manageFunctionsはruntime: "CustomImage"とimageConfigによる SCF イメージのデプロイ(Stage B)をカバーしますが、CloudApp のカスタムビルドから TCR へのプッシュ(Stage A)は Tencent Cloud API を直接呼び出す必要があります。callCloudApiにフォールバックする前に、公式ドキュメントでアクション名とパラメーターを確認してください。 - Change Safety Protocol(
cloudbase-platform/references/protocols/change-safety-protocol.md)に従う前に、コードや設定を変更すること。 cloudbase-platform/references/protocols/deployment-gate.mdのチェックを完了する前に、関数を公開したりデプロイしたりすること。req.headers、process.env、event、contextをそのまま返すこと — ゲートウェイによってはx-cloudbase-context(base64 形式の一時認証情報)が注入されることがあります。このヘッダーをエコーしたり、認証情報を含む環境変数をクライアントに出力したりしないでください。../cloudbase-platform/references/protocols/sensitive-runtime-data-protection.mdに従ってください。- 環境をまたいでレイヤー名(例:
common)をそのまま使うこと。 SCF の LayerName はアカウント単位で共有される名前空間です。同じ名前を使うと、バージョン番号も共有されます。新しいレイヤーは固定形式{layerName}_{当前envId}(例:common_cloud1-d9ghadgak3edf6b36)で作成してください。layerNameには完全な名前を指定し、自動サフィックスを独自に付けないでください。MCP レイヤーのwarningsはソフトアドバイザリとして扱ってください(操作自体は成功します)。詳細は./references/operations-and-config.mdを参照してください。 - 実行時間の長い MCP イメージデプロイでは、ワークフローを最後まで完了させる必要があります:実際の
cloudまたはlocalデプロイにmanageFunctionsのdeployFunctionを使用する場合は、1回の Tool Call を長時間ブロックしないよう、wait=falseを優先してください。ツールがtaskIdを返した場合、ステータスがrunningの間はワークフローを終了したり、成功を報告したり、ユーザーに待つよう求めたりしないでください。queryFunctions(action="getFunctionDeployStatus", taskId="...")を自動的に呼び出し、報告された進捗に従ってステータスがsucceededまたはfailedになるまでポーリングを続けてください。妥当な回数ポーリングしても完了しない場合に限り、デプロイが進行中であることを報告してください。その際はtaskId、現在のステージ、最新の進捗を含めてください。成功した場合は、イメージ URI またはビルド ID、関数のステータス、Gateway URL を報告してください。失敗した場合は、失敗したステージ、エラーコード、リクエスト ID、診断方法を報告してください。ステータスがexpiredの場合は、ローカルのタスク記録が保持期間を超えたことを説明してください。クラウド側ではデプロイがまだ進行中の可能性があるため、失敗として扱うのではなく、getFunctionDetailを呼び出して実際のクラウド側のステータスを確認してください。
最小チェックリスト
- デプロイまたはランタイムの変更を行う前に、Cloud Functions Execution Checklistをお読みください。
- 対象がイベント関数、HTTP 関数、または実際には CloudRun のいずれなのかを判断してください。
- 静的コンテンツと動的コンテンツを分けてください:メディア、ユーザーのアップロード、頻繁に更新されるアセットは、関数パッケージではなくクラウドストレージに配置します。
- 実装コードを書く前に、references.mdから詳細なリファレンスファイルを選んでください。
ポーリングを伴う MCP イメージのデプロイ
実際の cloud または local カスタムイメージのデプロイでは、次を優先してください。
{
"action": "deployFunction",
"dryRun": false,
"confirm": true,
"wait": false,
"deployConfig": {}
}
wait フィールドは、現在の MCP ツール呼び出しでデプロイが完了するまで待機するかどうかを制御します。
wait=true:マネージャーのデプロイが最終結果に到達するまで待機し、その結果を返します。wait=false:デプロイが MCP のバックグラウンドで続行される間に、taskIdを速やかに返します。
wait=falseでtaskIdが返された場合、デプロイのワークフローは完了していません。action="getFunctionDeployStatus"とそのtaskIdを指定して、自動的にqueryFunctionsを呼び出してください。ステータスがrunningの間は呼び出しを続け、succeededまたはfailedになった時点でのみ終了してください。最初の追加クエリの前に約5秒待ち、返された進捗状況とnextActionsに従って、過度な頻度でポーリングせずに続行してください。ユーザーに再度尋ねるよう伝えたり、最終ステータスが返される前に成功を示唆したりしないでください。expiredステータスは、タスクが最大保持期間を超過し、ローカルで強制終了されたことを意味します。クラウドでのデプロイはまだ進行中の可能性があるため、失敗と報告するのではなく、getFunctionDetailで実際の状態を確認してください。
妥当なポーリング回数の上限に達した場合は、タスクがまだ実行中であることのみを報告し、taskId、現在のステータス、現在のステージ、最新の進捗状況を含めてください。最終結果が得られた場合は、デプロイ戦略、アクション、イメージ URI/ダイジェスト、ビルド ID、関数のステータス、Gateway URL、または失敗したステージ、エラーコード、リクエスト ID、診断の次の手順を報告してください。
Personal-tier TCR 認証情報 — パスワードをツールの引数に入れないでください
Personal-tier のイメージビルド(imageConfig.imageType="personal"とlocal/cloudの組み合わせ)には、TCR へのプッシュ用認証情報が必要です。ツールの引数ではなく、MCP プロセスの環境から読み取ってください。
- MCP サーバーの
envブロックにTCB_TCR_USERNAMEとTCB_TCR_PASSWORDが設定されている場合は、func.imageConfig.build.registryCredentialをリクエストに含めないでください。TENCENTCLOUD_SECRETIDと同様に、MCP が自動的に補完します。 - パスワードをチャットに貼り付けるようユーザーに求めないでください。また、ツールの引数に書き込まないでください。 引数に入れた情報はすべて、モデルのコンテキストとツール呼び出し履歴に含まれます。
- デプロイが
CLOUD_REGISTRY_CREDENTIAL_MISSINGまたはCLOUD_REGISTRY_CREDENTIAL_INVALIDで失敗した場合は、ユーザーにMCP設定のenvブロックへこの2つの変数を追加し、MCPサーバーを再起動するよう案内してください。認証情報をインラインで渡して回避してはいけません。 - ユーザー名はTencent CloudアカウントのUINであり、それ自体は秘密情報ではありません。必要であれば明示的に渡せます。フィールドごとに明示的な引数が優先されるため、ユーザー名を引数で渡し、パスワードを環境から取得する組み合わせも有効です。
その環境経路を利用できない場合を把握してください。 これは、クライアント設定でカスタムenvブロックを公開するローカルのstdio MCPサーバーでのみ機能します。一部のGUIクライアントはシェルのエクスポートを継承せず、IDEに組み込まれたMCPサーバーでは通常、ハードコードされた許可リスト(多くの場合はTENCENTCLOUD_*のみ)から認証情報が挿入されるため、ユーザーが任意の変数を設定できない場合があります。こうしたユーザーに「MCPのenvブロックに設定してください」と伝えても、実行できない指示になります。エンタープライズレジストリ(固定パスワードの代わりに有効期間の短いTCRトークンを発行するimageType="enterprise")を案内するか、すでにプッシュ済みのイメージを指定してbuildStrategy="image"を使用してください。
エンタープライズティアのビルドには、CAM 権限を持つログイン状態が必要です
cloud / local のビルドでエンタープライズレジストリを使用する場合、CAM 経由で TCR トークンが発行されます(autoGrant も同様です)。環境レベルの API Key と OAuth で発行された STS 認証情報には CAM ポリシーが付与されていないため、これらの呼び出しは UnauthorizedOperation で失敗します。MCP は実際のエンタープライズビルドを開始する前にログイン状態を確認し、途中で失敗するのではなく、事前に拒否します。このエラーは再試行可能な障害ではなく、ルーティングの判断材料として扱ってください。
- アカウントレベルの
TENCENTCLOUD_SECRETID/TENCENTCLOUD_SECRETKEYペアでサインインする、または buildStrategy="image"に切り替え、別の場所でプッシュしたイメージをデプロイする、または- パーソナルティアのレジストリを使用する — 静的パスワードは CAM に触れずにそのまま
docker loginに渡されるため、API Key ユーザーが利用できる唯一のビルド方法です。
作成モードの概要
- リクエストが SDK 呼び出し、タイマー、またはイベント駆動型ワークフローの場合は、
exports.main = async (event, context) => {}を使った イベント関数を作成します。 - リクエストが REST API、ブラウザー向けエンドポイント、SSE、または WebSocket の場合は、ポート
9000でreq/resを使う HTTP 関数を作成します。 - Node.js の HTTP 関数では、ユーザーが Express、Koa、NestJS、または別のフレームワークを明示的に指定しない限り、ネイティブの
httpモジュールをデフォルトで使用します。 - HTTP 関数でカスタムシステムライブラリや任意のランタイムが必要でも、SCF のリクエスト駆動型でスケール・トゥ・ゼロの構成を維持したい場合は、TCR イメージから カスタムイメージ HTTP 関数(
Runtime: CustomImage)としてデプロイします。コンテナは固定ポート9000で引き続きリッスンします。./references/http-functions-custom-image.mdを参照してください。これは、注入されたPORTでリッスンし、長時間稼働する CloudRun コンテナとは異なります。 - Dockerfile がある HTTP ステートレスサービスでは、クラウドホスティングではなく HTTP クラウド関数を優先して検討できます — Dockerfile があるだけでは CloudRun を使う理由にはなりません。サービスがステートレスで、長時間接続/カスタムランタイム/VPC データベースアクセスを必要としないリクエスト駆動型 HTTP サービスであれば、HTTP 関数(またはカスタムイメージ HTTP 関数)を優先してください。デプロイが速く、費用も安く、CloudRun 環境の初期化も不要です。WebSocket/SSE の長時間接続、安定した独立プロセス、カスタムシステム依存関係、または VPC DB アクセスが必要な場合にのみ、CloudRun(
../cloudrun-development/SKILL.md)を選択してください。 - 既存のイベント関数への HTTP アクセスについてユーザーから言及があった場合は、イベント関数のコード構成を維持し、ゲートウェイアクセスを別途追加します。
HTTP Function の作成ルール
関数コード自体を記述する際は、次のルールに従ってください。
- HTTP Function を
exports.main(event, context)として記述しないでください。これは Event Function のコントラクトです。 - 関数は、ポート
9000でリッスンする必要がある標準的な Web サーバープロセスとして扱ってください。 - Node.js では、ランタイムのコントラクトを明確に保つため、デフォルトで
http.createServer((req, res) => { ... })を使用してください。 - Node.js のネイティブ
httpモジュールでは、Express のようなヘルパーが存在すると想定しないでください。req.body、req.query、req.paramsは自動的に提供されません。 - Node.js の HTTP Functions では、最初にモジュールシステムを一つ選び、一貫して使用してください。特に理由がなければ、シンプルな関数では CommonJS(
require(...)を使用し、package.jsonに"type": "module"を指定しない)をデフォルトにしてください。 - ES Modules(
"type": "module"とimport ...)を選ぶ場合は、require(...)、module.exports、単独の__dirnameなど、CommonJS 専用のグローバルや API を混在させないでください。ESM では、必要な場合に限り、import.meta.urlからfileURLToPath(...)を使ってファイルパスを取得してください。 - ネイティブの
httpモジュールでは、new URL(...)を使ってreq.urlを自分で解析し、ストリームからリクエスト本文を収集してからJSON.parseを呼び出してください。本文が空の場合は、常に JSON が存在すると想定せず、明示的に処理してください。 - JSON API では
application/json; charset=utf-8などのContent-Typeを含め、res.writeHead(...)とres.end(...)でレスポンスを明示的に返してください。 - CORS ヘッダーを処理してください。ただし、まず誰が CORS を処理するか確認してください。 HTTP ゲートウェイ経由で呼び出される関数は、
Access-Control-Allow-Originを設定してはいけません。ゲートウェイは環境のセキュリティドメイン許可リストからすでにこの値を設定しており、値が二重になると<origin>,*となり、ブラウザーに拒否されます。その結果、すべてのリクエストが、サービスが停止しているように見える CORS エラーで失敗します。CORS ヘッダーを設定するのは、ゲートウェイを介さず関数が直接呼び出される場合に限ってください。OPTIONSプリフライトには、空の204で応答してください。Access-Control-Allow-Originは、ゲートウェイを介さない直接の呼び出し元に限って含めてください。- 必要に応じて
Access-Control-Allow-Methods: GET, POST, OPTIONSを含めてください。 - JSON リクエストには
Access-Control-Allow-Headers: Content-Typeを含めてください。
- ルーティングとメソッドの処理を明示してください。不明なパスには
404を返し、既知のパスで未対応のメソッドが使われた場合は、通常405を返してください。 - ゲートウェイの設定とセキュリティルールの変更は、ランタイムコードとは分けてください。これらはアクセスに影響しますが、HTTP Function のプログラミングモデルには影響しません。
- 作業が HTTP Function 自体の作成だけである場合は、HTTP アクセスサービスの設定を追加しないでください。ゲートウェイのパスやカスタムドメインは、アクセス層に関する別の作業です。公開呼び出しの要件は、関数のセキュリティルールのワークフローで対応してください(注:匿名ログインはデフォルトで無効です)。
- HTTP Function から
@cloudbase/node-sdkまたは@cloudbase/manager-nodeを介して CloudBase を呼び出す場合は、デプロイ前に./references/http-function-credentials.mdに記載された明示的な認証情報の確認手順を完了してください。関数パッケージに認証情報をハードコードしないでください。 - 機密性の高いランタイムデータを絶対にそのまま返さないでください。 レスポンスで
req.headers、process.env、x-cloudbase-contextを返さないでください。デバッグ用エンドポイントでは、機密性のない値を明示的に許可リストで指定してください。../cloudbase-platform/references/protocols/sensitive-runtime-data-protection.mdを参照してください。
クイック判断表
| 質問 | 選択 |
|---|---|
| SDK 呼び出しやタイマーによってトリガーされますか? | イベント関数 |
| ブラウザーからアクセスできる HTTP エンドポイントが必要ですか? | HTTP 関数 |
| SSE または WebSocket サービスが必要ですか? | HTTP 関数 |
| カスタムシステムライブラリや任意のランタイムが必要であり、SCF のリクエスト駆動型+ゼロスケールを維持しますか? | Runtime: CustomImage を指定した HTTP 関数(TCR イメージからデプロイ) |
| Dockerfile はありますが、ステートレスな HTTP サービス(長時間接続/カスタムランタイム/VPC DB は不要)ですか? | HTTP 関数(またはカスタムイメージの HTTP 関数)— CloudRun ではありません |
| 長時間稼働するコンテナランタイムまたはカスタムシステム環境が必要ですか? | CloudRun |
| 既存のイベント関数への HTTP アクセスだけが必要ですか? | イベント関数+ゲートウェイアクセス |
このスキルの使い方(コーディングエージェント向け)
-
まず適切なランタイムモデルを選択します
- イベント関数 ->
exports.main(event, context) - HTTP 関数 -> ポート
9000で Web サーバーを起動 - 要件が実際にはコンテナサービスの場合は、早い段階で CloudRun に切り替えます
- イベント関数 ->
-
統合された MCP の入口を使用します
- 読み取り ->
queryFunctions、queryGateway - 書き込み ->
manageFunctions、manageGateway - 旧名称をそのままコピーせず、操作する前に新しい名称に置き換えます
- 読み取り ->
-
コードを書いてデプロイし、ローカルファイルだけで終わらせないでください
- 作成には
manageFunctions(action="createFunction")を使用します - コードの更新には
manageFunctions(action="updateFunctionCode")を使用します - 設定の更新(timeout、memorySize、envVariables)には
manageFunctions(action="updateFunctionConfig")を使用します - カスタムイメージの HTTP 関数の場合は、
func.runtime="CustomImage"とimageConfig(タグ付きのimageUri、エンタープライズ TCR の場合はregistryId)を指定してmanageFunctions(action="createFunction")を呼び出します。その後の更新ではmanageFunctions(action="updateFunctionCode")とimageConfigを使用します。コードはイメージ内にあるため、functionRootPathは不要です。./references/http-functions-custom-image.mdを参照してください。 functionRootPathには、関数フォルダーを直接含むディレクトリ(例:cloudfunctions/またはfunctions/)を指定します。プロジェクトルートや関数サブディレクトリ自体は指定しないでください- 利用可能な場合は MCP を優先してください — このセッションでこれらのツールが利用できる場合は、
manageFunctionsとqueryFunctionsを使用します - MCP がない場合は CLI にフォールバックします — 関数ツールが読み込まれていない場合(初回セッション/再起動前)は、次回に備えて MCP を設定してから、
../cloudbase-cli/SKILL.mdのtcb fn deployを使用します(ガイドラインtooling-fallback.mdを参照)。再起動を待って処理を止めないでください - ランタイムにシェルがない場合、CLI を作り出さないでください — MCP のみがあり、正常に動作する場合は MCP を使い続けます。どちらも動作しない場合は、その不足を報告します
- 複数の関数を一括更新する場合は、関数ごとに個別に
manageFunctions(action="updateFunctionConfig")を呼び出します — MCP には CLI のような--all一括処理パラメーターはありません - HTTP 関数が
@cloudbase/node-sdkを使用する場合は、manageAppAuth(action="createApiKey", keyType="api_key")で作成したサーバー API Key を優先し、CLOUDBASE_APIKEYとして注入します。Tencent Cloud のSecretId/SecretKeyもサポートされています - HTTP 関数が
@cloudbase/manager-nodeを使用する場合は、Tencent Cloud のSecretId/SecretKeyを注入します。CloudBase API Key で Manager SDK を初期化できると説明しないでください - 認証情報の環境変数は、関数の環境変数全体を置き換えるのではなく、既存の関数設定にマージします
- 作成には
-
ドキュメントを優先してフォールバックします
- タスクで
callCloudApiにフォールバックする場合は、まずそのアクションに関する公式ドキュメントまたはナレッジベースの項目を確認します - 呼び出す前に、正確なアクション名とパラメーターの仕様を確認します
- 記憶を頼りにクラウド API の生のペイロードを推測しないでください
- タスクで
-
適切な詳細リファレンスを確認します
- イベント関数の詳細 ->
./references/event-functions.md - HTTP 関数の詳細 ->
./references/http-functions.md - HTTP 関数の CloudBase SDK 認証情報 ->
./references/http-function-credentials.md - コンテナイメージから作成する HTTP 関数(
Runtime: CustomImage、TCR イメージパイプライン) ->./references/http-functions-custom-image.md - ログ、ゲートウェイ、環境変数、レイヤー(
{layerName}_{当前envId})、旧名称のマッピング ->./references/operations-and-config.md
- イベント関数の詳細 ->
データベースへの書き込みに関する注意
- 関数が CloudBase ドキュメントデータベースに書き込む場合は、コンソールまたは管理ツールを使って、対象のコレクションを先に作成します。
db.collection("feedback").add(...)は既存のコレクションにのみデータを挿入します。コレクションが存在しない場合にfeedbackを自動作成することはありません。- 要件に「存在しない場合は作成する」とある場合は、ランタイムの書き込み呼び出しで作成されると想定せず、最初の書き込み前に明示的なコレクション管理の手順を実装します。
関数タイプの比較
| 機能 | イベント関数 | HTTP 関数 |
|---|---|---|
| 主なトリガー | SDK 呼び出し、タイマー、イベント | HTTP リクエスト |
| エントリーポイントの形式 | exports.main(event, context) | req / res を使うウェブサーバー |
| ポート | ポート不要 | 9000 でリッスンする必要があります |
scf_bootstrap | 不要 | 必須 |
| 依存関係 | package.json から自動インストールされます | 関数コードに含める必要があります |
| 最適な用途 | サーバーレスハンドラー、スケジュール済みジョブ | API、SSE、WebSocket、ブラウザー向けサービス |
最小限のコードスケルトン
イベント関数の Hello World
cloudfunctions/hello-event/index.js
exports.main = async (event, context) => {
// Do not return event/context/process.env — they may contain platform secrets.
const name = typeof event?.name === "string" ? event.name : "world";
return {
ok: true,
message: `hello ${name} from event function`,
};
};
cloudfunctions/hello-event/package.json
{
"name": "hello-event",
"version": "1.0.0"
}
HTTP 関数の Hello World
cloudfunctions/hello-http/index.js
const http = require("http");
const { URL } = require("url");
// CORS: leave this empty when the function is reached through the HTTP gateway.
// The gateway already fills Access-Control-Allow-Origin from the environment
// security-domain allowlist; adding a second value makes the header illegal
// ('<origin>,*') and browsers block every request. Only set CORS headers here
// when the function is called directly, outside the gateway.
const CORS_HEADERS = {};
function sendJson(res, statusCode, data) {
res.writeHead(statusCode, {
"Content-Type": "application/json; charset=utf-8",
...CORS_HEADERS,
});
res.end(JSON.stringify(data));
}
function sendOptions(res) {
res.writeHead(204, CORS_HEADERS);
res.end();
}
function readJsonBody(req) {
return new Promise((resolve, reject) => {
let raw = "";
req.on("data", (chunk) => { raw += chunk; });
req.on("end", () => {
if (!raw) { resolve({}); return; }
try { resolve(JSON.parse(raw)); } catch (e) { resolve({}); }
});
req.on("error", reject);
});
}
const server = http.createServer(async (req, res) => {
// Handle CORS preflight
if (req.method === "OPTIONS") {
return sendOptions(res);
}
const url = new URL(req.url || "/", "http://127.0.0.1");
if (req.method === "GET" && url.pathname === "/") {
sendJson(res, 200, { ok: true, message: "hello from http function" });
} else if (req.method === "POST" && url.pathname === "/") {
const body = await readJsonBody(req);
sendJson(res, 200, { received: body });
} else {
sendJson(res, 404, { error: "Not Found" });
}
});
server.listen(9000);
ルーティング、メソッドのチェック、エラー処理を含む、より完全な例については、./references/http-functions.md を参照してください。
cloudfunctions/hello-http/scf_bootstrap
#!/bin/bash
/var/lang/node18/bin/node index.js
scf_bootstrap のバイナリパスはランタイムに合わせる必要があります。対応表の全体については、./references/http-functions.md を参照してください。
cloudfunctions/hello-http/package.json
{
"name": "hello-http",
"version": "1.0.0"
}
推奨ツールマップ
関数の管理
queryFunctions(action="listFunctions"|"getFunctionDetail")manageFunctions(action="createFunction")manageFunctions(action="updateFunctionCode")manageFunctions(action="updateFunctionConfig")
レイヤー(SCF Layer)
レイヤーは環境単位ではなく、アカウント単位です。MCP の manageFunctions / queryFunctions によるレイヤーのガイダンスに従ってください。
- 命名(新しいレイヤーでは必須):
{layerName}_{当前envId}— 例:common_cloud1-d9ghadgak3edf6b36。別の環境でcommonのような環境 ID のない名前を再利用しないでください。 - 作成:
queryFunctions(action="listLayers")で重複を確認してから、manageFunctions(action="createLayerVersion", layerName="…_{envId}", …)を実行します。名前に現在のenvIdが含まれていない場合、MCP はソフトなwarningsエントリーを返すことがありますが、名前は書き換えません。 - 参照:
queryFunctions(action="listLayers"|"listLayerVersions"|"getLayerVersionDetail"|"listFunctionLayers")— リストの結果はアカウント単位のビューであり、別の環境で作成されたレイヤーが含まれる場合があります。 - バインド/解除/置き換え:
manageFunctions(action="attachLayer"|"detachLayer"|"updateFunctionLayers") - バージョンの削除:
manageFunctions(action="deleteLayerVersion")— バージョンを削除すると、そのバージョンをバインドしているすべての環境に影響する場合があります。 - 詳細な仕様と警告の意味 →
./references/operations-and-config.md
ログ
クエリ関数のログ — queryFunctions ツールを使用します。
queryFunctions(action="listFunctionLogs", functionName="xxx")— 特定の関数の実行ログを一覧表示しますqueryFunctions(action="getFunctionLogDetail", requestId="xxx")— 1 件のログエントリの詳細を取得します
queryFunctions と queryLogs の違い:
queryFunctionsは単一のクラウド関数の実行ログをクエリし、functionNameが必要ですqueryLogsは CLS(クロスサービスログ集約)を CLS クエリ構文で検索します
例:
// List recent logs for cloud function "my-function"
queryFunctions(action="listFunctionLogs", functionName="my-function", limit=10)
// Inspect the log detail for a specific request id
queryFunctions(action="getFunctionLogDetail", requestId="abc-123")
// Cross-service error search via CLS
queryLogs(action="searchLogs", queryString='(src:app OR src:system) AND log:"ERROR"', service="tcb")
queryLogs の queryString は CLS 構文に従います(https://cloud.tencent.com/document/api/876/128127 を参照)。以下の例は出発点です。クエリ対象の具体的なログ内容に合わせて調整してください。
- 関数ログ:
(src:app OR src:system) AND log:"START RequestId" - 関数リクエストステータスの集約:
| select request_id, max(status_code) as status where ((request_id='xxxx' AND retry_num=0) AND retry_num=0) AND status_code!=202 group by request_id, retry_num - ドキュメントデータベース(NoSQL):
module:database - ドキュメントデータベースのスロークエリーイベント:
module:database AND eventType:(MongoSlowQuery)—MongoSlowQueryはドキュメントデータベースのスロークエリーイベントです - リレーショナルデータベース(MySQL):
module:rdb - リレーショナルデータベース(MySQL)のイベント:
module:rdb AND eventType:(MysqlFreeze OR MysqlRecover OR MysqlSlowQuery)—MysqlFreeze= フリーズ、MysqlRecover= 復旧、MysqlSlowQuery= スロークエリー - ワークフロー(承認フロー):
module:workflow - データモデル:
module:model - ユーザー権限:
module:auth - LLM トレースログ:
module:llm AND logType:llm-tracelog - ゲートウェイアクセスログ:
logType:accesslog - アプリの公開/削除イベント:
module:app AND eventType:(AppProdPub OR AppProdDel)—AppProdPub= アプリの公開、AppProdDel= アプリの削除
これらを利用できない場合は、callCloudApi によるフォールバックを行う前に ./references/operations-and-config.md を読んでください
ゲートウェイの公開
queryGateway(action="getRoute")/listRoutes/listCustomDomainsmanageGateway(action="createRoute")— HTTP 関数にはupstreamResourceType="WEB_SCF"を、Event 関数にはupstreamResourceType="SCF"を渡します。domainを省略すると、HTTP ゲートウェイの IsDefault ドメイン(通常は*.{region}.app.tcloudbase.com)にルートが追加されます(DomainType=HTTPSERVICE)- IsDefault と静的ホスティング CDN の違い: 環境には、別の IsDefault
STATIC_STOREドメイン(*.tcloudbaseapp.com)も公開されていることがよくあります。domainを省略しても、その静的ホスティング CDN エントリには紐付けられず、STATIC_STOREアップストリームの紐付けでもありません(これにはupstreamResourceType="STATIC_STORE"が必要です)。queryGateway(action="listRoutes")で確認し、Domain/DomainType/Path/UpstreamResourceTypeをチェックしてください manageGateway(action="updateRoute")/deleteRoute/enableRoute/disableRoute/bindCustomDomain/deleteCustomDomain- ルートまたは静的ホスティングのデフォルトドメインを無効にする場合:
manageGateway(action="disableRoute", domain=..., path=...)を優先してください(既存のルートを検索し、ModifyHTTPServiceRouteを介してRoutes[].Enable=falseを設定します)。updateRouteでenable=false/route.enable=falseを渡すこともできます。*.tcloudbaseapp.comを閉じるには、ルートを一覧表示し、STATIC_STOREの IsDefault ドメインを取得してから、そのdomainと通常はpath="/"を指定してdisableRouteを実行してください。manageHostingやModifyGatewayRouteは使用しないでください - ツールの結果に
accessUrl/accessUrlsが含まれる場合は、それらを直接優先して使用してください(ゲートウェイのカスタムドメイン URL はデフォルトドメインより優先されます) - 非推奨の GWAPI アクション(
CreateCloudBaseGWAPIなど)をcallCloudApi経由で呼び出さないでください
関連スキル
cloudrun-development-> コンテナサービス、長時間稼働するランタイム、エージェントのホスティングhttp-api-cloudbase-> CloudBase HTTP API の直接呼び出しパターンcloudbase-platform-> CloudBase プラットフォーム全般の選択ops-inspector-> AIOps 形式のサービス横断的な調査とログ検索
リファレンス一覧
スキルの到達性チェックに必要な、パッケージに含まれるすべてのリファレンスファイル: