从 Terraform 上传 AWS S3 中的多个文件
Uploading Multiple files in AWS S3 from terraform
我想将多个文件从本地设备的特定文件夹上传到 AWS S3。我 运行 遇到以下错误。
这是我的地形代码。
resource "aws_s3_bucket" "testbucket" {
bucket = "test-terraform-pawan-1"
acl = "private"
tags = {
Name = "test-terraform"
Environment = "test"
}
}
resource "aws_s3_bucket_object" "uploadfile" {
bucket = "test-terraform-pawan-1"
key = "index.html"
source = "/home/pawan/Documents/Projects/"
}
我该如何解决这个问题?
您正在尝试上传目录,而 Terraform 需要源字段中的单个文件。尚不支持将文件夹上传到 S3 存储桶。
但是,您可以使用 null_resource 配置程序调用 awscli 命令,如建议的那样 here。
resource "null_resource" "remove_and_upload_to_s3" {
provisioner "local-exec" {
command = "aws s3 sync ${path.module}/s3Contents s3://${aws_s3_bucket.site.id}"
}
}
从 Terraform 0.12.8 开始,您可以使用 fileset
函数获取给定路径和模式的文件列表。结合 for_each
,您应该能够将每个文件作为自己的文件上传 aws_s3_bucket_object
:
resource "aws_s3_bucket_object" "dist" {
for_each = fileset("/home/pawan/Documents/Projects/", "*")
bucket = "test-terraform-pawan-1"
key = each.value
source = "/home/pawan/Documents/Projects/${each.value}"
# etag makes the file update when it changes; see
etag = filemd5("/home/pawan/Documents/Projects/${each.value}")
}
参见 GitHub 上的 terraform-providers/terraform-provider-aws : aws_s3_bucket_object: support for directory uploads #3020。
注意: 这不会像 content_type
那样设置元数据,据我所知,Terraform 没有内置的方式来推断内容类型的一个文件。此元数据对于浏览器的 HTTP 访问等正常工作非常重要。如果这对您很重要,您应该考虑手动指定每个文件,而不是尝试自动从文件夹中获取所有内容。
自 2020 年 6 月 9 日起,terraform 提供了一种内置方法来推断您上传到 S3 存储桶时可能需要的文件的内容类型(以及一些其他属性)
HCL 格式:
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"
}
}
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
}
JSON格式:
{
"resource": {
"aws_s3_bucket_object": {
"static_files": {
"for_each": "${module.template_files.files}"
#...
}}}}
#...
}
来源:https://registry.terraform.io/modules/hashicorp/dir/template/latest
我想将多个文件从本地设备的特定文件夹上传到 AWS S3。我 运行 遇到以下错误。
这是我的地形代码。
resource "aws_s3_bucket" "testbucket" {
bucket = "test-terraform-pawan-1"
acl = "private"
tags = {
Name = "test-terraform"
Environment = "test"
}
}
resource "aws_s3_bucket_object" "uploadfile" {
bucket = "test-terraform-pawan-1"
key = "index.html"
source = "/home/pawan/Documents/Projects/"
}
我该如何解决这个问题?
您正在尝试上传目录,而 Terraform 需要源字段中的单个文件。尚不支持将文件夹上传到 S3 存储桶。
但是,您可以使用 null_resource 配置程序调用 awscli 命令,如建议的那样 here。
resource "null_resource" "remove_and_upload_to_s3" {
provisioner "local-exec" {
command = "aws s3 sync ${path.module}/s3Contents s3://${aws_s3_bucket.site.id}"
}
}
从 Terraform 0.12.8 开始,您可以使用 fileset
函数获取给定路径和模式的文件列表。结合 for_each
,您应该能够将每个文件作为自己的文件上传 aws_s3_bucket_object
:
resource "aws_s3_bucket_object" "dist" {
for_each = fileset("/home/pawan/Documents/Projects/", "*")
bucket = "test-terraform-pawan-1"
key = each.value
source = "/home/pawan/Documents/Projects/${each.value}"
# etag makes the file update when it changes; see
etag = filemd5("/home/pawan/Documents/Projects/${each.value}")
}
参见 GitHub 上的 terraform-providers/terraform-provider-aws : aws_s3_bucket_object: support for directory uploads #3020。
注意: 这不会像 content_type
那样设置元数据,据我所知,Terraform 没有内置的方式来推断内容类型的一个文件。此元数据对于浏览器的 HTTP 访问等正常工作非常重要。如果这对您很重要,您应该考虑手动指定每个文件,而不是尝试自动从文件夹中获取所有内容。
自 2020 年 6 月 9 日起,terraform 提供了一种内置方法来推断您上传到 S3 存储桶时可能需要的文件的内容类型(以及一些其他属性)
HCL 格式:
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"
}
}
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
}
JSON格式:
{
"resource": {
"aws_s3_bucket_object": {
"static_files": {
"for_each": "${module.template_files.files}"
#...
}}}}
#...
}
来源:https://registry.terraform.io/modules/hashicorp/dir/template/latest