使用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")
}
首页.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吧~
这个指定的路径与”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.
然后,从S3下载文件并检查其内容。
不仅使用了s3.tf,还使用了etag,这样能够正确地检测到目标文件(index.html)的修改,并将其上传到S3!好极了!
结束
你辛苦了!这次想做的事情顺利完成了!
· 想要用Terraform部署AWS S3存储桶和对象
⇒可以使用aws_s3_bucket和aws_s3_object来创建资源哦~
· 想要验证一下在本地编辑S3对象(文件)后是否可以与AWS同步
⇒只要使用ETag进行管理,就可以进行同步哦~