概要
terraformのtfstateをs3で管理したいときの手順書です
terrformで使用するのユーザーの作成からterraform init
するまでの手順をまとめました
手順
awsユーザーの追加
まず、はじめに、aws cliを使えるようにするためにユーザーを追加しましょう
AWSのコンソールからIAMを選択します、ユーザーを追加をクリック
- 名前は適当にterraformerに設定
- アクセスの種類は「プログラムによるアクセス」にチェック、コンソールへのログインはしないと思うのでチェックしません
次に、必要な権限をアタッチします。
s3へアクセスする権限が必要なので AmazonS3FullAccess権限 をアタッチします
FullAccessでは権限範囲が大きいので、制限を強めにしたい場合は以下の公式URLを参考に権限を割り当ててください
Backend Type: s3 - Terraform by HashiCorp
アクセスキーの取得
ユーザーの作成に成功すると、アクセスキー ID、シークレットアクセスキー の2つが表示されるのでそれを ~/.aws/credentials へ書き込みます
また、[terraformer] と表記している部分がprofile名になり、aws --profile profile名
で呼び出すことで複数のアカウントを使うことができます
[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のモジュールのバージョンも指定できるので3.60.0に固定します
- profileは先ほど設定したterrformerを指定します、これでmain.tfファイル内にアクセストークンを書き込まずに済みます
terraformの設定
- versonを1.0.7を指定
- backendにs3を設定、このときのkeyにしてしたファイル名でバケットにアップロードされます
resourceにs3バケットを追加
- backendで要求したhoge-tfstateの名前でバケットを作成します
完成したmain.tfが以下になります
provider "aws" {
region = "ap-northeast-1"
profile = "hoge-terraformer"
}
terraform {
required_version = "~> 1.0.7"
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.60.0"
}
}
backend "s3" {
bucket = "hoge-tfstate"
region = "ap-northeast-1"
profile = "hoge-terraformer"
key = "production.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アカウントで管理しておくとかが良さそう