🐡

ニフクラでTerraformのtfstateファイルを管理してみた

2020/12/18に公開

この記事は 富士通クラウドテクノロジーズ Advent Calendar 2020 の19日目の記事です。

18日目は @YOMOGItaro さんの ニフクラとNSX・DFW のトラブルシューティング でした。
2010年からの歴史や DFW のトラブルシューティングなど内容盛り沢山でしたね。

今日は11月にリリースされた Terraform NIFCLOUD Provider での tfstate ファイルのニフクラでの管理方法に関してご紹介します。

はじめに

Terraform NIFCLOUD Provider は、Terraform からニフクラのインフラストラクチャを操作するためのプラグインです。
このプラグインの使い方等に関しては、今回の Advent Calendar 2020 の1日目、15日目の記事がありますので、そちらをご覧ください。

この Terraform ですが、使用すると tfstate ファイルという、管理しているリソースの現在の状態を表すファイルが作成されます。
デフォルトではローカルに tfstate ファイルが生成されますが、AWS を使っている場合は s3 をリモートバックエンドとして用いて、チーム開発のために管理しているところもあります。

本記事では、ニフクラオブジェクトストレージをリモートバックエンドとして用いて tfstate ファイルを管理する方法や、ファイルのバージョニングの方法などをご紹介します。

手順

オブジェクトストレージのバケット作成

オブジェクトストレージのバケット作成は現在、Terraform から行うことはできないので、ニフクラのコントロールパネルから実施します。

使用するニフクラのアカウントでオブジェクトストレージ画面を開きます。
サイドメニューの「エクスプローラー」を選択して、左上にある「バケット作成」をクリックし、バケット名と公開レベルを指定して、バケットを作成します。
今回はバケット名を「terraform-test」、公開レベルを「private」にしています。

バケット作成

tfファイルでbackend設定

tfstate ファイルをオブジェクトストレージにアップロードするために、今回は代替として aws の Provider を使用します。

今回は付替IPアドレスのリソースの tf ファイルを例としたいと思います。
以下のように記載するだけだと、tfstate ファイルはローカルに作成されます。

