

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Functions のトラブルシューティングとモニタリング
<a name="monetization-functions-troubleshooting"></a>

このページは、一般的な関数エラーを診断し、本番環境で関数のパフォーマンスをモニタリングするのに役立ちます。トラブルシューティングセクションは症状別に整理されています。観察した内容から始めて、原因と修正に従ってください。

## モニタリング
<a name="monetization-functions-troubleshooting-monitoring"></a>

### CloudWatch メトリクス
<a name="monetization-functions-troubleshooting-cw-metrics"></a>

MediaTailor は、関数実行のメトリクスを Amazon CloudWatch に発行します。オプトインは必要ありません。

**フックレベルのメトリクス** — ライフサイクルフック実行ごとに 1 つのデータポイント:


| メトリクス | 説明 | ディメンション | 
| --- | --- | --- | 
| PreSessionInitHook.Invocations | フック実行の数 | ConfigurationName | 
| PreSessionInitHook.Errors | フックエラーの数 | ConfigurationName | 
| PreSessionInitHook.Latency | フック実行時間 (ms) | ConfigurationName | 
| PreAdsRequestHook.Invocations | フック実行の数 | ConfigurationName | 
| PreAdsRequestHook.Errors | フックエラーの数 | ConfigurationName | 
| PreAdsRequestHook.Latency | フック実行時間 (ms) | ConfigurationName | 

**関数レベルのメトリクス** — 関数実行ごとに 1 つのデータポイント:


| メトリクス | 説明 | ディメンション | 
| --- | --- | --- | 
| Function.Invocations | 関数実行の数 | ConfigurationName, FunctionId, FunctionType, HookType | 
| Function.Errors | 関数エラーの数 | ConfigurationName, FunctionId, FunctionType, HookType | 
| Function.Latency | 関数の実行時間 (ミリ秒) | ConfigurationName, FunctionId, FunctionType, HookType | 

アラームの設定とこれらのメトリクスの操作の詳細については、「」を参照してください[Amazon CloudWatch メトリクス AWS Elemental MediaTailor によるモニタリング](monitoring-cloudwatch-metrics.md)。

### ログイベント
<a name="monetization-functions-troubleshooting-log-events"></a>

MediaTailor は、関数実行のログイベントを発行します。エラーイベントはデフォルトで出力されます。完了したイベントと概要イベントはオプトインされます。


| イベントタイプ | デフォルト/オプトイン | ロググループ | 説明 | 
| --- | --- | --- | --- | 
| PRE\_SESSION\_INIT\_HOOK\_SUMMARY | オプトイン | マニフェストログ | フック実行の概要 (成功/エラー) | 
| PRE\_SESSION\_INIT\_HOOK\_ERROR | デフォルト | マニフェストログ | errorType と cause によるフック障害 | 
| PRE\_SESSION\_INIT\_FUNCTION\_COMPLETED | オプトイン | マニフェストログ | 入力/出力で完了した個々の関数 | 
| PRE\_SESSION\_INIT\_FUNCTION\_ERROR | デフォルト | マニフェストログ | 個々の関数の失敗 | 
| PRE\_ADS\_REQUEST\_HOOK\_SUMMARY | オプトイン | ADS インタラクションログ | フック実行の概要 (成功/エラー) | 
| PRE\_ADS\_REQUEST\_HOOK\_ERROR | デフォルト | ADS インタラクションログ | errorType と cause によるフック障害 | 
| PRE\_ADS\_REQUEST\_FUNCTION\_COMPLETED | オプトイン | ADS インタラクションログ | 入力/出力で完了した個々の関数 | 
| PRE\_ADS\_REQUEST\_FUNCTION\_ERROR | デフォルト | ADS インタラクションログ | 個々の関数の失敗 | 

オプトインログイベントを有効にするには、「」を参照してください[Amazon CloudWatch メトリクス AWS Elemental MediaTailor によるモニタリング](monitoring-cloudwatch-metrics.md)。

