View a markdown version of this page

Functions のトラブルシューティングとモニタリング - AWS Elemental MediaTailor

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

Functions のトラブルシューティングとモニタリング

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

モニタリング

CloudWatch メトリクス

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 によるモニタリング

ログイベント

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 によるモニタリング

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

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

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

トラブルシューティング

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

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

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

式が予期せず null を返す

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

考えられる原因:

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

RESOURCE_LIMIT_ERROR: スタックオーバーフロー

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

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

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

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

RESOURCE_LIMIT_ERROR: CPU タイムアウト

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

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

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

RESTRICTION_ERROR: 関数は許可されていません

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

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

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

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

RESTRICTION_ERROR: 式が長すぎます

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

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

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

HTTP エラー: ステータスコードが null

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

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

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

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

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

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

HTTP エラー: レスポンス本文が null

症状: 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 検証の失敗

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

考えられる原因:

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

VALIDATION_ERROR

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

考えられる原因:

原因Fix
出力キーは、現在のフックで書き込みできない名前空間をターゲットにします。 にアタッチされた関数adsRequest.urlの への書き込みPRE_SESSION_INITIALIZATION ライフサイクルフックで許可される出力名前空間を確認します。 は PRE_SESSION_INITIALIZATIONのみを許可しますplayer_params.*。関数を正しいフックに移動するか、出力キーを変更します。「ライフサイクルフック」を参照してください。
出力キーは無効な文字を使用します。 のような出力キー 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については、「」を参照してください。

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

INTERNAL_ERROR

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

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

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