はじめに
New Relicの Workflow Automation は、ノーコード/ローコードでインシデント対応やインフラ管理の自動化を実現できる強力な機能です。
カスタムワークフローを構築する上で最も重要になるのが、「トリガー時のインプットをどう受け取るか」、そして「あるアクションの出力をどうやって次のアクションに渡すか」というデータの受け渡しです。
本記事では、Workflow Automationにおける変数の基本的な受け渡し方法と、変数管理をより柔軟にする制御コンポーネント「Assign」の活用方法について分かりやすく解説します。
Workflow Automation の利用には Advanced CCU の契約が必要です。
最新のアップデートの詳細はこちら
New Relic アップデート一覧
無料のアカウントで試してみよう!
New Relic フリープランで始めるオブザーバビリティ!
1. ワークフロー実行時のインプットを受け取る (workflowInputs)
ワークフローが開始される際(手動実行、API経由、あるいはアラート検知時)に外部から渡されるパラメータは、workflowInputs として定義・参照します。
インプットの定義(YAML例)
ワークフロー定義の冒頭で、受け取りたい変数の名前とデータ型(String, Int, Boolean, Listなど)を指定します。
workflowInputs:
awsRegion:
type: String
defaultValue: ap-northeast-1
validations: []
required: false
slackChannel:
type: String
validations: []
required: false
ワークフロー内での参照方法
定義したインプットをアクション内で利用する場合は、${{ .workflowInputs.変数名 }}(または短縮形の ${{ .inputs.変数名 }})という構文を使用します。
- name: notifySlack
type: action
action: slack.chat.postMessage
version: 1
inputs:
token: ${{:secrets:slack:xxxx-bot-token}}
channel: ${{.workflowInputs.slackChannel}}
text: 'ワークフローが開始されました。リージョン: ${{ .workflowInputs.awsRegion }}'
2. アクションのアウトプットを次のステップへ渡す (outputs)
Workflow Automationの醍醐味は、1つのステップで得られた結果を、次のステップの入力値として数珠繋ぎにできる点です。
前のステップの出力を参照する構文
Workflow Automation の便利なところは、あるステップで得た結果を次のステップの入力として渡せる点です。処理を数珠繋ぎにすることで、複雑なオートメーションが実現できます。
参照の構文
${{ .steps.<ステップ名>.outputs.<フィールド名> }}
内部では jq 式として評価されるため、ネストしたオブジェクトから特定の値を取り出すことも可能です。
具体的な連携例
例えば、最初のステップ(getAlertDetails)でアラートのメタデータを取得し、その中にある「エンティティID(entityGuid)」を後続のSlack通知ステップで利用する場合、以下のように記述します。
- name: getAlertDetails
type: action
action: newrelic.nerdgraph.execute
version: 1
inputs:
graphql: |-
{
actor {
account(id: ${{ .workflowInputs.account_id }}) {
nrql(query: "SELECT entity.guids FROM NrAiIssue WHERE issueId = '${{.workflowInputs.issueId}}' LIMIT 1") {
results
}
}
}
}
apiKey: ${{:secrets:newrelic:xxxx-api-key}}
region: US
NerdGraphの複雑なレスポンスからデータを抜く具体例
最初のステップ(getAlertDetails)で New Relic の NerdGraph API(NRQLクエリ等)を叩き、以下のようなJSONレスポンス (${{ .steps.getAlertDetails.outputs }}) が返ってきたとします。
{
"data": {
"actor": {
"account": {
"nrql": {
"results": [
{
"entity.guids": [
"NjkzMjM0MnxBUE18QVBQTElDQVRJT058OTgwODkwNTA5"
],
"timestamp": 1780319008334
}
]
}
}
}
},
"success": true
}
以下の設定でアウトプット内容をログに出力すると内容が確認可能です。
この中から、一番最初(インデックス 0 番目)の entity.guids の最初の値を取り出してSlackに通知したい場合、jq式を使用して以下のようにパスを指定します。jq式は JSON 処理のクエリ言語で、Workflow Automation 内部で使用されています
- name: sendSlackNotification
type: action
action: slack.chat.postMessage
version: 1
inputs:
token: ${{:secrets:slack:xxxx-bot-token}}
channel: ${{.workflowInputs.slackChannel}}
text: '対象のEntity GUIDは ${{ .steps.getAlertDetails.outputs.data.actor.account.nrql.results[]."entity.guids"[] }} です。'
3. 変数を整理・再利用する「Assign」コンポーネント
ワークフローが複雑になってくると、こんな悩みが出てきます。
- 参照式
${{ .steps.xxx.outputs.yyy }}や jq 式を使って何度も同じ内容を書くのが面倒... - 複数のステップの出力を組み合わせて、1つのメッセージ文字列を作りたい
- 条件分岐の前にデフォルト値をセットしておきたい
先ほどの具体例のように都度 ${{ .steps.getAlertDetails.outputs.data.actor.account.nrql.results[]."entity.guids"[] }} のような設定を直接記載するのはメンテナンスが困難になります。
これを解決するのが制御コンポーネントの Assign(アサイン) です。
Assign とは?
ワークフローの途中で新しい変数を定義・代入できるコンポーネントです。文字列・数値・真偽値はもちろん、マップ(オブジェクト)やリスト(配列)も扱えます。
基本構造
- name: <ステップ名>
type: assign
inputs:
<新しい変数名>: <固定値 or 動的式>
以下は、実行時のインプットや前ステップの出力を assign を使って整形・格納する例です。
- name: variableInitialization
type: assign
inputs:
# 1. 文字列の結合
messageGreeting: Hello, ${{ .workflowInputs.userName }}!
# 2. 前のステップの出力を変数に格納して扱いやすくする
httpStatus: ${{ .steps.runApiAction.outputs.statusCode }}
# 3. マップ型(オブジェクト)の定義
systemMeta:
env: production
region: ${{ .workflowInputs.awsRegion }}
# 4. リスト型(配列)の定義
targetInstances:
- i-0123456789abcdef0
- ${{ .steps.getEc2Info.outputs.instanceId }}
Assign ステップで変数化しておけば、以降のステップからは次のような構文でシンプルに参照できます。
# 文字列変数の参照
${{ .steps.variableInitialization.outputs.messageGreeting }}
# マップのフィールドを参照
${{ .steps.variableInitialization.outputs.systemMeta.env }}
まとめ
| 用途 | 構文 |
|---|---|
| 外部からのインプットを受け取る | ${{ .workflowInputs.変数名 }} |
| 前のステップの出力を参照する | ${{ .steps.ステップ名.outputs.フィールド名 }} |
| 変数を定義・整形・再利用する |
type: assign ステップを使う |
この3つを押さえておけば、Workflow Automation でのデータの流れに迷うことはほぼなくなります。
次のステップとして、条件分岐(Switch)やループ(Loop)を組み合わせると、より高度なRunbookの自動化が実現できます。ぜひ挑戦してみてください!
New Relicでは、新しい機能やその活用方法について、QiitaやXで発信しています!
無料でアカウント作成も可能なのでぜひお試しください!
New Relic株式会社のX(旧Twitter) や Qiita Organizationでは、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
無料のアカウントで試してみよう!
New Relic フリープランで始めるオブザーバビリティ!