terraform {
  required_providers {
    nifcloud = {
      source = "nifcloud/nifcloud"
    }
}

provider "nifcloud" {
  access_key = "[アクセスキー]"
  secret_key = "[シークレットアクセスキー]"
  region     = "jp-east-1"
}

resource "nifcloud_elastic_ip" "example" {
  ip_type           = false
  availability_zone = "east-11"
  description       = "memo"
}

上記の内容に、以下のような aws の Provider 設定と s3 の設定(実際にはオブジェクトストレージの設定)を記載することにより、tfstate ファイルがローカルには保存されず、オブジェクトストレージにアップロードされるようになります。
backend の設定を行った際は、 terraform init コマンドから実施し直す必要がある点に注意です。

terraform {
  required_providers {
    nifcloud = {
      source = "nifcloud/nifcloud"
    }
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
  backend "s3" {
    access_key = "[アクセスキー]"
    secret_key = "[シークレットアクセスキー]"
    bucket     = "terraform-test"
    key        = "terraform.tfstate"
    region     = "jp-east-2"
    endpoint   = "https://jp-east-2.storage.api.nifcloud.com"

    skip_region_validation      = true
    skip_credentials_validation = true
  }
}

provider "nifcloud" {
  access_key = "[アクセスキー]"
  secret_key = "[シークレットアクセスキー]"
  region     = "jp-east-1"
}

resource "nifcloud_elastic_ip" "example" {
  ip_type           = false
  availability_zone = "east-11"
  description       = "memo"
}

設定が無事に完了されていると、以下のようにニフクラのオブジェクトストレージ画面のバケット内に、tfstate ファイルが作成されていることを確認できます。

tfstateファイルアップロード完了

tfstateファイルのバージョン管理と切り戻し

この tfstate ファイルですが、ファイル自体が壊れた際に以前のファイルの状態に切り戻ししたいケースがあります。
ニフクラのオブジェクトストレージには、バージョニングを設定できる機能がありますので、この章ではバージョニングの設定とファイルの切り戻し方法に関して説明していきます。

オブジェクトストレージのバージョニング設定

ニフクラのオブジェクトストレージでは バージョニング設定のAPI が提供されています。
また、デフォルトではバージョニングの機能は Off になっています。
この機能はコントロールパネルから利用はできないため、今回は aws cli を用いて、バージョニングを設定します。

基本的なニフクラオブジェクトストレージを aws cli で利用するための設定方法などは以下のブログをご参照ください。

オブジェクトストレージでバージョニングを有効にするコマンドは以下になります。

$ aws --endpoint-url https://jp-east-2.storage.api.nifcloud.com s3api put-bucket-versioning --bucket terraform-test --versioning-configuration Status=Enabled

また、バージョニングが有効になっているかどうかは以下のコマンドで確認ができます。StatusEnabled になっていれば、バージョニングが有効になっています。

$ aws --endpoint-url https://jp-east-2.storage.api.nifcloud.com s3api put-bucket-versioning --bucket terraform-test --versioning-configuration Status=Enabled
{
    "Status": "Enabled"
}

アップロードしているtfstateファイルの切り戻し

オブジェクトストレージにアップロードしているファイルのバージョン情報は、以下のコマンドで取得できます。
IsLatesttrue になっているバージョンが適用されている最新のものになります。

$ aws --endpoint-url https://jp-east-2.storage.api.nifcloud.com s3api list-object-versions --bucket terraform-test
{
    "Versions": [
        {
            "ETag": "\"5f222423127f5d45510dd552a96bbcf9\"",
            "Size": 1700,
            "StorageClass": "STANDARD",
            "Key": "terraform.tfstate",
            "VersionId": "nZCiFBFOSScnrp44ZBd0AL.ENqc6MFW",
            "IsLatest": true,
            "LastModified": "2020-12-18T13:25:46.198Z",
            "Owner": {
                "DisplayName": "XXX00000",
                "ID": "XXX00000"
            }
        },
        {
            "ETag": "\"1990fc615cfb6db8b1331059bb8edc92\"",
            "Size": 928,
            "StorageClass": "STANDARD",
            "Key": "terraform.tfstate",
            "VersionId": "XRcPQ4y.QlFt3vdKDVJQcApGqoeO5Dm",
            "IsLatest": false,
            "LastModified": "2020-12-18T13:22:56.087Z",
            "Owner": {
                "DisplayName": "XXX00000",
                "ID": "XXX00000"
            }
        }
    ]
}

例えば、この最新のバージョンのファイルの状態が壊れていて切り戻しをしたい場合は、最新のバージョンを以下のように削除するコマンドを実施することで、切り戻しが可能です。

$ aws --endpoint-url https://jp-east-2.storage.api.nifcloud.com s3api delete-object --bucket terraform-test --key terraform.tfstate --version-id nZCiFBFOSScnrp44ZBd0AL.ENqc6MFW
{
    "VersionId": "nZCiFBFOSScnrp44ZBd0AL.ENqc6MFW"
}

削除後は、先ほど最新の一つ前のバージョンが適用されるようになります。
このような方法で切り戻しが可能です。

$ aws --endpoint-url https://jp-east-2.storage.api.nifcloud.com s3api list-object-versions --bucket terraform-test
{
    "Versions": [
        {
            "ETag": "\"1990fc615cfb6db8b1331059bb8edc92\"",
            "Size": 928,
            "StorageClass": "STANDARD",
            "Key": "terraform.tfstate",
            "VersionId": "XRcPQ4y.QlFt3vdKDVJQcApGqoeO5Dm",
            "IsLatest": true,
            "LastModified": "2020-12-18T13:22:56.087Z",
            "Owner": {
                "DisplayName": "XXX00000",
                "ID": "XXX00000"
            }
        }
    ]
}

おわりに

今回はニフクラオブジェクトストレージをリモートバックエンドとして用いて tfstate ファイルを管理する方法や、バージョニングの方法などをご紹介しました。どなたかのご参考になれば、幸いです。
また現状だと、複数人で tfstate ファイルを扱う際に便利な state lock 機能がないため、チーム開発等で取り扱う際には注意が必要になります。

Discussion