이것은 특정 기본 디렉토리의 모든 파일을 모으고 특정 접미사를 테라 양식 템플릿 파일로 렌더링하는 컴퓨팅 전용 Terraform 모듈 (즉, 원격 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 : 파일에 사용할 마임 유형.content : 템플릿을 렌더링 한 후 파일의 문자 내용.source_path : 비 테드 플레이트 파일의 로컬 파일 시스템 위치.digests : 파일 콘텐츠에 다양한 다이제스트/해시 알고리즘을 적용한 결과가 포함 된 맵. content 및 source_path 는 상호 배타적입니다. 템플릿 파일에 대한 content 설정되어 있으며 템플릿 렌더링 결과가 포함되어 있습니다. 비 테일 플레이트 파일의 경우 source_path 로컬 디스크의 파일 위치로 설정되어 이미지와 같은 비 UTF-8 파일을 메모리에로드하지 않습니다.
각 파일의 digests 맵에는 다음 키가 포함되어 있으며 값은 값이 파일 내용에 이름 지정된 해시 함수를 적용한 결과입니다.
md5sha1sha256base64sha256base512base64sha512 기본적으로 파일 이름이 .tmpl 로 끝나는 기본 디렉토리의 모든 파일은 템플릿으로 해석됩니다. 변수 template_file_suffix 기간으로 시작하는 모든 문자열로 설정하여 하나 이상의 기간이 아닌 문자가 이어지는 문자열로 해당 접미사를 무시할 수 있습니다.
템플릿은 Terraform의 문자열 템플릿 구문으로 해석됩니다. 템플릿은 templatefile 함수를 제외한 TerraForm의 내장 기능을 사용할 수 있습니다.이 모듈은 내부적으로 템플릿 렌더링에 사용하는 것입니다.
템플릿 파일 접미사가없는 모든 파일은 정적 파일로 취급되어 소스 파일로 로컬 경로를 반환합니다.
내용 형 값 (결과 객체의 content_type )은 발견 된 모든 파일의 접미사를 기반으로 선택됩니다.
변수 file_types 는 Filename 접미사 (DOT 뒤에 하나 이상의 비 DOT 문자)에서 Content-Type 헤더 값에 대한 매핑입니다. 기본 매핑에는 정적 웹 사이트에서 일반적으로 사용되는 다수의 파일 유형이 포함되어 있습니다.
모듈에 접미사가 전혀 없거나 접미사가 file_types 에없는 파일을 만나면 변수 default_file_type 의 값을 폴백으로 사용하여 application/octet-stream 의 기본값을 사용합니다.
이 모듈의 주요 사용 사례는 컨텐츠를 생성하여 Amazon S3 버킷에 업로드하는 것 (예 : 정적 웹 사이트로 사용하는 것입니다.
호출 모듈에서 aws_s3_bucket_object 사용하여 for_each 사용하여 AWS 제공 업체의 aws_s.
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이 실행중인 시스템에서 로컬 상태를 수정하여 결과가 발생합니다. 다른 호스트에서 TerraForm을 실행할 때 리소스가 표시되지 않습니다.
template_dir 리소스 유형은 더 이상 Terraform 0.12.8에서 대부분의 사용 케이스에 대해 더 이상 필요하지 않습니다. 리소스가 전혀없는 유사한 결과를 얻을 수있는 충분한 내장 기능이 있기 때문입니다.
이 모듈은 template_file 리소스보다 Terraform의 워크 플로에서 더 나은 시민이 될뿐만 아니라 동일한 디렉토리에 템플릿과 비 테일 플레이트 파일을 혼합 할 수 있으며 메모리에로드하여 템플릿 파일을 렌더링합니다. 비 테일 플레이트 파일의 경우 디스크에 디스크에 남겨두고 로컬 파일 시스템 경로를 원래 위치로 반환합니다.
반면 에이 모듈은 결과가 메모리에서 문자열로 렌더링되고 디스크에서 직접 읽는 일부 파일을 처리 할 수있는 다른 리소스 유형과 함께 사용될 것이라고 가정 합니다 . 이는 aws_s3_bucket_object 의 경우에는 해당되지만 임의 파일에서 작동 할 수있는 모든 리소스 유형에서는 그렇지 않습니다.