terraform-provider-ociのエクスポート機能がとても便利

# 1. はじめに

Oracle Cloud Infrastructureの構築自動化にTerraformは欠かせない。しかし初心者にハードルは高いし、いちいちtfファイルを作るのは面倒だ。そんなとき以下のブログでエクスポート機能があることを発見。

**[Create Terraform recipes for OCI in minutes!](https://www.oc-blog.com/2020/02/24/create-terraform-recipes-for-oci-in-minutes/)**

簡単に言えば、現在のコンパートメント情報を抜き出してtfファイルを作成する機能だ。そこで実際に触ってみた。

マニュアルの記述はこちら。
[Discovering Terraform resources in an Oracle Cloud Infrastructure compartment](https://www.terraform.io/docs/providers/oci/guides/resource_discovery.html)

<font color="red">**2020/08/05追記：**Resource Managerにエクスポート機能（Resource Discovery）が搭載されました。そのため管理コンソールからtfファイルをエクスポートできます。詳しくは以下のページを参照。</font>

* [Release Notes: Resource Discovery](https://docs.cloud.oracle.com/en-us/iaas/releasenotes/changes/2c47e9db-fb77-4520-8766-c71c6e02937e/)
* [Create Resource Manager Configuration and State Files by Discovering Existing Compartment Resources](https://blogs.oracle.com/cloud-infrastructure/create-resource-manager-configuration-and-state-files-by-discovering-existing-compartment-resources)

### 1-1. TL;DR

* TerraformはOracle Cloud InfrastructureのInfrastructure as Codeに欠かせない
* [GitHubのサンプル](https://github.com/terraform-providers/terraform-provider-oci/tree/master/examples)から手で作るのは大変
* terraform-provider-oci 3.50からエクスポート機能が使えるようになった

### 1-2. 対象環境/前提条件

* Oracle Cloud Infrastructure
* OCI CLIがセットアップしてあること
* Linux/Mac OS（これ以外のOSでも動くハズだがテストしていない）

# 2. 事前準備

事前準備では、OCI CLIが利用可能なことを確認し、最新の**terraform-provider-oci**をインストールする。

### 2-1. OCI CLIの動作確認

OCI CLIがセットアップ済みであることを確認する。次のように表示されればOKだ。表示されないときは下記リンクを参考にセットアップすること。

```shell-session
$ oci os ns get
{
  "data": "nrvcrx1bzia3"
}
```

* [7系LinuxにPython3＋OCI CLIをインストールする&2020/2/13以降はOCI CLIがサポートするPythonのバージョンが3.5+になる件](https://qiita.com/yamada-hakase/items/2b4f33710d8ee41ab420)

### 2-2. terraform-provider-ociのインストール

1. terraform-provider-ociを入手するには以下の方法がある。今回は、わかりやすいWebページからダウンロードする方法を採用する。

* Webページからダウンロード
* `terraform init`を実行（.terraform/plugins配下にダウンロードされる）
* yumでインストール



2.https://releases.hashicorp.com/terraform-provider-oci/ にアクセスし、最新バージョンをクリックする。
![terraform-oci01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/e150b200-574f-1049-c6ab-b1a3dabf209a.png)

3.プラットフォームごとのモジュールが公開されている。今回はOracle Linux 7を使用するので`linux_amd64`をダウンロードする。Mac OSでは`darwin_amd64`をダウンロードする。

![terraform-oci02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/42e89bc3-a4c5-76dd-a20e-f7bd35626ebf.png)

4.ダウンロードしたファイルを解凍する。

```shell-session
$ unzip terraform-provider-oci_3.67.0_linux_amd64.zip
Archive:  terraform-provider-oci_3.67.0_linux_amd64.zip
  inflating: terraform-provider-oci_v3.67.0_x4
```

5.`/usr/local/bin`にコピーする。

```shell-session
sudo cp terraform-provider-oci_v3.67.0_x4 /usr/local/bin/terraform-provider-oci
```

6.確認のためオプション無しで実行する。次のように表示されれば準備は完了だ。

```shell-session
$ terraform-provider-oci
2020/03/25 01:51:31 [INFO] terraform-provider-oci 3.67.0
2020/03/25 01:51:31 Executable runs in Terraform plugin mode by default. For additional usage options, please run with the '-help' flag.
This binary is a plugin. These are not meant to be executed directly.
Please execute the program that consumes these plugins, which will
load any plugins automatically
```

# 2. tfファイルをエクスポートする

1. エクスポート時に指定するのは「コンパートメント名」と「出力先ディレクトリ」だ。

```shell-session
terraform-provider-oci -command=export -compartment_name=＜コンパートメント名＞ -output_path=＜出力先ディレクトリ＞
```

2.実行結果は次のとおり。出力が止まったままになり不安になるが、最低5分くらいは待ってほしい。最後に「COMPLETED」と表示されれば終了だ。

```shell-session
$ terraform-provider-oci -command=export -compartment_name=work01 -output_path=./myrecipe
2020/03/25 01:54:43 [INFO] terraform-provider-oci 3.67.0
2020/03/25 01:54:43 [INFO] resolved compartment name 'work01' to compartment id 'ocid1.compartment.oc1..aaaaaaaaw5syvmuwyecuglndoy6anakd57l5yg6tbrysgfc3hvsxbz4evrmq'
2020/03/25 01:54:43 Running export command
2020/03/25 01:54:43 [INFO] resource discovery: visiting oci_identity_compartment.export
2020/03/25 01:54:43 [INFO] discovering resources with data source 'oci_identity_availability_domains'
2020/03/25 01:54:43 [INFO] resource discovery: visiting oci_identity_availability_domain.export_VPoc-AP-TOKYO-1-AD-1
2020/03/25 01:54:43 [INFO] discovering resources with data source 'oci_core_boot_volumes'
2020/03/25 01:54:43 [INFO] adding datasource query attribute 'availability_domain' from parent attribute 'name'
2020/03/25 01:54:43 [INFO] resource discovery: visiting oci_identity_compartment.export
2020/03/25 01:54:43 [INFO] discovering resources with data source 'oci_core_cpes'
★中略★
2020/03/25 01:56:53 [INFO] ===> Generating resource 'oci_identity_tag_default.export_tag_default_2'
Found 1 'availability_domain' resources. Generated under './myrecipe/availability_domain.tf'
Found 12 'core' resources. Generated under './myrecipe/core.tf'
Found 0 'database' resources. Generated under './myrecipe/database.tf'
Found 0 'load_balancer' resources. Generated under './myrecipe/load_balancer.tf'
Found 2 'object_storage' resources. Generated under './myrecipe/object_storage.tf'
Found 5 'tagging' resources. Generated under './myrecipe/tagging.tf'

=== COMPLETED ===
```

3.出力されたファイルは次のとおり。サイズが63bytesのものは、コメントだけで中身はない。core.tfには、ネットワークとComputeが混在しているので、実際には分割して運用した方がいいだろう。

```shell-session
$ ls -l myrecipe/
合計 40
-rw-rw-r--. 1 opc opc   201  3月 25 01:56 availability_domain.tf
-rw-rw-r--. 1 opc opc 13907  3月 25 01:56 core.tf
-rw-rw-r--. 1 opc opc    63  3月 25 01:56 database.tf
-rw-rw-r--. 1 opc opc    63  3月 25 01:56 load_balancer.tf
-rw-rw-r--. 1 opc opc   809  3月 25 01:56 object_storage.tf
-rw-rw-r--. 1 opc opc  1584  3月 25 01:56 tagging.tf
-rw-rw-r--. 1 opc opc   170  3月 25 01:56 vars.tf
```

4.上記以外のオプションやIAM関連などの出力方法はマニュアルを読んでほしい。

* [Discovering Terraform resources in an Oracle Cloud Infrastructure compartment](https://www.terraform.io/docs/providers/oci/guides/resource_discovery.html)

# 3. tfファイルの活用方法

生成したtfファイルは、そのままTerraformで使ってもいいし、Resource Managerを使う方法もある。

Resource Managerで使用する方法は、冒頭で紹介したブログからリンクしている[YouTube: Create Terraform recipes for OCI in minutes!](https://www.youtube.com/watch?time_continue=349&v=znWXASOKmNQ&feature=emb_logo)の3:47付近で解説されている。


```shell-session:zipで圧縮してResourceManagerのStackにアップロード
$ cd myrecipe
$ zip myrecipe.zip *
```