[HACK]さくらのクラウドのリソースマネージャーに別マシンで作ったtfstateファイルを取り込む

## はじめに

さくらのクラウドの[リソースマネージャー](https://manual.sakura.ad.jp/cloud/resource-manager/about.html)便利ですよね。

tfファイルという定義ファイルを用意しておけば複数のリソースを一括管理できるというもので、内部的に[Terraform](https://terraform.io)と[Terraform for さくらのクラウド](https://github.com/sacloud/terraform-provider-sakuracloud)が利用されています。

リソースマネージャーでは公式には`terraform import`や別マシンで作ったtfstateファイルの取り込みをサポートしていないですが、実はちょっとしたHACKを利用することで取り込み可能です。

**裏技的なやり方なので実際に試す際は諸々ご注意ください:bow:**

## リソースマネージャーにはtfstate編集機能がある

tfstateファイルとはTerraformの管理下にあるリソースの情報を格納したデータベース(実態はJSON)で、tfファイルに加えこのファイルを(手動で作成するなどで)準備すれば既存のリソースをterraform管理下に置けます。

そしてリソースマネージャーにはtfstateファイルの編集機能があったりします。
この機能を利用することで、`terraform import`相当の処理や別マシンで作ったtfstateファイルの取り込みが可能となる = リソースマネージャーの管理下に置けるようになっています。

以下に手元のマシンで作成したtfstateファイルをリソースマネージャーに取り込む手順をご紹介します。

## リソースマネージャーにtfstateファイルを取り込む手順

### <注意点>

この方法はTerraformのドキュメント化されていない挙動(`terraform refresh`でtfstateファイルが作成される)ことに依存しています。
Terraformの将来のバージョンでは利用できなくなる可能性があります。

なお、当記事ではterraform v0.11で動作確認しています。

また、当然ながらリソースマネージャーで利用できないterraformの機能(remote-execやmoduleなど)を利用している場合もダメです。

Terraformとリソースマネージャーの利用できる機能の違いについては以下のページを参照ください。

[さくらのクラウド マニュアル: リソースマネージャーと Terraform の違い](https://manual.sakura.ad.jp/cloud/resource-manager/terraform.html)

### 準備) Terraformとプラグインのバージョンを揃える

あらかじめ手元のマシン上のTerraformとTerraformプラグイン(Terraform for さくらのクラウド)のバージョンをリソースマネージャーと揃えておきます。

リソースマネージャーで利用されているバージョンはコントロールパネル上のリソースマネージャー追加画面で確認できます。

![resource_manager_version.png](https://qiita-image-store.s3.amazonaws.com/0/20668/539a66cc-509c-fbc1-3fce-4b4ebbff1767.png)

バージョンを揃えたあとは`terraform refresh`を実行してtfstateファイルを最新の状態にしておきましょう。

### 手順1) リソースマネージャーの追加

まずはリソースマネージャーの追加を行います。
コントロールパネルからリソースマネージャーの追加を行ってください。

### 手順2) リソースマネージャー上でtfファイルを編集

手元のマシン上のtfファイルをリソースマネージャーに登録します。
もしtfファイルを複数に分割していた場合は一つにまとめることになります。

画面上部の「tffileを変更」ボタンから編集画面を開きtfファイルの内容を記載してください。

![02_edit.png](https://qiita-image-store.s3.amazonaws.com/0/20668/516208f4-e096-8ee3-dba1-dd8eca69350d.png)

### 手順3) 「整合性確認」コマンドを実行

tfファイルを作成したので、手元のマシンのtfstateファイルをリソースマネージャーに登録すればOKなのですが、この段階ではまだリソースマネージャー上にtfstateファイルが存在しないため編集しようとしても以下のようなエラーとなります。

![03_error.png](https://qiita-image-store.s3.amazonaws.com/0/20668/1fedcf95-33c5-1b4f-2a44-8bca08657650.png)

そこでtfstateファイルを作成するために、リソースマネージャー上で整合性確認コマンドを実行します。
これは`terraform refresh`に相当する機能です。

`terraform refresh`コマンドは本来tfstateファイルを最新の状態にするコマンドですが、tfstateファイルがない状態で実行すると空のtfstateファイルを作成してくれます。
今回はこの作用を利用します。

![03_refresh.png](https://qiita-image-store.s3.amazonaws.com/0/20668/2ff4ee4e-4601-7a1f-08fc-9ec81bc333bc.png)

これで空のtfstateファイルが作成されます。
コンパネ上のtfstateタブで内容が確認できます。

### 手順4) tfstateファイルを編集

続いて手元のマシンのtfstateファイルの内容をリソースマネージャーに登録します。
「tfstateを変更」ボタンから編集画面に行けますのでそこでtfstateファイルの内容をコピペします。

![04_edit.png](https://qiita-image-store.s3.amazonaws.com/0/20668/43fe229a-9bd9-ae76-e60a-c04f44f32312.png)

これで取り込み完了です。

### 確認) 「計画/反映」コマンドの実行

取り込みが正常に完了していると「計画/反映」コマンドで差分が出ない状態となるはずです。
実際に実行して以下のような表示となることを確認しておきましょう。

![05_confirm.png](https://qiita-image-store.s3.amazonaws.com/0/20668/7074b103-d3a1-0aa8-5f80-4b5917aeb7ca.png)

## まとめ

まとめると以下の手順でtfstateの取り込みが可能です。

- 1) terraformとプラグインのバージョンを揃える
- 2) リソースマネージャーを追加する
- 3) tfファイルをコピペ
- 4) 整合性確認コマンドで空のtfstateファイル作成
- 5) tfstateファイルをコピペ

以上です。Enyoy!!