Workflowsで Memory usage limit exeeded

2021-07-13WorkflowsGoogleCloudPlatform


はてなブログのAPIなど公開のAPIをたたいてそのレスポンスをそのままBigQueryに突っ込むみたいなやつ

プライベートなのと規模感が小さいのでちょっと冒険的な感じでやってみようと次のような構成で試みた

  • Workflowsではてなブックマークの公開APIをたたく
  • WorkflowsのログにAPIのレスポンスをそのまま流す
  • Logging→集約シンクでBigQueryにレコードを追加する

Functionsを新たに作らなくても良いしとりあえずの生データも保存できるしわりと省力で実現できるかと考えた

ある程度動作確認して問題なかったので自分のブログの全URLで実行したら次のようなエラーが出てしまった

Execution failed or cancelled.
in step "call_workflow_api", routine "call_workflow", line: 88
in step "collect_hatena_bookmark_workflow", routine "main", line: 35
{
  "message": "Execution failed or cancelled.",
  "operation": {
    "argument": "{\"target_url\":\"https://swfz.hatenablog.com/entry/2018/12/22/080733\"}",
    "endTime": "2021-07-10T12:01:03.749667278Z",
    "error": {
      "payload": "{\"message\":\"ResourceLimitError: Memory usage limit exceeded\",\"tags\":[\"ResourceLimitError\"]}",
      "stackTrace": {}
    },
    "name": "projects/1111111111111/locations/us-central1/workflows/collect_hatena_bookmark_metrics/executions/c4a686eb-4d92-4e95-94f6-4257438131e0",
    "startTime": "2021-07-10T12:01:02.693637032Z",
    "state": "FAILED",
    "workflowRevisionId": "000001-331"
  },
  "tags": [
    "OperationError"
  ]
}

バズって300前後のブックマークが付いたURLのレスポンスで発生した

割り当てと上限  |  ワークフロー  |  Google Cloud

変数のメモリ割り当てにも上限があり64KBまでらしい

なのでAPIのレスポンスが64KB以上ある場合はエラーになってしまう…

Functionsは経由するがFunctionsからLoggingへ直接流すようにするか?と思ったが

割り当てと上限  |  Cloud Logging  |  Google Cloud

同じようにLoggingにも割り当て上限があるのでこの辺も考慮できていないといけない

この辺まで調べて面倒になってきてしまいこの手法は諦めた

メモリリミットに達してしまったため回避方法はなさそう…APIのレスポンスをそのままWorkflows上でよしなにやるパターンは厳しいという結論になりました

Workflowsはあくまで各処理のオーケストレーションなのでWorkflows内にあまり処理を持ち込むべきではないっていう考え方なのかなと推測

結局こういうパターンはFunctionsでGCSにデータ置く+BigQueryへloadってパターンがベターなのかな