36
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-07-14

概要

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のモジュールのバージョンも指定できるので3.60.0に固定します
  • profileは先ほど設定したterrformerを指定します、これでmain.tfファイル内にアクセストークンを書き込まずに済みます
terraformの設定
  • versonを1.0.7を指定
  • backendにs3を設定、このときのkeyにしてしたファイル名でバケットにアップロードされます
resourceにs3バケットを追加
  • backendで要求したhoge-tfstateの名前でバケットを作成します

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

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アカウントで管理しておくとかが良さそう

36
24
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?