2017-07-03 15 views
4

大きなループにはステップ関数を使用していますが、問題はありませんが、ループ回数が8000回を超えた日です。「最大実行履歴サイズ」は25000です。AWSステップ関数履歴イベント制限

履歴イベントを持たない解決策がありますか? 25K履歴イベントを回避するために、AWSのバッチが私のコード書き換えの多くを聞いてきますので、私は簡単に私のステップ関数(3ラムダ)を移行することができそうでない場合

..

どうもありがとう

答えて

2

一つのアプローチループ内にカウンタまたはブール値をとり、ループを終了することを決定する選択状態を追加することです。

ループの外側に別の実行(別のIDを持つ)を開始するラムダ関数を置くことができます。その後、現在の実行は正常に完了し、別の実行は引き続き作業を行います。

以下の例の "LoopProcessor"は、変数 "$ .breakOutOfLoop"を返してループから抜け出す必要があります。ループのどこかで決定して渡す必要があります。

ユースケースによっては、渡したデータを再構成する必要があります。たとえば、大量のデータを処理する場合は、S3オブジェクトの使用を検討し、ステートマシンの実行によってARNを入出力として渡すことができます。単純なループを実行しようとしている場合は、1つの簡単な方法は、実行として入力として渡される開始オフセット(グローバルカウンタと考える)を追加することです。各LoopProcessor Taskは、カウンタをインクリメントしますオフセットを初期値として使用します)。これはページ分割ソリューションに似ています。ここで

は25kの歴史イベントの制限を回避するために、ASL構造の基本的な例です。

{ 
    "Comment": "An example looping while avoiding the 25k event history limit.", 
    "StartAt": "FirstState", 
    "States": { 

    "FirstState": { 
     "Type": "Task", 
     "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME", 
     "Next": "ChoiceState" 
    }, 

    "ChoiceState": { 
     "Type" : "Choice", 
     "Choices": [ 
     { 
      "Variable": "$.breakOutOfLoop", 
      "BooleanEquals": true, 
      "Next": "StartNewExecution" 
     } 
     ], 
     "Default": "LoopProcessor" 
    }, 

    "LoopProcessor": { 
     "Type" : "Task", 
     "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:ProcessWork", 
     "Next": "ChoiceState" 
    }, 

    "StartNewExecution": { 
     "Type" : "Task", 
     "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:StartNewLooperExecution", 
     "Next": "FinalState" 
    }, 

    "FinalState": { 
     "Type": "Task", 
     "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME", 
     "End": true 
    } 
    } 
} 

Loop Processor Example

は、この情報がお役に立てば幸い!

+0

これは無限ループになる可能性があります... – Neil