使用Terraform将对象上传到S3,并使用etag管理文件更新的方法

我想做的事情

・我想使用Terraform部署AWS S3存储桶和对象
・我想要在本地编辑S3对象(文件)后验证是否能与AWS同步

前提是一个前提条件,即是某个事件或情况发生的必要条件。

已创建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

构建资源

AWS S3 桶
將物件上傳至 S3 桶

目录结构

root
  ┣━ www
  ┃  ┗━ index.html
  ┣━ main.tf
  ┣━ variables.tf
  ┗━ s3.tf

源代码的内容 de

主要.tf

一般而言,main.tf文件中写有一些全局共通的重要设置,例如”AWS提供商的配置”。

# AWS プロバイダの設定
provider "aws" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = var.region
}

变量.tf

・在variables.tf文件中写入适用于所有源的变量
・将地区设置为东京,但可以随时更改
・使用事先发行的access_key和secret_key

variable "region" {
  default = "ap-northeast-1"
}

variable "access_key" {
  default = "自分のaccess_key"
}

variable "secret_key" {
  default = "自分のsecret_key"
}


s3.张开三折。

・建立一个S3存储桶,并将指定的本地路径下的文件上传到S3作为对象。
・通过Terraform的etag管理资源,当本地资源被修改时,AWS也可以同步更新。
・无论是key(S3侧,文件夹层级可自由指定)还是source(文件的本地路径),它们可以不必同时存在。

resource "aws_s3_bucket" "terraform-s3-20230829" {
  bucket = "terraform-s3-20230829"
}

resource "aws_s3_object" "index_page" {
  bucket = aws_s3_bucket.s3.id
  #S3へアップロードするときのkey値
  key = "www/src/index.html"
  #ファイルのローカルパス
  source = "www/index.html"
  content_type = "text/html"
  etag = filemd5("www/index.html")
}

S3没有文件夹的概念,而是通过键值对来存储对象。当向S3上传对象时,看起来像是创建了文件夹并将文件存储在其中,但实际上这并不是文件夹,而是一个前缀的概念。

首页.html

只需要测试内容.

test

使用Terraform将对象上传到S3。

我们立即执行准备好的s3.tf文件。

terraform plan 

听说他们给了一个S3存储桶和一个对象。

Plan: 2 to add, 0 to change, 0 to destroy.

接下来,让我们将其部署到AWS上。

terraform apply 
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

看起來已成功部署,讓我們檢查一下AWS吧~

image.png

这个指定的路径与”www/src/index.html”具有相同的前缀。

在本地编辑文件并在Terraform中重新上传。

当然,tf文件是由Terraform进行管理的,但是我对于源文件(index.html)是否被Terraform正确管理有些不确定…

稍作修改后,重新部署吧~

首先,让我们更改 s3.tf 文件中 aws_s3_object 的前缀~

resource "aws_s3_bucket" "terraform-s3-20230829" {
  bucket = "terraform-s3-20230829"
}

resource "aws_s3_object" "index_page" {
  bucket = aws_s3_bucket.s3.id
  #key値を"www/src/index.html"から以下に修正
  key = "www/index.html"
  source = "www/index.html"
  content_type = "text/html"
  etag = filemd5("www/index.html")
}

然后,稍微修改index.html的内容。

test again

修改执行计划

terraform plan 

听说要添加一个旧前缀的物体,并摧毁一个新前缀的物体。

Plan: 1 to add, 0 to change, 1 to destroy.

让我们将更改部署到AWS上。

terraform apply 
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
image.png

然后,从S3下载文件并检查其内容。

image.png

不仅使用了s3.tf,还使用了etag,这样能够正确地检测到目标文件(index.html)的修改,并将其上传到S3!好极了!

结束

你辛苦了!这次想做的事情顺利完成了!
· 想要用Terraform部署AWS S3存储桶和对象
⇒可以使用aws_s3_bucket和aws_s3_object来创建资源哦~
· 想要验证一下在本地编辑S3对象(文件)后是否可以与AWS同步
⇒只要使用ETag进行管理,就可以进行同步哦~

广告
将在 10 秒后关闭
bannerAds