📝

Terragrunt+Terraformで新たにs3の設定を加えた時の記録

2022/07/24に公開

Terragrunt+Terraformで新たにs3の設定を加えた時の記録

状況としては学習の期間があいてしまってTerragrunt+Terraform環境に
s3を加えようとした時に忘れていたのとエラーが出たので記録してみました。

ディレクトリ構成

プロジェクト全体としては以下のようなディレクトリ構成になっています。
元々snsとEventBridgeは管理しておりましたがs3も管理下に加えるという状況でした。

production
∟sns
∟s3
∟EventBridge
∟.terraform
∟terraform.tfstate.d
∟terraform.lock.hcl
∟_provider.tf
∟terragrunt.hcl
provider.tf

なおawsアカウントはworkspaceを使って管理しています。

加えるファイル

前述のs3ディレクトリに以下のファイルを加えます。

/production/s3/_provider.tf
プロバイダ関連の情報を指定します。今回はworkspaceを経由してawsのcredentialファイル内の情報を参照しています。

provider "aws" {
  shared_credentials_files = ["$HOME/.aws/credentials"]
  profile                 = "${terraform.workspace}"
  region                  = "ap-northeast-1"
}

terraform {
  backend "s3" {}
}

/production/s3/main.tf
Terraformで何を設定するかを指定するメインとなるファイルです。
ここではtest-bucketというバケットを作成しています。

resource "aws_s3_bucket" "test-bucket" {
  bucket = "test-bucket"
}

/production/s3/output.tf
EventBridgeなど他のディレクトリでS3のarn情報などが必要になる場合があります。
その際も直書きするよりは以下のような形でs3上で情報を書き出し、パブリックアクセスを拒否しつつTerraform経由で読み込むとセキュアになると思います。

output "s3_test_production_arn" {
value = aws_s3_bucket.test_production.arn
}

output "s3_test_production_id" {
value = aws_s3_bucket.test_production.id
}

/production/s3/terragrunt.hcl
このファイルでTerragruntルートディレクトリのterragrunt.hclを読み込むことによって
provider.tfを一元管理しています。

include "root" {
  path = find_in_parent_folders()
}

既存ファイル

Terragruntルートディレクトリのterragrunt.hclというファイルは説明上あった方がわかりやすいと思いここに記述します。
今回はs3の解説をしていますが、既存のsnsもEventBridgeも同様にこの設定ファイルを読み込みに来ています。
/production/terragrunt.hcl
terragruntルートディレクトリでのprovider.tf一元管理ファイル。

remote_state {
    backend = "s3"
    config = {
        bucket = "test-production-tfstate"
        key = "${path_relative_to_include()}.tfstate"
        region = "ap-northeast-1"
        encrypt = true
    }
}

generate "provider" {
    path = "_provider.tf"
    if_exists = "overwrite_terragrunt"
    contents = file("../provider.tf")
}

terraform {
    before_hook "workspace" {
        commands = ["plan", "state", "apply", "destroy"]
        execute  = ["terraform", "workspace", "select", "test-production"]
    }
}

Terragruntについて

Terragruntを導入したモチベーションとしてはprovider情報を何度も同じ記述をするのを
DRYにしたいということでした。それゆえ構成ファイルが増えたりしますが記述はスッキリし
管理も楽になるのではないかと考えています。

Discussion