1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TerraformでオブジェクトをS3へアップロードし、etagでファイル更新を管理する方法

Posted at

やりたいこと

・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

ソースの中身

main.tf

main.tfには基本、全体共通で重要な設定、例えば「AWS プロバイダの設定」を書く

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

variables.tf

・variables.tfに全ソース共通の変数を書く
・リージョンは東京にしたが、適宜変更して大丈夫
・access_keyとsecret_keyは事前に発行したやつを使用

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のetagでリソースを管理すると、ローカルにあるリソースを修正した場合、AWS側も連動で更新できる
・key(S3側、フォルダの階層は自由に指定できる)とsource(ファイルのローカルパス)を一緒じゃなくても大丈夫

s3.tf
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にはフォルダという概念がなくて、key-value でオブジェクトを格納してる
S3へオブジェクトをアップロードするときは、"www/src/index.html"のようにkeyを指定し、フォルダを作成しファイルを格納するような動作に見えるが、実はそれはフォルダじゃなく、プレフィックス という概念である

index.html

テスト内容だけ

index.html
test

TerraformでオブジェクトをS3へアップロードする

早速用意したs3.tfを実行しよう

terraform plan 

S3バケット1つとオブジェクト1つをaddしてくれたそうです

実行結果
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のプレフィックスを変えよう~|

s3.tf
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の中身をちょっと修正

index.html
test again

実行計画を変更する

terraform plan 

オブジェクト1つ(古いプレフィックス)をaddし、オブジェクト1つ(新しいプレフィックス)をdestroyしてくれるそうです。

実行結果
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へアップロードしてくれたね!Good!

終わりに

お疲れ様です!今回のやりたいことが無事終わった!
・TerraformでAWS S3バケットとオブジェクトをデプロイしたい
⇒aws_s3_bucketとaws_s3_objectでリソースを作れるよ~
・ローカルでs3オブジェクト(ファイル)を編集したらAWSへ連動できるか検証したい
⇒etagで管理すれば連動できるよ~

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?