如何使用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.

当查看部署结果时,请确认。

哎呀,怎么有点不一样?

image.png

刚才查看了一下目录结构,只发现了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.
image.png

这一次,它能够一次性批量上传模块下的所有文件和文件夹!太好了!

最后

辛苦了!我成功完成了这次想做的事情!
· 我想要批量将本地的模块(多个文件/文件夹)上传到S3上。
⇒ 如果只想上传子文件,请使用 * ,如果想上传所有文件和文件夹,请使用 ** ,就可以了。

请提供一个参考网站。

 

广告
将在 10 秒后关闭
bannerAds