- OpenTofu 言語
- リソース
- プロビジョナー
- ファイルプロビジョナー
ファイルプロビジョナー
file プロビジョナーは、OpenTofu を実行しているマシンから、新しく作成されたリソースにファイルまたはディレクトリをコピーします。 file プロビジョナーは、ssh と winrm の両方のタイプの接続をサポートしています。
プロビジョナーは最後の手段として使用してください。ほとんどの状況では、より良い代替手段があります。詳細については、プロビジョナーの宣言を参照してください。
使用例
resource "aws_instance" "web" {
# ...
# Copies the myapp.conf file to /etc/myapp.conf
provisioner "file" {
source = "conf/myapp.conf"
destination = "/etc/myapp.conf"
}
# Copies the string in content into /tmp/file.log
provisioner "file" {
content = "ami used: ${self.ami}"
destination = "/tmp/file.log"
}
# Copies the configs.d folder to /etc/configs.d
provisioner "file" {
source = "conf/configs.d"
destination = "/etc"
}
# Copies all files and folders in apps/app1 to D:/IIS/webapp1
provisioner "file" {
source = "apps/app1/"
destination = "D:/IIS/webapp1"
}
}
file プロビジョナーが SSH を介して Windows システムと通信する場合、OpenSSH が PowerShell ではなく cmd.exe でコマンドを実行するように構成する必要があります。PowerShell は Unix シェルと Windows コマンドインタープリターの両方と互換性がないため、ファイルの解析エラーが発生します。
引数リファレンス
次の引数がサポートされています。
-
source- ソースファイルまたはディレクトリ。現在の作業ディレクトリに対する相対パス、または絶対パスとして指定します。この引数はcontentと組み合わせることはできません。 -
content- 宛先にコピーする直接コンテンツ。宛先がファイルの場合、コンテンツはそのファイルに書き込まれます。ディレクトリの場合、tf-file-contentという名前のファイルがそのディレクトリ内に作成されます。contentを使用する場合は、宛先としてファイルを使用することをお勧めします。この引数はsourceと組み合わせることはできません。 -
destination- (必須) リモートシステムに書き込む宛先パス。詳細については、下記の宛先パスを参照してください。
宛先パス
destination 引数で指定するパスは、OpenTofu 自体ではなく、リモートシステムによって評価されます。したがって、その引数の有効な値は、ターゲットで実行されているオペレーティングシステムとリモートアクセスソフトウェアによって異なる場合があります。
SSH 経由で接続する場合、file プロビジョナーは、指定された宛先パスをリモートホスト上の scp プログラムにそのまま渡します。デフォルトでは、OpenSSH の scp 実装はリモートユーザーのホームディレクトリで実行されるため、そのホームディレクトリにアップロードするための相対パス、または他の場所にアップロードするための絶対パスを指定できます。リモートの scp プロセスは connection ブロックで指定されたユーザーのアクセスレベルで実行されるため、権限によってホームディレクトリ外の場所への直接書き込みが妨げられる場合があります。
WinRM には対応するファイル転送プロトコルがないため、WinRM 接続の場合、file プロビジョナーはより複雑なプロセスを使用します。
- 一意性のため、擬似乱数 UUID を使用して、リモートシステムの
TEMP環境変数で指定されたディレクトリに一時ファイル名を生成します。 - WinRM 経由でシーケンシャルに生成された
echoコマンドを使用して、ソースファイルの base64 エンコードされたチャンクを徐々に選択した一時ファイルに追加します。 - アップロードされた PowerShell スクリプトを使用して、一時ファイルを読み取り、base64 デコードし、生の結果を宛先ファイルに書き込みます。
WinRM の場合、宛先パスは PowerShell によって解釈されるため、PowerShell が解釈する可能性のあるメタ文字を使用しないように注意する必要があります。特に、WinRM を使用する場合は、destination 引数に信頼できない外部入力を含めないでください。リモートシステムでの PowerShell コードの任意の実行のベクトルになる可能性があるためです。
最新の Windows システムは OpenSSH サーバーの実行をサポートしているため、可能な限り WinRM よりも SSH を選択し、古い Windows バージョンで作業する場合にのみ最後の手段として WinRM を使用することを強くお勧めします。
ディレクトリのアップロード
file プロビジョナーは、完全なディレクトリをリモートマシンにアップロードできます。ディレクトリをアップロードする場合は、いくつかの追加の考慮事項があります。
ssh 接続タイプを使用する場合、宛先ディレクトリはすでに存在している必要があります。作成する必要がある場合は、ディレクトリを作成するために、ファイルプロビジョナーの直前に remote-exec プロビジョナーを使用してください。
winrm 接続タイプを使用する場合、宛先ディレクトリが存在しない場合は作成されます。
ソースパスに末尾のスラッシュが存在するかどうかによって、ディレクトリ名が宛先に埋め込まれるか、宛先が作成されるかが決まります。例:
-
ソースが
/foo(末尾のスラッシュなし) で、宛先が/tmpの場合、ローカルマシンの/fooの内容は、リモートマシンの/tmp/fooにアップロードされます。リモートマシンのfooディレクトリは OpenTofu によって作成されます。 -
ただし、ソースが
/foo/(末尾のスラッシュが存在する) で、宛先が/tmpの場合、/fooの内容は直接/tmpにアップロードされます。