> ## 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>
  **注：**[開発者プロジェクト](https://developers.hubspot.jp/docs/guides/crm/intro/create-a-project)の一部としてサーバーレス関数を作成する場合は、[開発者プロジェクトのサーバーレス関数のドキュメント](https://developers.hubspot.jp/docs/guides/crm/private-apps/serverless-functions)を参照してください。以下のドキュメントは、開発者プロジェクトプラットフォーム以外でサーバーレス関数を作成する場合に使用します。
</Warning>

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

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

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

## serverless.json

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

```json theme={null}
// serverless.json
{
  "runtime": "nodejs18.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"]
    }
  }
}
```

| キー            | Type   | Description                                                                                                                                                                                                                                                                 |
| ------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `runtime`     | 文字列    | ランタイム環境。次の[Node.js](https://nodejs.org/en/about/)バージョンをサポートします。<ul><li>ノード20（`nodejs20.x`）（推奨）</li><li>ノード18（`nodejs18.x`）</li></ul>2024年7月12日以降、HubSpotは[ノード16をサポートしなくなります](https://developers.hubspot.com/changelog/deprecation-of-node-v16-in-all-serverless-functions)。 |
| `version`     | 文字列    | HubSpotサーバーレス関数スキーマバージョン。（現在のバージョン1.0）                                                                                                                                                                                                                                      |
| `environment` | オブジェクト | 実行環境で、実行される関数に[環境変数](https://nodejs.org/docs/latest-v10.x/api/process.html#process_process_env)として渡される設定用変数。環境変数に基づいて、実際のAPIの代わりにテストバージョンを使用するロジックを追加する場合などに使用します。                                                                                                          |
| `secrets`     | 配列     | サーバーレス関数が認証に使用するシークレットの名前を含む配列。このファイルにはシークレット値を直接入力しないで、シークレット名の参照にとどめてください。                                                                                                                                                                                                |
| `endpoints`   | オブジェクト | エンドポイントでは、functionsフォルダーにおいて、公開されるパスおよび特定のJavaScriptファイルへのマッピングが定義されます。エンドポイントの詳細については、以下で説明しています。                                                                                                                                                                          |

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

### エンドポイント

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

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

エンドポイントにはいくつかの固有のキーがあります。

| キー       | Type            | Description                                                                                                                                                                |
| -------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `method` | 文字列または文字列からなる配列 | このエンドポイントによってサポートされる[HTTPメソッド](https://developer.mozilla.org/ja-JP/docs/Web/HTTP/Methods)（複数可）。既定では[GET](https://developer.mozilla.org/ja-JP/docs/Web/HTTP/Methods/GET)です。 |
| `file`   | 文字列             | エンドポイントの実装があるJavaScript関数ファイルへのパス。                                                                                                                                         |

サーバーレス関数は、HubSpot CMSアカウントのドメインのパスを通して公開されます。これには、既定の`.hs-sites.com`サブドメインも含まれます。

これらの関数には、次のURLでアクセスできます。

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

以下では、各URLコンポーネントについて説明します。

| Parameter            | Description                                                   |
| -------------------- | ------------------------------------------------------------- |
| `domainName`         | 自分のドメイン名。                                                     |
| `/_hcms/api/`        | サーバーレス関数用に予約されたパス。このパスには、全てのエンドポイントが含まれます。                    |
| `endpoint-name/path` | `serverless.json`ファイルで指定されているエンドポイント名またはパス。                   |
| `hubId`              | 自分のHub ID。これをリクエストに含めることにより、モジュールおよびテンプレートのプレビュー時に関数をテストできます。 |

## 関数ファイル

`serverless.json`構成ファイルに加え、`.functions`フォルダーにも、関数を定義する[Node.js](https://nodejs.org/en/) JavaScriptファイルが含まれています。[request](https://github.com/request/request#readme)ライブラリーを利用して、[HubSpot API](https://developers.hubspot.jp/docs/reference/api/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 });
};
```

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

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

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

### ヘッダー

エンドポイントにアクセスしているクライアントのヘッダーを知る必要がある場合は、`context.body`を使用して情報にアクセスする場合と同様に、`context.headers`を使用してこれらのヘッダーにアクセスできます。

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

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

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

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

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

### エンドポイントから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/local-development-cli#list-secrets)
* [`hs secrets add`](https://developers.hubspot.jp/docs/guides/cms/tools/local-development-cli#add-secret)
* [`hs secrets delete`](https://developers.hubspot.jp/docs/guides/cms/tools/local-development-cli#remove-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-JP/docs/Web/HTTP/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-JP/docs/Web/HTTP/CORS/Errors)
</Info>

### GETリクエスト

クライアントによっては、GETリクエストで[CORSリクエスト](https://developer.mozilla.org/ja-JP/docs/Web/HTTP/CORS)を行うことが可能な場合があります。[GET](https://developer.mozilla.org/ja-JP/docs/Web/HTTP/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`ファイル内の関数のエンドポイントを変更して、新しい関数ファイルを指すようにします。旧バージョンは問題なく削除できます。

事前に読み込まれる一連のパッケージには含まれないパッケージをインクルードするには、[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`のレスポンスが返されます。各関数の実行時間は、[サーバーレス関数ログ](https://developers.hubspot.jp/docs/guides/cms/tools/local-development-cli#logs)に記録されます。

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