TerraformでS3に複数のファイルをまとめてアップロードする方法

プログラミング

こんにちは!

本日はTerraformで複数のファイルをS3にアップロードするコードを紹介したいと思います。

ネット上を見てみると単一ファイルをアップロードする記事しか見当たらず、それぞれ処理を書くとコードが膨大になってしまう為工夫しました。

同じことを考えている方は是非参考にしてみてください。

また、他にも普段の生活で役立つテクニックをご紹介していますので興味のある方は以下のリンクからご覧ください。

アップロード処理をfor_each文で回す

S3に複数ファイルをアップロードするコードは処理をfor_each文で繰り返すことで実現できました

以下にコードの全文を載せておきます。

次の章から各コードの説明も行っていきますので先に全文を見たい方は下記をご覧ください。

resource "aws_s3_bucket_object" "your_original_resource_name" {

  # for_each文でProjectsディレクトリの下のファイルを全てアップロードします
  for_each = fileset("~/Projects/", "*")

  # S3のバケット名、またはバケットのresourceのidを書く。
  bucket = "your_backet_name"

  # S3上でファイルを置きたいパスを書く。
  # 以下の例だとS3上のhogehogeディレクトリの下にファイルがアップロードされます。
  key    = "~/hogehoge/${each.value}"

  # ローカルPC上のアップロードしたいファイルがあるディレクトリのパスを書く。
  source = "~/Projects/${each.value}"

  # etagを設定しておくとファイルに変更があった時に自動で更新してくれます。記載推奨。
  etag   = filemd5("~/Projects/${each.value}")
}

for_each

今回のコードの肝です。

複数ファイルのアップロードはfor_each文でアップロード処理を複数回行うことで実現しています。

fileset関数と*(ワイルドカード)を使用することで特定のディレクトリの下の全てのファイルに対してアップロード処理を行うようにしています。

下の例だとProjectディレクトリの下の全てのファイルをアップロードするように動きます。

  # for_each文でProjectsディレクトリの下のファイルを全てアップロードします
  for_each = fileset("~/Projects/", "*")

bucket

ファイルをアップロードしたいS3のバケット名をStringで記載します。

例のようにStringで直書きしたり、別resourceの値を変数参照しても大丈夫です。

  # S3のバケット名、またはバケットのresourceのidを書く。
  bucket = "your_backet_name"

key

keyにはファイルを保存したいS3上のパスを書きます。

下記の例だとS3のルートディレクトリ(~/)の下のhogehogeディレクトリの中にファイルをアップロードします。

実際にアップロードするファイル名はfor_each文で回す各ファイルの名前を${each.value}で指定します

  # S3上でファイルを置きたいパスを書く。
  # 以下の例だとS3上のhogehogeディレクトリの下にファイルがアップロードされます。
  key    = "~/hogehoge/${each.value}"

source

sourceにはアップロードしたいローカルPC上のファイルのパスを書きます。

今回は複数のファイルをアップロードしたいためファイルのパスも複数記載する必要があります。

この複数ファイルパスの指定には冒頭で紹介したfor_each文を使います。

key = “~/Projects/${each.value}”と記載することで${each.value}で全てのファイル名を取得し、Projectディレクトリの下の全ファイルをアップロードすることができます。

  # ローカルPC上のアップロードしたいファイルがあるディレクトリのパスを書く。
  source = "~/Projects/${each.value}"

etag

etagは記載しなくても基本の処理には問題ない属性です。

しかし個人的には非常に重要なので記載推奨です。

etagはアップロード処理に対して付けられるタグです。

etagを記載することで一度アップロードしたファイルに変更があった際に自動で再アップロードしてくれます。

書くによるデメリットは特にないため、ファイル管理を全自動化したい方は是非記載してください。

  # etagを設定しておくとファイルに変更があった時に自動で更新してくれます。記載推奨。
  etag   = filemd5("~/Projects/${each.value}")

まとめ

本日はTerraformで複数のファイルをS3に上げるコードを紹介しました。

単体ファイルをアップロードする記事は数多くあるものの複数の上げるものは見当たらず、あげくアップロードするファイル分コードを書いている例もありました。

実用性はあると思うのでS3を使われている方は是非実践してみてください!

また、他にも普段の生活で役立つテクニックをご紹介していますので興味のある方は以下のリンクからご覧ください。

コメント