`eventId` フィールドを使用して、同じ実行のフックレベルイベントと関数レベルのイベントを関連付けます。

次の Amazon CloudWatch Logs Insights クエリは、関数エラーイベントを でフィルタリング`eventId`して、単一の実行をトレースします。

```
fields @timestamp, eventType, functionId, errorType, cause
| filter eventId = "5dc6f040-0f72-4e8c-a64e-25eeef62708c"
| sort @timestamp asc
```

## トラブルシューティング
<a name="monetization-functions-troubleshooting-guide"></a>

関数が失敗すると、MediaTailor はエラーイベントに `errorType`フィールドを記録します。このフィールドを使用して、障害のクラスを特定します。


| エラータイプ | 説明 | 
| --- | --- | 
| SYNTAX\_ERROR | 式がコンパイルに失敗したか、ランタイムタイプエラーが発生しました | 
| RESOURCE\_LIMIT\_ERROR | 式が CPU 時間、メモリ、またはスタック深度の制限を超えました | 
| RESTRICTION\_ERROR | ブロックされた関数を使用した式、または入力ペイロードサイズの制限を超えた式 | 
| TIMEOUT\_ERROR | 関数の実行が時間制限を超えました | 
| VALIDATION\_ERROR | 出力パスは、現在のフックのスコープで書き込み不可能なフィールドをターゲットにします。 | 
| INTERNAL\_ERROR | 関数に関連しないインフラストラクチャの障害 | 

エントリは症状別に整理され、必要に応じてこれらのエラータイプを参照します。

### 式が予期せず null を返す
<a name="monetization-functions-ts-null"></a>

**症状:** 入力されるはずの出力値がプレイヤーパラメータであるか、`null`不足しています。

**考えられる原因:**


| 原因 | の識別方法 | Fix | 
| --- | --- | --- | 
| 入力フィールドはこのライフサイクルフックに存在しません。 | PRE\_SESSION\_INITIALIZATION 関数adsRequest.urlで参照した。ADS リクエストデータはセッション開始時には使用できません。 | 関数をPRE\_ADS\_REQUESTライフサイクルフックに移動するか、別の入力フィールドを使用します。「[ライフサイクルフック](monetization-functions-hooks.md)」を参照してください。 | 
| 入力フィールドがセッションデータにありません。 | を参照しましたがplayer\_params.campaign\_id、プレイヤーはセッションの初期化時にそのパラメータを渡していません。 | を使用して$exists()、 にアクセスする前に確認します{%$exists(player\_params.campaign\_id) ? player\_params.campaign\_id : 'default'%}。 | 
| オブジェクトまたは配列をプレイヤーパラメータまたは ADS リクエストに書き込みました。 | これらの名前空間は、文字列、数値、およびブール値のみを受け入れます。オブジェクトと配列は除外されます。 | 複雑なデータを に保存temp.\*し、後続のステップで文字列、数値、またはブール値を抽出します。 | 

### `RESOURCE_LIMIT_ERROR`: スタックオーバーフロー
<a name="monetization-functions-ts-stack-overflow"></a>

**症状:** 関数は `errorType: "RESOURCE_LIMIT_ERROR"`と で失敗します`cause: "Stack overflow error"`。

**原因:** 式がスタックの最大深度である 100 レベルを超えました。これは通常、深くネストされた条件式 (if/then/else) または複雑な変数割り当てで発生します。

つまり、式には MediaTailor が処理するネストのレベルが多すぎます。

**修正:** 式を簡素化します。複雑なロジックを複数の出力エントリまたはシーケンシャルエグゼキュター内の複数のステップに分割します。

### `RESOURCE_LIMIT_ERROR`: CPU タイムアウト
<a name="monetization-functions-ts-cpu-timeout"></a>

**症状:** 関数は `errorType: "RESOURCE_LIMIT_ERROR"`と で失敗します`cause: "Expression evaluation timeout: Check for infinite loop"`。

