メインコンテンツへスキップ

CLI ノード

CLI ノードは、フロー内のステップとしてカスタム CLI コマンドを実行し、構造化された出力を次のノードに受け渡すことができます。スクリプトはセキュアなサンドボックス環境で実行されます。AWS または GCP の接続を必ずアタッチしてください。スクリプトはその接続の認証情報で実行され、gcloud または aws があらかじめインストールされています。

CLI ノードはフローの簡素化に役立ちます。例えば、単一の CLI ノードで aws ec2 attach-volume コマンドを実行できます。通常の AWS ノードを使う場合は、DescribeInstances(検証)、DescribeVolumes(状態チェック)、AttachVolume の 3 つのノードを連結する必要があります。

開始前に

CLI ノードを追加する前に、AWS または GCP の接続を作成してください。接続の概要については、Connections を参照してください。

CLI ノードを設定する

CLI ノードを選択すると、サイドパネルに Parameters タブが開きます。

CLI node Parameters tab showing connection, provider, script button, and output referencing

  • Cloud connection providerGoogle Cloud(GCP) または Amazon Web Services(AWS) を選択します。接続は必須です。スクリプトはその接続の認証情報で実行されます。

    (AWS のみ)AccountRegion:接続が Amazon Web Services(AWS) の場合、アカウントと必要に応じてリージョンを選択します。未設定の場合、Region は全リージョンがデフォルトになります。

    CLI node with AWS connection showing Account and Region fields

  • Add script または Edit script を選択してスクリプトエディタを開きます。スクリプトはサンドボックスで実行されます。接続を選択している場合、選択したプロバイダ向けに gcloud または aws が利用可能で、認証済みです。標準出力(stdout)には単一の JSON 値を出力してください。これにより、下流のノードがその出力の個々のフィールドを参照したり、条件で使用したり、次のステップに渡せるようになります。つまり、有効な JSON を生成することが、CLI ノードの結果をフロー全体で利用可能にする方法です。

    CLI script editor with $nodes example and completion

    フロー内の先行ノードの出力は $nodes["<Node name>"] を使って参照できます。入れ子の値に到達するためにオプションのパスを追加できます。例えば、$nodes["Manually start"][0].results[0].currentDate のように指定します。

    # Reference previous node output in your script with $nodes["<node name>"]
    echo $nodes["Manually start"][0].results[0].currentDate
    ヒント

    スクリプトエディタは $nodes の補完をサポートします。これを使ってノード名やパスを挿入してください。

  • Referencing the output:フロー内の他のノードが CLI ノードの出力をどのように参照できるかを定義します。

    • Basic referencing:出力を単一のフィールドとして参照します。単純な戻り値に使用します。

    • Advanced referencing:JSON スキーマを定義し、出力内の特定のフィールドを下流ノードが個別に参照できるようにします。これは Code node と同様に動作します。

出力スキーマを設定する

Advanced referencing を選択すると、CLI ノードの出力内の特定のフィールドを下流ノードが参照できるように、JSON スキーマを定義します。CloudFlow では、出力スキーマは、実行ログに表示される resultsmessagecontext のような実行メタデータやランタイムのラッパーではなく、ノードがコードまたは設定から返す値だけ(他のノードが実際に使用するペイロード)を記述します。平たく言えば、ノードの機能的な出力だけを単独の JSON ドキュメントとして取り出した場合に得られる JSON 値のスキーマを定義してください。その周囲のラッパーはモデル化しないでください。

出力スキーマを定義する際は次の点に留意してください。

  • トップレベルの型 を正確に一致させます:objectarraystringnumberbooleannull

  • 形状を 再帰的に 定義します。

    • object の場合は、properties(および任意で required)を定義します。
    • array の場合は、items(各要素のスキーマ)を定義します。
  • CloudFlow の実行ラッパー(例:resultsmessagecontext)をモデル化しないでください。これらはランタイムのラッパーであり、ノードの機能的な出力ではありません。

パターン例:

  • ノードが object を返す場合:
{ "type": "object", "properties": { "foo": { "type": "string" } } }
  • ノードが array を返す場合:
{ "type": "array", "items": { "type": "number" } }

実行リミット

スクリプトは次の制限があるサンドボックス環境で実行されます。

  • 最大実行時間:10 秒。これを超えると、ノードはタイムアウトエラーで失敗します。

  • レート制限:サンドボックスはレート制限を適用する場合があります。超過すると、ノードはレート制限エラーで失敗します。

次のスクリプトは、GCP 接続が構成されている場合に Google Cloud Storage のバケットを一覧表示します。コマンドは直接 JSON を出力するため、下流ノードは配列やそのフィールドを参照できます(例えば、Advanced referencing とスキーマを使用)。

gcloud storage buckets list --format=json --limit=5

AWS の接続とアカウントを選択している場合は、代わりに S3 バケットを一覧表示できます。

aws s3api list-buckets --output json

上流ノード(例えば、AWS の Describe instances ノード)の出力を参照・フィルタするには、$nodes を使用してから JSON を処理します。次のスクリプトは、Describe instances という名前の上流ノードの最初の結果を読み取り、running 状態の EC2 インスタンスだけにフィルタし、下流ノード向けに JSON 配列を出力します。ノード名は自身のものに置き換えてください。

# Filter running EC2 instances from upstream Describe instances node
echo '$nodes["Describe instances"][0].results[0]' | python3 -c "
import json, sys
data = json.load(sys.stdin)
instances = [
{\"InstanceId\": i[\"InstanceId\"], \"State\": i[\"State\"][\"Name\"]}
for r in data.get(\"Reservations\", [])
for i in r.get(\"Instances\", [])
if i.get(\"State\", {}).get(\"Name\") == \"running\"
]
print(json.dumps(instances))
"
注意

$nodes["Describe instances"] のノード名は、フロー内の上流ノードの正確な名前(スペースや大文字小文字を含む)と一致している必要があります。

関連項目