如何使用Terraform从AWS S3存储桶下载tar.gz文件
解决Terraform下载S3二进制tar.gz文件的问题
你的问题出在local_file的content字段——它是为文本内容设计的,直接把S3二进制对象的body赋值给它会因为编码解析错误损坏文件。下面是两种可行的解决思路:
方法一:用Terraform原生字段处理Base64编码
data.aws_s3_object返回的body对于二进制文件来说是Base64编码后的字符串,改用local_file的content_base64字段就能正确解码并写入二进制文件:
data "aws_s3_object" "example" { bucket = "some-bucket" key = "someFile.tar.gz" } resource "local_file" "downloaded_file" { content_base64 = data.aws_s3_object.example.body filename = "someFile.tar.gz" }
方法二:通过AWS CLI下载(适合大文件)
如果文件体积较大,或者想利用AWS CLI的传输优化特性,可以用null_resource配合aws s3 cp命令直接下载,避免Terraform处理二进制内容的编码问题:
data "aws_s3_object" "example" { bucket = "some-bucket" key = "someFile.tar.gz" } resource "null_resource" "download_s3_file" { provisioner "local-exec" { command = "aws s3 cp s3://some-bucket/someFile.tar.gz ./someFile.tar.gz" } # 当S3对象更新(ETag变化)时自动重新下载 triggers = { etag = data.aws_s3_object.example.etag } }
两种方法各有优劣:方法一纯Terraform原生实现,配置简单;方法二更适合大文件,且能复用AWS CLI的各种配置(比如重试策略、传输加速)。
内容的提问来源于stack exchange,提问作者tanovsky
相关产品推荐
相关产品推荐