**原因:** 式が 100 ミリ秒の CPU 時間制限を超えました。これは、大規模なデータ構造に対して高価な計算を実行する式で発生する可能性があります。

**修正:** 式の複雑さを軽減します。大きな配列を処理する場合は、そのロジックを外部サービスに移動し、 `HTTP_REQUEST`関数を使用して呼び出すことを検討してください。

### `RESTRICTION_ERROR`: 関数は許可されていません
<a name="monetization-functions-ts-function-not-allowed"></a>

**症状:** 関数は `errorType: "RESTRICTION_ERROR"`と で失敗します`cause: "Function '<name>' is not allowed"`。

**原因:** 式は、38 個の関数の許可されたリストに含まれていない JSONata 関数を呼び出します。一般的な例には、`$filter`、`$reduce`、`$eval`、`$split`、および があります`$join`。

**修正:** ブロックされた関数名の `cause`フィールドを確認します。許可された代替手段に置き換えます。38 個の許可された関数の完全なリスト[JSONata 式リファレンス](monetization-functions-jsonata.md)については、「」を参照してください。

一般的に使用される許可された関数には`$string`、、`$number`、`$substring`、`$contains`、および が含まれます`$encodeUrlComponent`。

### `RESTRICTION_ERROR`: 式が長すぎます
<a name="monetization-functions-ts-expression-too-long"></a>

**症状:** 関数は での作成または更新に失敗します`cause: "Expression length <actual> exceeds limit <limit>"`。

**原因:** 単一の式が 1,000 文字を超えています。

**修正:** 式を小さな部分に分割します。複数の出力エントリを使用するか、シーケンシャルエグゼキュター内の複数のステップにロジックを分割します。変数バインディング (`:=`) を使用して、長い部分式が繰り返されないようにします。

### HTTP エラー: ステータスコードが null
<a name="monetization-functions-ts-status-null"></a>

**症状:** `HTTP_REQUEST`関数の出力では、 `response.statusCode`は です`null`。

**原因:** 外部 API に到達できなかった、接続がタイムアウトした、またはネットワークエラーが発生しました。この場合、MediaTailor は `response.statusCode`を に設定し`null`、 `response.body` を に設定し`null`、 `response.text`を に設定します`"Internal Error"`。

**修正:** レスポンスデータにアクセスする`response.statusCode`前に必ず確認してください。

```
{%response.statusCode = 200 ? response.body.value : 'default'%}
```

この式は、HTTP 呼び出しが 200 ステータスコードを返したかどうかを確認します。その場合は、レスポンス値を使用します。それ以外の場合は、デフォルト値に戻ります。

この問題が頻繁に発生する場合は、外部 API が正常かどうかを確認します。API が遅い`RequestTimeoutMilliseconds`場合は を増やし、高速に失敗する場合は減らすことを検討してください。

### HTTP エラー: レスポンス本文が null
<a name="monetization-functions-ts-body-null"></a>

**症状:** `response.statusCode`は 200 ですが、 `response.body`は です`null`。

**原因:** レスポンス本文が無効な JSON であるか、20,000 文字を超えています。MediaTailor は、最大 20,000 文字の JSON レスポンスのみを に解析します`response.body`。

**修正:** フォールバック`response.text`として を使用します。`response.text` フィールドには、20,000 文字に切り捨てられた未加工のレスポンス本文が含まれます。

```
{%response.statusCode = 200 ? ($exists(response.body.id) ? response.body.id : $substring(response.text, 0, 100)) : 'error'%}
```

