如何使用Terraform将多个文件/文件夹一起上传到S3?
想做的事
我想要批量将本地的模块(多个文件/文件夹)上传到S3。
前提 tí) – premise
・已创建了AWS帐户。
・已创建AWS IAM用户,并生成了Access Key和Secret Key。
・已安装了Terraform。
・已安装了AWS CLI。
・已安装了VSCODE。
(可使用您喜欢的编辑器)
环境
$ terraform -v
Terraform v1.5.5
on windows_amd64
+ provider registry.terraform.io/hashicorp/aws v5.13.1
建立资源
・亚马逊 S3 存储桶
・该桶下的对象
目录结构
root
┣━ www
┃ ┗━ src
┃ ┗━ css
┃ ┗━ test.css
┃ ┗━ js
┃ ┣━ test1.js
┃ ┗━ test2.js
┃ ┗━ index.html
┣━ main.tf
┣━ variables.tf
┗━ s3.tf
源文件内容
主.tf
通常,main.tf文件中会编写最重要的整体共享设置,比如” AWS提供者设置”。
# AWS プロバイダの設定
provider "aws" {
access_key = var.access_key
secret_key = var.secret_key
region = var.region
}
variables.tf 变量文件
将全源代码共享的变量写在variables.tf上
将区域设置为东京,但可以根据需要进行更改
使用之前预先颁发的访问密钥和秘密密钥
variable "region" {
default = "ap-northeast-1"
}
variable "access_key" {
default = "自分のaccess_key"
}
variable "secret_key" {
default = "自分のsecret_key"
}
s3.tf 可提供以下服务。
建立一个S3存储桶,将指定的本地路径下的文件/文件夹作为对象上传到S3。
使用terraform的for_each功能,类似于循环,可以批量上传指定路径下的内容。
resource "aws_s3_bucket" "yu-test-20230825" {
bucket = "yu-test-20230825"
}
resource "aws_s3_bucket_object" "www" {
#モジュール配下のファイルだけアップロード
for_each = fileset("./www/", "*")
#モジュール配下のすべてファイル/フォルダをアップロード
#for_each = fileset("./www/", "**")
bucket = aws_s3_bucket.s3.id
key = "./www/${each.value}"
source = "./www/${each.value}"
#ローカルにあるリソースを修正すると、AWS側も連動で更新する
etag = filemd5("./www/${each.value}")
}
只上传模块文件下的文件。
这次我想用Terraform创建一个S3存储桶,并将本地的静态托管模块上传上去。
立即准备好的s3.tf文件并开始执行吧~
terraform plan
听说他们把两个资源添加到了执行计划中~
Plan: 2 to add, 0 to change, 0 to destroy.
接下来,将应用部署到AWS上。
terraform apply
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
当查看部署结果时,请确认。
哎呀,怎么有点不一样?
刚才查看了一下目录结构,只发现了www文件夹下的index.html文件。
root
┣━ www
┗━ src
┗━ css
┗━ test.css
┗━ js
┣━ test1.js
┗━ test2.js
┗━ index.html ← こいつだけ
是的!据说当”*”只有一个时,只会上传指定路径下的文件。
for_each = fileset("./www/", "*")
上传所有模块下的文件/文件夹。
那么,如果想要将模块下的所有文件和文件夹统一整理,并以与本地相同的树状结构进行上传,应该怎么做呢?
如果把*分成两个部分,就能很容易地完成!
如果有两个选项,它们会帮忙上传指定路径下的所有内容!
for_each = fileset("./www/", "**")
root
┣━ www ↓↓以下全部
┗━ src
┗━ css
┗━ test.css
┗━ js
┣━ test1.js
┗━ test2.js
┗━ index.html
一旦,让我们删除先前创建的S3,并重新创建它!
terraform destroy
Destroy complete! Resources: 2 destroyed.
然后,将星号改为两个,并修改执行计划。
terraform plan
听说这次他们已经正确地添加了五个资源(一个桶和四个对象)~
Plan: 5 to add, 0 to change, 0 to destroy.
要部署到AWS。
terraform apply
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
这一次,它能够一次性批量上传模块下的所有文件和文件夹!太好了!
最后
辛苦了!我成功完成了这次想做的事情!
· 我想要批量将本地的模块(多个文件/文件夹)上传到S3上。
⇒ 如果只想上传子文件,请使用 * ,如果想上传所有文件和文件夹,请使用 ** ,就可以了。
请提供一个参考网站。