Este é um módulo Terraform somente de computação (ou seja, um módulo que não faz nenhuma chamada de API remota) que reúne todos os arquivos sob um diretório básico específico e renderiza aqueles que têm um sufixo específico como arquivos de modelo Terraform.
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 "
}
} A saída files é um mapa dos caminhos de arquivo em relação ao diretório base para objetos com os seguintes atributos:
content_type : um tipo MIME a ser usado para o arquivo.content : conteúdo literal do arquivo, depois de renderizar um modelo.source_path : Localização do sistema de arquivos local de um arquivo não-templado.digests : um mapa que contém os resultados da aplicação de vários algoritmos de digestão/hash ao conteúdo do arquivo. content e source_path são mutuamente exclusivos. content é definido para arquivos de modelo e contém o resultado da renderização do modelo. Para arquivos não-templos, source_path é definido como o local do arquivo no disco local, que evita tentar carregar arquivos não UTF-8, como imagens na memória.
O mapa digests para cada arquivo contém as seguintes chaves, cujos valores são o resultado da aplicação da função de hash nomeada ao conteúdo do arquivo:
md5sha1sha256base64sha256base512base64sha512 Por padrão, qualquer arquivo no diretório base cujo nome do arquivo termina no .tmpl é interpretado como um modelo. Você pode substituir esse sufixo definindo o variável template_file_suffix em qualquer string que começa com um período e é seguida por um ou mais caracteres não period.
Os modelos são interpretados como a sintaxe do modelo de string da Terraform. Os modelos podem usar qualquer uma das funções internas da Terraform, exceto a função templatefile , que é o que esse módulo usa para renderização de modelos internamente.
Qualquer arquivo que não tenha o sufixo do arquivo de modelo será tratado como um arquivo estático, retornando o caminho local ao arquivo de origem.
Os valores do tipo conteúdo ( content_type nos objetos resultantes) são selecionados com base nos sufixos de todos os arquivos descobertos.
O variável file_types é um mapeamento de sufixos de nome do arquivo (um ponto seguido por pelo menos um caractere não-dot) aos valores do cabeçalho Content-Type . O mapeamento padrão inclui vários tipos de arquivos comumente usados em sites estáticos.
Se o módulo encontrar um arquivo que não possui sufixo ou cujo sufixo não estiver em file_types , ele usará o valor da variável default_file_type como fallback, que por si só indica o application/octet-stream .
Um caso de uso importante para este módulo é produzir conteúdo para fazer upload em um balde do Amazon S3, por exemplo, para usar como um site estático.
No seu módulo de chamada, use aws_s3_bucket_object do provedor da AWS com for_each para criar um objeto S3 para cada arquivo:
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
}O padrão para fazer upload de arquivos para o GCS é muito semelhante ao da Amazon S3 acima:
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
}Este módulo requer Terraform v0.12.8 ou posterior. Ele não usa provedores de terraforma e não declara nenhum recurso da Terraform.
template_dir ? O tipo de recurso template_dir foi implementado como uma solução reutilizada pragmática para várias limitações nas versões anteriores do Terraform, mas é problemático porque viola uma suposição de terraformação sobre os recursos: modifica o estado local no sistema em que a Terraform está em execução e, portanto, o resultado do O recurso não é visível ao executar o Terraform em outros hosts.
O tipo de recurso template_dir não é mais necessário do Terraform 0.12.8 para a maioria dos casos de uso, porque há funcionalidade interna suficiente para obter resultados semelhantes sem recursos.
Além desse módulo, sendo um cidadão melhor no fluxo de trabalho da Terraform do que um recurso template_file , ele também permite uma mistura de arquivos de modelo e não-templos no mesmo diretório e apenas carregará na memória e renderizará os arquivos de modelo. Para arquivos que não são do tempo, ele os deixará no disco onde estão e retornará um caminho local do sistema de arquivos para o local original.
Por outro lado, este módulo assume que seu resultado será usado com outro tipo de recurso capaz de lidar com alguns arquivos que estão sendo renderizados na memória e outros arquivos sendo lidos diretamente do disco. Isso é verdade para aws_s3_bucket_object , mas não é verdadeiro para todos os tipos de recursos que podem funcionar com arquivos arbitrários.