必要なデータが 20,000 文字の制限を超える場合は、外部 API に小さなレスポンスを返すように依頼することを検討してください (たとえば、特定のフィールドをリクエストするなど）。

### HTTP エラー: URL 検証の失敗
<a name="monetization-functions-ts-url-validation"></a>

**症状:** 関数は実行時に失敗し、URL の形式が正しくないか、無効なスキームを使用しているか、最大長を超えています。

**考えられる原因:**


| 原因 | Fix | 
| --- | --- | 
| URL は httpまたは を使用しませんhttps。 | URL 式が http://または で始まる URL を生成していることを確認しますhttps://。 | 
| 式の評価後、URL が 2,048 文字を超えています。 | URL を短くします。POST メソッドを使用して、大きなパラメータ値をリクエスト本文に移動します。 | 
| URL の形式が正しくありません (有効な URI ではありません）。 | 式に欠落している文字や余分な文字がないか確認します。特殊文字を含む可能性のあるクエリパラメータ値$encodeUrlComponent()には、 を使用します。 | 

### `VALIDATION_ERROR`
<a name="monetization-functions-ts-validation-error"></a>

**症状:** 関数は で失敗します`errorType: "VALIDATION_ERROR"`。このエラーは、作成時 (関数を作成または更新するとき) または実行時 (セッション中に関数を実行するとき) に発生する可能性があります。

**考えられる原因:**


| 原因 | 例 | Fix | 
| --- | --- | --- | 
| 出力キーは、現在のフックで書き込みできない名前空間をターゲットにします。 | にアタッチされた関数adsRequest.urlの への書き込みPRE\_SESSION\_INITIALIZATION。 | ライフサイクルフックで許可される出力名前空間を確認します。 は PRE\_SESSION\_INITIALIZATIONのみを許可しますplayer\_params.\*。関数を正しいフックに移動するか、出力キーを変更します。「[ライフサイクルフック](monetization-functions-hooks.md)」を参照してください。 | 
| 出力キーは無効な文字を使用します。 | のような出力キー player\_params.device type (スペース付き）。文字、数字、アンダースコア、ハイフンのみを使用できます。 | 有効な文字のみを使用するように出力キーの名前を変更します。たとえば、player\_params.device\_type代わりに を使用します。 | 
| 出力キーが有効なプレフィックスで始まらない。 | player\_params.myValue または custom.myValueの代わりに のような出力キーtemp.myValue。 | 有効な出力プレフィックス player\_params.\*、temp.\*、または を使用しますadsRequest.\*。 | 
| JSONata 式には構文エラーがあります。 | 不足している終了引用符または不完全な条件: {%session.id & %}。 | 式で、引用符の欠落、括弧の不一致、または ??や などのサポートされていない演算子を確認します?:。 | 
| HTTP\_REQUEST 関数に必須フィールドがありません。 | URL フィールドが空であるか、メソッドが指定されていません。 | URL フィールドとメソッドフィールドが設定されていることを確認します。メソッドは GETまたは である必要がありますPOST。 | 
| 式によって構築された URL が無効です。 | 評価された URL は、 のようなサポートされていないスキームを使用するftp://か、2,048 文字を超えているか、形式が正しくありません。 | URL 式が有効な URL http://または https:// URL を生成することを確認します。特殊文字を含む可能性のあるクエリパラメータ値$encodeUrlComponent()に を使用します。 | 
| HTTP ヘッダーに無効な文字が含まれているか、制限された名前を使用しています。 | ヘッダー値に改行が含まれているか、ヘッダー名が hostまたは ですtransfer-encoding。 | ヘッダー値から無効な文字を削除します。制限されたヘッダー名は避けてください。ヘッダーの制限[HTTP\_REQUEST](monetization-functions-types-http-request.md)については、「」を参照してください。 | 

エラーログイベントの `cause` フィールドを確認します。どのフィールドまたは式が検証に失敗したかを識別します。

### `INTERNAL_ERROR`
<a name="monetization-functions-ts-internal-error"></a>

**症状:** 関数は で失敗します`errorType: "INTERNAL_ERROR"`。

**原因:** 関数設定に関連しないインフラストラクチャの障害が発生しました。

**修正:** リクエストを再試行します。エラーが解決しない場合は、 AWS サポートにお問い合わせください。