Edited at

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


概要

terraformのtfstateをs3で管理したいときの手順書です

terrformで使用するのユーザーの作成からterraform init するまでの手順をまとめました


手順


awsユーザーの追加

まず、はじめに、aws cliを使えるようにするためにユーザーを追加しましょう

AWSのコンソールからIAMを選択します、ユーザーを追加をクリック


  • 名前は適当にterraformerに設定

  • アクセスの種類は「プログラムによるアクセス」にチェック、コンソールへのログインはしないと思うのでチェックしません

20180714135652.png

次に、必要な権限をアタッチします。

s3へアクセスする権限が必要なので AmazonS3FullAccess権限 をアタッチします

20180714135903.png

FullAccessでは権限範囲が大きいので、制限を強めにしたい場合は以下の公式URLを参考に権限を割り当ててください

Backend Type: s3 - Terraform by HashiCorp


アクセスキーの取得

ユーザーの作成に成功すると、アクセスキー ID、シークレットアクセスキー の2つが表示されるのでそれを ~/.aws/credentials へ書き込みます

また、[terraformer] と表記している部分がprofile名になり、aws --profile profile名 で呼び出すことで複数のアカウントを使うことができます


~/.aws/credentials

[terraformer]

region = ap-northeast-1
aws_access_key_id = XXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXX

次に、credentials が正常に追加されたことを確認します

$ aws s3 ls --profile terraformer

とくにエラーにならなければ大丈夫です


main.tfの作成

次に実際に実行するtfファイルを作成します


providerの設定


  • awsを設定

  • regionはアジアプシフィック(東京)

  • provider-awsのモジュールのバージョンも指定できるので1.25.0に固定します

  • profileは先ほど設定したterrformerを指定します、これでmain.tfファイル内にアクセストークンを書き込まずに済みます


terraformの設定


  • versonを0.11.7を指定

  • backendにs3を設定、このときのkeyにしてしたファイル名でバケットにアップロードされます


resourceにs3バケットを追加


  • backendで要求したhoge-tfstateの名前でバケットを作成します

完成したmain.tfが以下になります


main.tf

provider "aws" {

region = "ap-northeast-1"
profile = "terraformer"
version = "1.25.0"
}

terraform {
required_version = "0.11.7"
backend "s3" {
bucket = "hoge-tfstate"
region = "ap-northeast-1"
profile = "terrformer"
key = "terraform.tfstate"
encrypt = true
}
}

resource "aws_s3_bucket" "tfstate" {
bucket = "hoge-tfstate"
versioning {
enabled = true
}
}



terraformの初期化処理

$ terraform init

「Terraform has been successfully initialized!」と表示されていれば成功です、上記のコマンドでs3のバケットの作成から保存までやってくれます

最後にawsコンソールへログインして、s3バケットにtfstateが保存されていることを確認しましょう

以上の手順でtfstateをs3に保存する手順は終わりになります


備考


Terraformのバックエンド用のS3バケットは、Terraformで管理してはいけない


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.

https://www.terraform.io/docs/backends/types/s3.html


参考

https://nekopunch.hatenablog.com/entry/2018/03/28/100042

困るユースケースとしては、terraform destroy のような操作を行なったときに、stateがあるS3バケットも削除対象に入ってしまうので面倒、みたいな感じ

運用方法によりますが、terraform destroy みたいな処理を行うことは少ないとは思うので、一緒にしておいてもそんなに困ることはない気がしています

ちゃんとやるなら別のawsアカウントで管理しておくとかが良さそう