- OpenTofu言語
- メタ引数
- lifecycleメタ引数
lifecycle
メタ引数
リソースの動作ページでは、リソースの一般的なライフサイクルについて説明しています。その動作の詳細の一部は、リソースブロック本文内の特別なネストされたlifecycle
ブロックを使用してカスタマイズできます。
resource "azurerm_resource_group" "example" {
# ...
lifecycle {
create_before_destroy = true
}
}
構文と引数
lifecycle
は、リソースブロック内に表示できるネストされたブロックです。lifecycle
ブロックとその内容はメタ引数であり、タイプに関係なくすべてのresource
ブロックで使用できます。
lifecycle
ブロックで使用できる引数は、create_before_destroy
、prevent_destroy
、ignore_changes
、およびreplace_triggered_by
です。
-
create_before_destroy
(bool) - デフォルトでは、リモートAPIの制限によりインプレースで更新できないリソース引数をOpenTofuが変更する必要がある場合、OpenTofuは既存のオブジェクトを破棄してから、新しい構成済みの引数を使用して新しい置換オブジェクトを作成します。create_before_destroy
メタ引数は、この動作を変更して、新しい置換オブジェクトが*最初に*作成され、置換が作成された後に以前のオブジェクトが破棄されるようにします。これはオプトインの動作です。多くのリモートオブジェクトタイプには、新しいオブジェクトと古いオブジェクトの両方が同時に存在するために満たす必要がある一意の名前要件やその他の制約があるためです。たとえば、一部のリソースタイプは、衝突を回避するために各オブジェクト名にランダムなサフィックスを追加する特別なオプションを提供しています。OpenTofu CLIはこれらの機能を自動的にアクティブ化できないため、
create_before_destroy
をそれと共に使用するには、各リソースタイプの制約を理解する必要があります。OpenTofuは
create_before_destroy
メタ属性の動作をすべてのリソース依存関係に伝播して適用することに注意してください。たとえば、リソースAでcreate_before_destroy
が有効になっていて、リソースBでは有効になっていないが、リソースAがリソースBに依存している場合、OpenTofuはデフォルトで暗黙的にリソースBに対してcreate_before_destroy
を有効にし、それをステートファイルに保存します。グラフに依存関係のサイクルが含まれることを意味するため、リソースBでcreate_before_destroy
をfalse
に上書きすることはできません。create_before_destroy
がtrue
に設定されている場合、このリソースの破棄プロビジョナは実行されません。このGitHubの問題には、詳細情報が含まれています。 -
prevent_destroy
(bool) - このメタ引数は、true
に設定されている場合、引数が構成に存在する限り、リソースに関連付けられたインフラストラクチャオブジェクトを破棄するプランをOpenTofuがエラーで拒否するようにします。これは、データベースインスタンスなど、再現にコストがかかる可能性のあるオブジェクトの誤った置換に対する安全策として使用できます。ただし、特定の構成変更を適用できなくなり、そのようなオブジェクトが作成されると
tofu destroy
コマンドの使用が妨げられるため、このオプションは控えめに使用する必要があります。この保護を適用するには、構成にこの引数が存在する必要があるため、この設定では、
resource
ブロックが構成から完全に削除された場合、リモートオブジェクトが破棄されるのを防ぐことができないことに注意してください。その場合、prevent_destroy
設定はそれと共に削除されるため、OpenTofuは破棄操作が成功することを許可します。 -
ignore_changes
(属性名のリスト) - デフォルトでは、OpenTofuは実際のインフラストラクチャオブジェクトの現在の設定の違いを検出し、リモートオブジェクトを構成に一致するように更新する計画を立てます。ignore_changes
機能は、将来変更される可能性のあるデータへの参照を使用してリソースが作成されたが、作成後はそのリソースに影響を与えない場合に使用することを目的としています。まれに、リモートオブジェクトの設定がOpenTofu以外のプロセスによって変更され、OpenTofuが次回の実行時に「修正」しようとする場合があります。OpenTofuが単一オブジェクトの管理責任を別のプロセスと共有できるようにするために、ignore_changes
メタ引数は、関連付けられたリモートオブジェクトの更新を計画する際にOpenTofuが無視する必要があるリソース属性を指定します。与えられた属性名に対応する引数は、作成操作の計画時には考慮されますが、更新操作の計画時には無視されます。これらの引数は、リソース内の属性の相対アドレスです。マップとリストの要素は、それぞれ`tags["Name"]`や`list[0]`のようなインデックス表記を使用して参照できます。
コードブロック resource "aws_instance" "example" {
# ...
lifecycle {
ignore_changes = [
# Ignore changes to tags, e.g. because a management agent
# updates these based on some ruleset managed elsewhere.
tags,
]
}
}リストの代わりに、特別なキーワード`all`を使用して、OpenTofuにすべての属性を無視するように指示できます。これは、OpenTofuがリモートオブジェクトの作成と破棄は行うものの、更新を提案することは決してないことを意味します。
無視できる属性は、リソース型によって定義されている属性のみです。`ignore_changes`はそれ自身、または他のメタ引数には適用できません。
-
replace_triggered_by
(リソースまたは属性参照のリスト)- 参照された項目のいずれかが変更された場合にリソースを置き換えます。管理対象リソース、インスタンス、またはインスタンス属性を参照する式をリストで指定します。`count`または`for_each`を使用するリソースで使用する場合、同じcountまたはコレクションで構成されている他のリソースの特定のインスタンスを参照するために、式内で`count.index`または`each.key`を使用できます。参照は、以下の条件で置き換えをトリガーします。
- 参照が複数のインスタンスを持つリソースの場合、インスタンスの更新または置き換えを計画すると、置き換えがトリガーされます。
- 参照が単一のリソースインスタンスの場合、そのインスタンスの更新または置き換えを計画すると、置き換えがトリガーされます。
- 参照がリソースインスタンスの単一属性の場合、属性値の変更によって置き換えがトリガーされます。
replace_triggered_by
式では、管理対象リソースのみを参照できます。これにより、置き換えを強制することなく、これらの式を変更できます。コードブロック resource "aws_appautoscaling_target" "ecs_target" {
# ...
lifecycle {
replace_triggered_by = [
# Replace `aws_appautoscaling_target` each time this instance of
# the `aws_ecs_service` is replaced.
aws_ecs_service.svc.id
]
}
}replace_triggered_by
はリソースアドレスのみを許可します。これは、決定が与えられたすべてのリソースの計画されたアクションに基づいているためです。ローカル値や入力変数などの単純な値には独自の計画されたアクションがありませんが、terraform_data
リソース型と共に使用することで、リソースのようなライフサイクルで扱うことができます。
カスタム条件チェック
lifecycle
ブロックを使用して、precondition
ブロックとpostcondition
ブロックを追加し、リソースとデータソースの動作に関する仮定と保証を指定できます。次の例では、AMIが適切に構成されているかどうかをチェックする事前条件を作成します。
resource "aws_instance" "example" {
instance_type = "t2.micro"
ami = "ami-abc123"
lifecycle {
# The AMI ID must refer to an AMI that contains an operating system
# for the `x86_64` architecture.
precondition {
condition = data.aws_ami.example.architecture == "x86_64"
error_message = "The selected AMI must be for the x86_64 architecture."
}
}
}
カスタム条件は、仮定を捉えるのに役立ち、将来の保守担当者が設定の設計と意図を理解するのに役立ちます。また、エラーに関する有用な情報をより早く、コンテキスト内で返すため、コンシューマが設定の問題をより簡単に診断するのに役立ちます。
詳細については、カスタム条件を参照してください。
リテラル値のみ
lifecycle
の設定はすべて、OpenTofuが依存関係グラフを構築およびトラバースする方法に影響します。その結果、処理は任意の式の評価には早すぎるため、リテラル値のみを使用できます。