これは、特定のベースディレクトリの下にすべてのファイルを収集し、特定のサフィックスをテラフォームテンプレートファイルとしてレンダリングするコンピューティングのみのテラフォームモジュール(つまり、リモートAPI呼び出しを行わないモジュール)です。
module "template_files" {
source = " hashicorp/dir/template "
base_dir = " ${ path . module } /src "
template_vars = {
# Pass in any values that you wish to use in your templates.
vpc_id = " vpc-abc123 "
}
} files出力は、ベースディレクトリに対するファイルパスから次の属性を持つオブジェクトへのマップです。
content_type :ファイルに使用するmimeタイプ。content :テンプレートをレンダリングした後のファイルの文字通りコンテンツ。source_path :テンプレート以外のファイルのローカルファイルシステムの場所。digests :さまざまなダイジェスト/ハッシュアルゴリズムをファイルコンテンツに適用した結果を含むマップ。 contentとsource_pathは相互に排他的です。 contentテンプレートファイル用に設定されており、テンプレートのレンダリングの結果が含まれています。テンプレート以外のファイルの場合、 source_pathローカルディスク上のファイルの場所に設定されています。これにより、画像などの非UTF-8ファイルをメモリにロードしようとしないようにします。
各ファイルのdigestsマップには、次のキーが含まれています。その値は、名前のハッシュ関数をファイルの内容に適用した結果です。
md5sha1sha256base64sha256base512base64sha512デフォルトでは、ファイル名が.tmplで終了するベースディレクトリ内のファイルはテンプレートとして解釈されます。可変template_file_suffix期間から始まり、1つ以上の非周期文字が続く任意の文字列に設定することにより、その接尾辞をオーバーライドできます。
テンプレートは、Terraformの文字列テンプレート構文として解釈されます。テンプレートは、 templatefile関数を除くTerraformの組み込み関数を使用できます。これは、このモジュールが内部でレンダリングするために使用するものです。
テンプレートファイルの接尾辞を持たないファイルは、ソースファイルへのローカルパスを返す静的ファイルとして扱われます。
コンテンツタイプの値(結果のオブジェクトのcontent_type )は、発見されたすべてのファイルの接尾辞に基づいて選択されます。
変数file_types 、ファイル名の接尾辞(ドットに続く少なくとも1つの非ドット文字)からContent-Typeヘッダー値までのマッピングです。デフォルトのマッピングには、静的Webサイトで一般的に使用される多数のファイルタイプが含まれています。
モジュールが接尾辞がまったくない、またはその接尾辞がfile_typesにないファイルに遭遇した場合、 application/octet-streamバックとして変数default_file_typeの値を使用します。
このモジュールの重要なユースケースは、たとえば静的なWebサイトとして使用するなど、Amazon S3バケットにアップロードするコンテンツを生成することです。
呼び出しモジュールでは、 for_eachを使用してAWSプロバイダーのaws_s3_bucket_objectを使用して、各ファイルにS3オブジェクトを作成します。
resource "aws_s3_bucket_object" "static_files" {
for_each = module . template_files . files
bucket = " example "
key = each . key
content_type = each . value . content_type
# The template_files module guarantees that only one of these two attributes
# will be set for each file, depending on whether it is an in-memory template
# rendering result or a static file on disk.
source = each . value . source_path
content = each . value . content
# Unless the bucket has encryption enabled, the ETag of each object is an
# MD5 hash of that object.
etag = each . value . digests . md5
}GCSにファイルをアップロードするパターンは、上記のAmazon S3のパターンと非常に似ています。
resource "google_storage_bucket_object" "picture" {
for_each = module . template_files . files
bucket = " example "
name = each . key
content_type = each . value . content_type
# The template_files module guarantees that only one of these two attributes
# will be set for each file, depending on whether it is an in-memory template
# rendering result or a static file on disk.
source = each . value . source_path
content = each . value . content
}このモジュールには、Terraform v0.12.8以降が必要です。 Terraformプロバイダーは使用せず、Terraformリソースを宣言しません。
template_dirリソースタイプを使用してみませんか? template_dirリソースタイプは、Terraformの以前のバージョンでのさまざまな制限の実用的な回避策として実装されましたが、Terraformがリソースについて行う仮定に違反しているため問題があります。Terraformが実行されているシステム上のローカル状態を修正するため、したがって他のホストでテラフォームを実行する場合、リソースは表示されません。
ほとんどのユースケースでは、 template_dirフォーム0.12.8以降、テラフォーム0.12.8以降は必要ありません。これは、リソースなしで同様の結果を得るのに十分な組み込み機能があるためです。
このモジュールは、 template_fileリソースよりもTerraformのワークフローの優れた市民であるだけでなく、同じディレクトリにテンプレートと非テンプレートファイルの混合物も許可し、メモリにロードしてテンプレートファイルをレンダリングします。テンプレート以外のファイルの場合、それらをディスクに置いたままにして、元の場所にローカルファイルシステムパスを返します。
一方、このモジュールは、その結果がメモリ内の文字列にレンダリングされているいくつかのファイルを処理できる他のリソースタイプと、ディスクから直接読み取られる他のリソースタイプで使用されると想定しています。これはaws_s3_bucket_objectに当てはまりますが、任意のファイルで動作する可能性のあるすべてのリソースタイプには当てはまりません。