参考記事

terraformのbackendをs3にしてinitするまでの最低限の手順 - Qiita

tfstate管理用のS3バケットを作る

Backend Type: s3 - Terraform by HashiCorp

AWSのコンソールからバケットを作ります。この時、Documentにある通り、

Warning! It is highly recommended that you enable Bucket Versioning on the S3 bucket to allow for state recovery in the case of accidental deletions and human error.

バージョニングを有効にしておくのと、

Terraform is an administrative tool that manages your infrastructure, and so ideally the infrastructure that is used by Terraform should exist outside of the infrastructure that Terraform manages.

バケット自身はTerraformの管理外にしておくのが良いそうです

backendの設定を書く

どこでも良いと思いますが、自分は provider "aws"セクションと同じ所に書きました

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat provider.tf

provider "aws" {
region = "ap-northeast-1"
shared_credentials_file = "/.aws/credentials"
profile = "my-aws-profile"
}

// backendセクションを追加
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket"
region = "ap-northeast-1"
profile = "my-aws-profile"
key = "terraform.tfstate"
encrypt = true
}
}

backendの設定を反映

1
$ terraform init

元々ローカルで .tfstateファイルをコミットしてあった人は、既存のtfstateファイルを削除し、.gitignoreに追加し、.tfstateファイルを管理外にして完了です

ハマったところ

terraform initすると、 Error: No valid credential sources found for AWS Provider.と出てハマった件

1
2
3
4
5
6
$ terraform init
Initializing the backend...

Error: No valid credential sources found for AWS Provider.
Please see https://terraform.io/docs/providers/aws/index.html for more information on
providing credentials for the AWS Provider

公式DocのExample Configurationには、 profileの行が書かれていないのですが、 profile行がないとcredentialsが無視されているようです

これが仕様なのかどうなのかと言及している記事も見かけましたが、是非はどうなんでしょう