web-dev-qa-db-ja.com

「エラー:サイクル」とは何ですか。 Terraformを意味しますか?

奇妙な理由によるTerraformドキュメントでは、「エラー:サイクル」の意味が説明されていません。私は至る所を見てきましたが、公式ドキュメントにはそれについての言及はありません。

2
Juan Jimenez

Terraformの作業の一部として、resourceブロック、dataブロック、およびその他の構成コンストラクト間の依存関係を分析して、必要な入力データが得られるようにそれらを処理する適切な順序を決定します利用可能です。

たとえば、次の工夫された単純な構成を考えてみます。

resource "null_resource" "foo" {
}

resource "null_resource" "bar" {
  triggers = {
    foo = null_resource.foo.id
  }
}

Terraformは上記を分析し、null_resource.barの構成にnull_resource.fooへの参照が含まれているため、null_resource.fooに関連する操作はnull_resource.barの前に実行する必要があります。これを、矢印が「後に発生する必要がある」または「依存する」を表すグラフとして視覚化できます。

a box for null_resource.foo and a box for null_resource.bar, with an arrow pointing from the latter to the former

  • null_resource.barの演算は、null_resource.foo演算の後に発生する必要があります。

この構成を次のように変更するとどうなるかを考えてみましょう。

resource "null_resource" "foo" {
  triggers = {
    bar = null_resource.bar.id
  }
}

resource "null_resource" "bar" {
  triggers = {
    foo = null_resource.foo.id
  }
}

現在、null_resource.foonull_resource.barも参照しています。この構成により、次の2つの「後に発生する必要がある」関係が示されます。

a box for null_resource.foo and a box for null_resource.bar, with an arrow pointing from the latter to the former, with arrows pointing in both directions between them

  • null_resource.barの演算は、null_resource.foo演算の後に発生する必要があります。
  • null_resource.fooの演算は、null_resource.bar演算の後に発生する必要があります。

上記の2つのステートメントは互いに矛盾します。null_resource.barは、の前とnull_resource.fooの後のの両方で処理できません。Terraformは、表示されたエラーメッセージを使用して依存サイクルを報告することにより、この状況に応答します。

Cycle: null_resource.foo, null_resource.bar

Terraformがこのエラーを返す場合の解決策は、構成から「後に発生する必要がある」矢印(依存関係)の少なくとも1つを削除して、矛盾がなくなるようにすることです。あなたの設定を見なければ、私はあなたのケースでそれを達成するかもしれない特定の変更を提案することはできませんが、あなたの設定のどこかに、このような相互依存する2つのリソース、またはおそらくそれ自身を参照するリソースがある可能性があります。


目撃された場合、構成の複雑さによっては、Terraformに、上記の回答に含めたものと同様のグラフを作成するよう依頼するのに役立つかもしれませんが、サイクルを強調しています。これを行うには、次のように terraform graphコマンド を使用できます。

terraform graph -draw-cycles

このコマンドの出力は、 Graphviz で受け入れられる形式のグラフの説明です。ローカルコンピューターにGraphvizがインストールされていない場合は、代わりに出力を Graphviz Online にコピーアンドペーストして、グラフイメージを作成できます。 -draw-cyclesコマンドを使用すると、Terraformは報告されているサイクルに関連する矢印を赤でマークします。赤と黒を視覚的に区別できない場合は、最初に生成されたGraphvizコードを編集して、redを区別できる他の色に置き換えます。

グラフとエッジが非常に多いため、構成のグラフの視覚化は重要な構成では使用できなくなる傾向があります。そのため、構成に多くのオブジェクトがある場合は、構成自体を通じて依存関係を追跡する方がよい場合があります。

7
Martin Atkins