> ## Documentation Index
> Fetch the complete documentation index at: https://developers.hubspot.jp/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# サーバーレス関数リファレンス（デザインマネージャー）

> デザインマネージャーで構築するサーバーレス関数のリファレンス情報（serverless.json、関数ファイル、エンドポイント、CLIコマンド、パッケージの管理など）

export const SupportedProducts = ({marketing, sales, service, cms, marketingLevel, salesLevel, serviceLevel, cmsLevel}) => {
  const translations = {
    header: "サポートされる製品",
    description: "次のいずれかの製品またはそれ以上が必要です。",
    productNames: {
      marketing: "Marketing Hub",
      sales: "Sales Hub",
      service: "Service Hub",
      cms: "Content Hub"
    },
    tiers: {
      free: "無料ツール",
      starter: "Starter",
      professional: "Professional",
      enterprise: "Enterprise"
    }
  };
  const translateTier = tier => {
    if (!tier) return '';
    const lowerTier = tier.toLowerCase();
    return translations.tiers[lowerTier] || tier;
  };
  const products = [{
    name: marketing ? translations.productNames.marketing : '',
    level: translateTier(marketingLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/marketing-bolt.svg",
    alt: "Marketing Hub"
  }, {
    name: sales ? translations.productNames.sales : '',
    level: translateTier(salesLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/sales-star.svg",
    alt: "Sales Hub"
  }, {
    name: service ? translations.productNames.service : '',
    level: translateTier(serviceLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/service-heart.svg",
    alt: "Service Hub"
  }, {
    name: cms ? translations.productNames.cms : '',
    level: translateTier(cmsLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/content-play.svg",
    alt: "Content Hub"
  }].filter(product => product.name && product.level);
  if (products.length === 0) return null;
  return <div>
      <div className="text-sm mb-2">{translations.description}</div>
      <div className={`grid ${products.length === 1 ? 'grid-cols-1' : 'grid-cols-2'} gap-1.5`}>
        {products.map((product, index) => <div key={index} style={{
    display: 'flex',
    alignItems: 'center'
  }}>
            <img src={product.icon} alt={product.alt} className="w-3.5 h-3.5 mr-1.5 mt-2.5 mb-2.5 flex-shrink-0 align-middle" />
            <span className="font-medium mr-1 text-sm">{product.name} -</span>
            <span className="text-sm">{product.level}</span>
          </div>)}
      </div>
    </div>;
};

<Accordion title="サポートされる製品" defaultOpen="true" icon="cubes">
  <SupportedProducts cms={true} cmsLevel="enterprise" />
</Accordion>

<Warning>
  ### 注：

  このページには、デザインマネージャーを使用して作成されたサーバーレス関数のリファレンス情報が含まれています。これはCMSページのサーバーレス関数を作成する従来の方法であり、現在もサポートされています。ただし、今後は[HubSpot開発者プロジェクトを使ったサーバーレス関数の作成とデプロイ](/cms/start-building/features/serverless-functions/getting-started-with-serverless-functions)が推奨されます。プロジェクトベースのサーバーレス関数には、サードパーティーの依存関係を含めることができ、非公開のアプリアクセストークンを介した認証により直接アクセスできます。
</Warning>

この記事では、[サーバーレスの`.functions`フォルダー](/cms/start-building/features/serverless-functions/overview#serverless-function-folders)内にあるファイルと、サーバーレス関数で使用できるCLIコマンドについて説明します。

サーバーレス関数の概要については、[サーバーレス関数の概要](/cms/start-building/features/serverless-functions/overview)をご確認ください。

[JavaScriptのレンダリングされたモジュールとパーシャル](https://github.hubspot.com/cms-js-building-block-examples/)のプロジェクトを使用してサーバーレス関数を作成する方法の詳細については、[開発者プロジェクトのドキュメント](https://developers.hubspot.jp/docs/cms/reference/serverless-functions/serverless-functions-in-projects)をご参照ください。

## Serverless.json

`.functions`フォルダーの`serverless.json`ファイルには、サーバーレス関数構成が保存されます。これは必須ファイルであり、これによって関数が[APIエンドポイント](#endpoints)にマッピングされます。

```json theme={null}
{
  "runtime": "nodejs20.x",
  "version": "1.0",
  "environment": {
    "globalConfigKey": "some-value"
  },
  "secrets": ["secretName"],
  "endpoints": {
    "events": {
      "file": "function1.js",
      "method": "GET"
    },
    "events/update": {
      "method": "POST",
      "file": "action2.js",
      "environment": {
        "CONFIG_KEY": "some-other-value"
      },
      "secrets": ["googleKeyName", "otherkeyname"]
    }
  }
}
```

| キー            | 型      | 説明                                                                                                                                                           |
| ------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `runtime`     | 文字列    | ランタイム環境。[Node.js](https://nodejs.org/ja/about/) v20（`nodejs20.x`）をサポートします。                                                                                   |
| `version`     | 文字列    | HubSpotサーバーレス関数スキーマバージョン（現在のバージョンは1.0）                                                                                                                       |
| `environment` | オブジェクト | 関数の実行時に[環境変数](https://nodejs.org/docs/latest-v10.x/api/process.html#process_process_env)として渡される構成用の変数。環境変数に基づいて、実際のAPIの代わりにテストバージョンを使用するロジックを追加する場合などに使用します。 |
| `secrets`     | 配列     | サーバーレス関数が認証に使用する[シークレット](#secrets)の名前を含む配列。このファイルにはシークレット値を直接格納するのではなく、シークレット名の参照だけを格納してください。                                                                |
| `endpoints`   | オブジェクト | APIエンドポイントは、公開されるパスと、functionsフォルダー内の特定のJavaScriptファイルへのそれらのパスのマッピングを定義します。詳しくは[APIエンドポイント](#endpoints)をご参照ください。                                             |

<Info>
  HubSpotは2025年10月1日で[Node 18のサポートを終了](https://developers.hubspot.com/changelog/deprecation-of-node-v18-in-all-serverless-functions-and-cli)します。同日以降、ランタイムがv20未満のサーバーレス関数はデプロイできなくなります。\\
</Info>

<Warning>
  ### 注：

  シークレットと環境変数に同じ名前を割り当てないでください。同じ名前を割り当てると、関数で値が返されるときに競合が発生します。
</Warning>

### APIエンドポイント

各APIエンドポイントには独自の[環境変数](https://nodejs.org/docs/latest-v10.x/api/process.html#process_process_env)とシークレットを設定できます。APIエンドポイント外で指定した変数は、全ての関数とAPIエンドポイントに適用する設定として使用されます。

```json theme={null}
"events/update": {
      "method": "POST",
      "file": "action2.js",
      "environment": {
        "configKey": "some-other-value"
      },
      "secrets": ["googleAPIKeyName","otherKeyName"]
    }
```

| キー       | 型            | 説明                                                                                                                                                                                            |
| -------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `method` | 文字列または文字列の配列 | このAPIエンドポイントでサポートされている[HTTPメソッド（複数可）](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Methods)。デフォルトでは[GET](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Methods/GET)です。 |
| `file`   | 文字列          | APIエンドポイントの実装を含むJavaScript関数ファイルへのパス。                                                                                                                                                         |

エンドポイントを呼び出すには、HubSpotアカウントに接続されたドメインのいずれか（デフォルトの`.hs-sites.com`サブドメインを含む）で以下のURL構造のURLを呼び出します。

`https://{domainName}/_hcms/api/{endpoint-name/path}?portalid={hubId}`

| パラメーター               | 説明                                                                              |
| -------------------- | ------------------------------------------------------------------------------- |
| `domainName`         | HubSpotアカウントに接続されているドメイン。                                                       |
| `/_hcms/api/`        | サーバーレス関数用に予約されたパス。全てのAPIエンドポイントは、このパスに存在しています。                                  |
| `endpoint-name/path` | `serverless.json`ファイルで指定したAPIエンドポイントの名前またはパス。                                   |
| `portalid`           | HubSpotアカウントIDを含む任意のクエリーパラメーター。これをリクエストに含めることで、モジュールとテンプレートのプレビュー時に関数のテストを行えます。 |

例えば、`website.com`と`subdomain.brand.com`の両方がアカウントに接続されている場合、`https://website.com/_hcms/api/{endpoint-name/path}`または`https://subdomain.brand.com/_hcms/api/{endpoint-name/path}`を使用して関数を呼び出すことができます。

## 関数ファイル

`serverless.json`構成ファイルに加え、`.functions`フォルダーには関数を定義する[Node.js](https://nodejs.org/ja/) JavaScriptファイルが格納されます。[Request](https://github.com/request/request#readme)ライブラリーを利用して、[HubSpot API](https://developers.hubspot.jp/docs/api-reference/overview)や他のAPIへのHTTPリクエストを行うこともできます。

以下に例を示します。

```js theme={null}
// Require axios library, to make API requests.
const axios = require("axios");
// Environment variables from your serverless.json
// process.env.globalConfigKey

exports.main = (context, sendResponse) => {
  // your code called when the function is executed

  // context.params
  // context.body
  // context.accountId
  // context.limits

  // secrets created using the CLI are available in the environment variables.
  // process.env.secretName

  //sendResponse is what you will send back to services hitting your serverless function.
  sendResponse({ body: { message: "my response" }, statusCode: 200 });
};
```

### コンテキストオブジェクト

コンテキストオブジェクトには、次のパラメーターに格納された、関数の実行に関するコンテキスト情報が含まれています。

| パラメーター      | 説明                                                                                                                                                                                                                                                                           |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `accountId` | 関数が含まれているHubSpotアカウントのID。                                                                                                                                                                                                                                                    |
| `body`      | `application/json`のコンテンツタイプを持つ`POST`リクエストが送信された場合に取り込まれます。                                                                                                                                                                                                                   |
| `contact`   | リクエストがCookieにひも付けられたコンタクトから送信された場合、contactオブジェクトには一連の基本的なコンタクトプロパティーに加え、以下の情報が格納されます。<ul><li>`vid`：コンタクトの訪問者ID。</li><li>`isLoggedIn`：CMSメンバーシップ（アクセス権設定）を使用している場合、コンタクトがドメインにログインすると、この値が`true`に設定されます。</li><li>`listMemberships`：当該コンタクトがメンバーとなっているコンタクトリストIDの配列。</li></ul> |
| `headers`   | APIエンドポイントに対してクライアントから送信された[ヘッダー](#headers)が含まれます。                                                                                                                                                                                                                           |
| `params`    | クエリー文字列値、およびHTMLフォームによるPOST値が取り込まれます。文字列によるキーと文字列の配列による値のマップとして構成されます。`context.params.yourvalue`                                                                                                                                                                             |
| `limits`    | [サーバーレス関数のレート制限](/cms/start-building/features/serverless-functions/overview#know-your-limits)にどの程度近づいているかに関する情報を返します。<ul><li>`executionsRemaining`：1分当たりの残っている実行数。</li><li>`timeRemaining`：残っている実行可能時間。</li></ul>                                                            |

### ヘッダー

APIエンドポイントにアクセスしているクライアントのヘッダーを把握する必要がある場合は、`context.body`を使用して情報にアクセスする場合と同じ方法で、`context.headers`を使用して該当するヘッダーにアクセスできます。

以下の表に、HubSpotが提供する一般的なヘッダーの一部を記載します。完全なリストについては、[MDNのHTTPヘッダーのドキュメント](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers)をご参照ください。

| ヘッダー                        | 説明                                                                                                                                                                                                   |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `accept`                    | クライアント側で処理できるコンテンツタイプを[MIMEタイプ](https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/MIME_types)として示します。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。 |
| `accept-encoding`           | クライアント側で処理できるコンテンツエンコーディングを示します。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                                          |
| `accept-language`           | 使用される言葉とロケールを示します。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                                                        |
| `cache-control`             | キャッシュ用のディレクティブを保持します。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                                                     |
| `connection`                | ネットワーク接続が開いたままかどうかを示します。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                                                  |
| `cookie`                    | クライアントから送信されたCookieが格納されます。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                                               |
| `host`                      | リスニングサーバーのドメイン名とTCPポート番号を示します。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                                            |
| `true-client-ip`            | エンドユーザーのIPアドレス。詳しくは[Cloudflare true-client-ip](https://developers.cloudflare.com/network/true-client-ip-header/)をご参照ください。                                                                            |
| `upgrade-insecure-requests` | レスポンスの暗号化と認証について、クライアント側の設定を示します。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                                         |
| `user-agent`                | アプリケーション、オペレーティングシステム、アプリケーションベンダー、バージョンを識別するためのベンダー定義文字列。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                |
| `x-forwarded-for`           | プロキシーまたはロードバランサーを通過するクライアントの発信元IPアドレスを識別します。詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Accept)をご参照ください。                                                              |

#### ヘッダーの送信によるリダイレクト

「location」ヘッダーと`301` statusCodeを含むレスポンスを送信することで、サーバーレス関数からリダイレクトを実行できます。

```js theme={null}
sendResponse({
  statusCode: 301,
  headers: {
    Location: "https://www.example.com",
  },
});
```

### APIエンドポイントからCookieを設定する

サーバーレス関数によって、クライアント（ウェブブラウザー）にCookieを設定するように指示できます。

```js theme={null}
exports.main = (context, sendResponse) => {
    sendResponse({
      body: { ... },
      'Set-Cookie': 'myCookie1=12345; expires=...; Max-Age=...',
      statusCode: 200
    });
  }
```

### 1つのヘッダーに複数の値を設定する

複数の値をサポートするヘッダーには、`multiValueHeaders`を使用して値を渡すことができます。例えば、ブラウザーに複数のCookieを設定するように指示できます。

```js theme={null}
exports.main = (context, sendResponse) => {
  sendResponse({
    body: { ... },
    multiValueHeaders: {
      'Set-Cookie': [
        'myCookie1=12345; expires=...; Max-Age=...',
        'myCookie2=56789; expires=...; Max-Age=...'
       ]
    },
    statusCode: 200
  });
}
```

## シークレット

サーバーレス関数リクエストを認証する必要がある場合は、シークレットを使用して、APIキーや非公開アプリのアクセストークンなどの値を保存します。CLIを使用して、それらの値を保存するシークレットをHubSpotアカウントに追加することができます。その後でこれらの値にアクセスするには、環境変数（`process.env.secretName`）を使用します。シークレットの管理には、HubSpot CLIで以下のコマンドを使用します。

* [`hs secrets list`](https://developers.hubspot.jp/docs/guides/cms/tools/hubspot-cli/cli-v7#list-secrets)
* [`hs secrets add`](https://developers.hubspot.jp/docs/guides/cms/tools/hubspot-cli/cli-v7#add-a-secret)
* [`hs secrets delete`](https://developers.hubspot.jp/docs/guides/cms/tools/hubspot-cli/cli-v7#remove-a-secret)

CLIを使用して追加されたシークレットは、そのシークレット名を含む`secrets`配列を追加することで、関数で使用できるようになります。これにより、関数コードを[バージョン管理](/cms/start-building/introduction/developer-environment/github-integration)に保存し、シークレットを公開せずに使用できるようになります。ただし、コンソールログを使用して、またはレスポンスとして、シークレットの値を返しては<u>いけません</u>。そうした場合、ログや、サーバーレス関数を呼び出すフロントエンドページでシークレットが公開されてしまいます。

<Warning>
  ### 注：

  キャッシュ保存のため、更新されたシークレット値が表示されるまでに1分ほどかかる場合があります。シークレットを更新したばかりで、まだ古い値が表示されている場合は、1分ほどしてからもう一度ご確認ください。
</Warning>

## フォーム要素からサーバーレス関数を使用する

サーバーレス関数の送信時には、JavaScriptを使ってフォーム送信を処理し、リクエストに`"contentType" : "application/json"`ヘッダーを使用します。`<form>`要素の`action`属性は使用しないでください。

## CORS

[**CORS（オリジン間リソース共有）**](https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/CORS)はブラウザーのセキュリティー機能です。ブラウザーではデフォルトで、JavaScriptによって開始されたクロスオリジンリクエストが制限されます。これにより、異なるドメイン間で有害コードが実行され、貴社のサイトに影響を与えることを防止します。これは同一オリジンポリシーと呼ばれます。他のサーバーとのデータの送受信が必要な場合には、ブラウザーからの情報の読み取りをどのオリジン（発信元）に許可するかを示すHTTPヘッダーが外部サーバーから提供されることがあります。

HubSpot内にホスティングされたページでのサーバーレス関数の呼び出しにおいては、CORSの問題は発生しません。発生する場合、正しいプロトコルを使用していることを確認してください。

<Info>
  **次のCORSエラーが発生している場合**「発信元＜リクエスト元ページ＞から＜関数URL＞へのフェッチアクセスが、CORSポリシーによってブロックされました：プリフライトリクエストへのレスポンスが、アクセス制御検査に合格しません：要求されたリソースにはAccess-Control-Allow-Originヘッダーがありません。複雑なレスポンスを使用する場合は、リクエストのモードをno-corsに設定して、CORSが無効化されたリソースを取得してください」

  **リクエストの送信元が呼び出し元サイトと異なるのはどのようなときですか？**

  * ドメイン名が異なる場合が該当します。
  * 使用しているプロトコル（http、https）が異なる場合も該当します。

  使用しているプロトコルが異なる場合は、プロトコルが一致するように変更するだけで解決します。

  現時点では、HubSpotの`Access-Control-Allow-Origin`ヘッダーを変更することはできません。

  [CORSエラーのトラブルシューティングに関する詳細はMDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/CORS/Errors)を参照してください。
</Info>

### GETリクエスト

クライアントによっては、GETリクエストを[CORSリクエスト](https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/CORS)にすることが可能な場合があります。[GET](https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Methods/GET)リクエストでは書き込みを行わないで、データを返すだけにしてください。

## 事前に読み込まれるパッケージ

現在、HubSpotのサーバーレス関数には、以下の事前読み込みパッケージがあります。

* [@hubspot/api-client](https://www.npmjs.com/package/@hubspot/api-client)：1.0.0-beta以降
* [axios](https://www.npmjs.com/package/axios)：0.19.2以降
* [request](https://www.npmjs.com/package/request)：2.88.0以降
* [requests](https://www.npmjs.com/package/requests)：0.2.2以降

サポートされる最新バージョンの事前読み込み済みパッケージ、または新たに追加されたパッケージを使用するには、以下の操作を行います。

1. 関数ファイルを複製またはコピーします。
2. `serverless.json`ファイル内の関数のAPIエンドポイントを変更して、新しい関数ファイルを指すようにします。旧バージョンは問題なく削除できます。

事前に読み込まれる一連のパッケージには含まれないパッケージをインクルードするには、[webpack](https://webpack.js.org/)を使用してノードモジュールを結合し、バンドルされたファイルを関数ファイルとして使用します。

## 上限

サーバーレス関数は、高速の特定用途を対象として設計されています。迅速な呼び出しとレスポンスを可能にするために、HubSpotのサーバーレス関数には、次のような制限があります。

* 1アカウントあたり50件のシークレット。
* 128MBのメモリー。
* HubSpotアカウントあたり100件以下のエンドポイント。
* 関数の呼び出しには`contentType` `application/json`を使用する必要があります。
* サーバーレス関数ログの保存期間は90日。
* AWS Lambda呼び出しでのペイロードは6MB。

**実行制限**

* 各関数の実行時間は最大10秒に制限されます。
* 各アカウントでは、1分あたりの実行時間が合計600秒に制限されます。

つまり、次のいずれかのような状況での利用が可能です。

* 10秒で完了する関数を60回実行する。
* 100ミリ秒で完了する関数を6,000回実行する。

これらの制限を超える関数は、エラーになります。実行数と時間の制限に関しては、`429`レスポンスが返されます。各関数の実行時間は、[サーバーレス関数ログ](/developer-tooling/local-development/hubspot-cli/reference#get-logs)に記録されます。

上記の制限を回避できるよう、実行中に自動で制限データが[関数コンテキスト](https://developers.hubspot.jp/docs/cms/reference/serverless-functions/serverless-functions-in-projects#function-file)に提供されます。その情報に基づいて、アプリケーションを制限内にとどめるような調整を行うことができます。例えばアプリケーションからAPIエンドポイントへのポーリングが必要な場合、ポーリング頻度を調整するための変数をデータと共に返すことができます。これにより、トラフィックの増大時にも制限に到達しないようにポーリング速度を抑え、トラフィックの減少後に元に戻すことが可能になります。
