スキーマ
ワークフロー定義は YAML で記述されます。キーはcamelCase命名規則を使用します。
名前(必須)
- タイプ: 文字列
- フォーマット: 正規表現
^[A-Za-z_][A-Za-z0-9_-]*$に準拠する必要があります。 - 最大長: 100
- 説明:
name値は大文字と小文字を区別しません。たとえば、ExampleWorkflow、exampleworkflow、EXAMPLEWORKFLOWはすべて同じワークフロー定義を表すものと見なされます。
説明(オプション)
- タイプ: 文字列
- フォーマット: 正規表現
^[A-Za-z0-9 _-]*$に準拠する必要があります。 - 最大長: 200
- 説明: ワークフローの目的を説明する
description。
workflowInputs(オプション)
- タイプ: 地図の地図
- 最大サイズ: 100
- 説明: ワークフローが受け入れるワークフロー入力のマップ。
- 例:
workflowInputs: myInput1: type: String myInput2: type: Number defaultValue: 42workflowInputs.<inputName>(必須)- タイプ: 文字列 (式安全なパターンに準拠)
- 最小の長さ: 1
- 最大長: 50
- 説明: ワークフロー入力の名前。
workflowInputs.<inputName>.type(必須)- タイプ: 列挙型 (ブール、リスト、マップ、文字列、整数、フロート)
- 説明: ワークフロー入力のデータ型。
workflowInputs.<inputName>.defaultValue(オプション)- タイプ: 任意;
typeに準拠する必要があります。 - 説明: ワークフロー入力のデフォルト値。
- タイプ: 任意;
手順(必須)
- タイプ: マップの配列
- 説明: ワークフロー定義の実行時に実行される手順。少なくとも 1 つのステップが必要です。
重要
ステップは、
steps配列で定義された順序で実行されます。異なる順序が必要な場合は、
steps[*].nextプロパティをジャンプ先のステップの名前に設定することで「ジャンプ」を実行できます。steps[*].name(必須)- タイプ: 文字列 (式セーフパターンに準拠;
endは不可) - 最大長: 100
- 説明:
steps[*].nextによって参照されるステップの名前。終了ステップ、ループの継続、またはループからの脱出を示すために使用される特殊キーワードend、continue、またはbreakは使用できません。
- タイプ: 文字列 (式セーフパターンに準拠;
steps[*].type(必須)- タイプ: 文字列
- 説明: ステップのタイプ。実行時にステップが何を行うかを示します。利用可能なオプションについては、ステップ タイプを参照してください。
steps[*].next(オプション)タイプ: 文字列 (式安全なパターンに準拠)
説明:
- このステップが正常に完了したときに実行される次のステップの名前。特別なキーワード
endを使用すると、このステップが最後に実行されることを示すことができます。 nextが省略されている場合、定義のsteps配列内の次のエントリが暗黙的な次のステップとして使用されます。次のエントリがない場合、ワークフローは完了します。
- このステップが正常に完了したときに実行される次のステップの名前。特別なキーワード
ステップの種類
アクション
特定のアクションを実行するステップ。利用可能なオプションについては、アクション カタログを参照してください。
steps[*].action(必須)タイプ: 文字列
説明: 実行するアクション関数の完全修飾名。次の規則に従う必要があります。
<company domain>.<category of work>.<action name in camelCase>例:
- New Relic サービスを使用したアクション (例: NerdGraph 経由):
newrelic.dashboards.getDashboard - Slackを使ったアクション:
slack.chat.postMessage
- New Relic サービスを使用したアクション (例: NerdGraph 経由):
steps[*].version(必須)- タイプ: 文字列
- 説明: 実行するアクション関数のバージョン。
steps[*].inputs(オプション)タイプ: 値のマップ(式を含む)
説明:
- アクション関数に渡す入力。受け入れられる特定の入力は、各アクションによって定義されます。
- 入力には式を使用できます。詳細については、式文字列のセクションを参照してください。
重要
機密データ ( APIキーやシークレット、PII、PHI、または個人を特定できるデータ) を引数として渡さないでください。
steps[*].inputs.selectors(オプション)タイプ:
nameとexpressionの形式のマップのリスト。説明:
selectors入力を使用すると、指定された要素のみを返すように出力を再定義できます。- 表現が使えます。詳細については、式文字列のセクションを参照してください。
例
- この例では、http.get アクションの応答として
pageUrlとstatusDescriptionを取得しています。
name: statusdescription: A workflow for checking the status of New Relic componentssteps:- name: query1type: actionaction: http.getversion: 1inputs:url: "https://status.newrelic.com/api/v2/status.json"selectors:- name: statusCodeexpression: '.statusCode'- name: pageUrlexpression: '.responseBody | fromjson | .page.url'- name: statusDescriptionexpression: '.responseBody | fromjson | .status.description'- name: logOutput1type: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "status is '${{ .steps.query1.outputs.statusDescription }}' details at ${{ .steps.query1.outputs.pageUrl }}"- この例では、http.get アクションの応答として
ループ
ループは、 inで定義された特定のコレクションを反復処理し、反復ごとにループ変数indexとelementを作成します。これらのループ変数は、式${{ .steps.<loopStepName>.loop.element }}または ${{ .steps.<loopStepName>.loop.index }
詳細については以下を参照してください。
steps[*].for(必須)- タイプ: 定数
- 説明: ループの開始を知らせる信号
steps[*].in(必須)タイプ: 文字列 (式)
説明: 要素のコレクションとして評価する必要がある式。
steps[*].steps(オプション)説明: ループの各反復で実行される手順。上記の手順については定義を参照してください。
例:
name: myWorkflowsteps:- name: loopSteptype: loopfor:in: "${{ [range(1; 5)] }}""steps:- name: step1type: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "Loop: ${{ .steps.loopStep.loop.element }}"
スイッチ
さまざまな条件をチェックし、true と評価される最初の分岐を実行するステップ。
スイッチには、リスト内に任意の数の条件要素を含めることができます。条件を順番にチェックし、最初に true と評価される条件を処理します。どれもtrueと評価されない場合は、steps[*].nextで定義されている次のステップを実行します。
steps[*].switch(必須)- タイプ: 配列
- 説明: 評価する条件の順序付きリストを指定する、スイッチ ケースの配列。
steps[*].switch[*].condition(必須)- タイプ: 文字列 (式)
- 説明: スイッチケースの状態。true と評価された場合、ケースの次のステップが実行されます。
steps[*].switch[*].next(必須)- タイプ: 文字列 (式安全なパターンに準拠)
- 説明: ケースの条件が true と評価された場合に実行するステップの名前。特別なキーワード end を使用すると、このステップが最後に実行されることを示すことができます。
- name: hasCompletedtype: switchswitch:- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Failed" }}next: displayError- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Success" }}next: displaySuccessnext: displayUnexpected
待つ
ワークフローの実行を続行する前に一定の秒数待機させるステップ。1 つ以上の信号をリッスンすることもできます。待機中に信号が受信されない場合は、通常どおり続行されます。信号はリストで定義されます。各信号には対応する次のステップを定義する必要があります。最初に受信された信号が処理されます。信号として受信された値は、待機ステップのステップ出力に保存され、後のステップでのロジック処理に使用できます。
例:
name: waitSignalExampleworkflowInputs:steps:- name: waitSteptype: waitseconds: 300signals: [{name: 'mySignalName', next: 'firstStep'}]- name: endSteptype: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "didn't get signal"next: end- name: firstSteptype: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: ${{ .steps.waitStep.outputs.signalInputs.myString }}steps[*].seconds(必須)- タイプ: 数値
- 説明: ワークフローの実行を続行する前に待機する秒数。
steps[*].signals- タイプ: 配列
- 説明: 受信されるとプログラムフローを転換する信号。
steps[*].signals[*].name- タイプ: 文字列
- 説明: リッスンする信号の名前。
steps[*].signals[*].next- タイプ: 文字列
- 説明: 指定されたシグナルを受信した場合に実行するステップ。
共有型
式文字列
いくつかのプロパティは、ワークフロー実行中に評価される埋め込み式を含む文字列値を受け入れ、ワークフロー定義内で動的な値を使用できるようにします。式文字列には 1 つまたは複数の式を含めることができ、各式は二重中括弧で囲まれます。中括弧内の内容は jq を使用して評価されます。
jq は、さまざまな方法で値にアクセスし、値を操作する機能を提供します。たとえば、ワークフロー入力文字列の長さは次のようにして実現できます。 ${{ .workflowInputs.myString | length }}
JQ 式を構築およびテストするには、このツールを使用できます。
式のプロパティ
式を使用して、多数のプロパティにアクセスできます。これらのプロパティは「scope」オブジェクト内に存在するため、scope オブジェクトのこれらのプロパティにアクセスするには、式をピリオド (.) で始める必要があります。
利用可能なプロパティは次のとおりです。
workflowInputs- 開始時にワークフローに渡される入力を含むオブジェクト。- 例:
${{ .workflowInputs.myInput }}
- 例:
steps- ワークフローの各ステップのプロパティを含むオブジェクトsteps.<stepName>- 特定のステップのプロパティを含むオブジェクトsteps.<stepName>.outputs- ステップ/アクションに固有の結果プロパティを含むオブジェクト。- 例:
${{ .steps.myStep.outputs.myResult }}
- 例:
表現評価結果
単一の jq 式は任意の JSON 型に評価できますが、式文字列全体の最終結果は式を囲む文字列の内容 (存在する場合) に依存することに注意することが重要です。
式文字列全体が単一の式で構成されている場合は、結果の JSON 型を維持しながら、jq 式の結果に評価されます。たとえば、ワークフローに入力として配列が渡された場合、文字列${{ .workflowInputs.myArray }}は配列として評価されます。これは、ワークフロー内で複雑なデータを渡す場合に役立ちます。
式文字列に単一の式以外のコンテンツが含まれている場合は、文字列の結果に評価されます。たとえば、式の前後にコンテンツがある場合や、文字列内に複数の式がある場合に、この現象が発生します。文字列内の各式は評価され、文字列表現に変換されます。
例:
次の例では、myArray の値が [1, 2, 3] であると仮定します。
式文字列 | 結果データ | 結果タイプ |
|---|---|---|
| [1, 2, 3] | 数字の配列 |
| 3 | ナンバー |
| true | ブール値 |
| 「入力が空ではありません: true」 | ストリング |
| 「長さは3です」 | ストリング |
式セーフパターン
式で使用できるプロパティは、次の正規表現に準拠する必要があります。 ^[A-Za-z_][A-Za-z0-9_]*$
秘密の参照
シークレット値は、シークレット サービスで検索するシークレットの名前を指定する参照文字列を介してアクションで使用できます。ワークフロー定義でシークレットを参照するには、次の構文を使用します。
${{ :secrets:<SECRET_NAME> }}秘密はnamespace${{ :secrets:<NAMESPACE>:<SECRET_NAME> }}秘密のためにnamespace
式文字列には、シークレット参照と JQ 式の組み合わせ、または複数のシークレット参照を含めることができます。
例:
steps: - name: bearer_auth type: action action: http.post inputs: headers: Authorization: Bearer ${{ :secrets:<SECRET_NAME> }}例
- こんにちは世界
name: helloWorlddescription: 'A hello world workflow'
workflowInputs: name: type: String defaultValue: World required: false validations: - type: maxLength errorMessage: "name must be at most 100 characters" length: 100 slackTokenSecret: type: String defaultValue: "${{ :secrets:SLACK_TOKEN }}" slackChannel: type: String defaultValue: my-channel validations: - type: regex errorMessage: "A slack channel name must be lowercase and can only contain letters, numbers, and hyphens" pattern: "^[a-z0-9\\-]+$" required: true
steps: - name: init1 type: assign inputs: greeting: Hello ${{ .workflowInputs.name }}
- name: logName type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: ${{ .steps.init1.outputs.greeting }}
- name: waiting1 type: wait seconds: 1
- name: queryForLog type: action action: newrelic.nrdb.query version: 1 inputs: query: >- FROM Log SELECT * WHERE message LIKE '${{ .steps.init1.outputs.greeting }}'
- name: checkResult type: switch switch: - condition: ${{ .steps.queryForLog.outputs.results | length > 0 }} next: FoundMessage
- name: waitingMessage type: action action: slack.chat.postMessage version: 1 inputs: channel: ${{ .workflowInputs.slackChannel }} text: Waiting for log message... token: ${{ .workflowInputs.slackTokenSecret }} next: waiting1
- name: FoundMessage type: action action: slack.chat.postMessage version: 1 inputs: channel: ${{ .workflowInputs.slackChannel }} text: Found message! ${{ .steps.queryForLog.outputs.results[0].message }} token: ${{ .workflowInputs.slackTokenSecret }}