OCI上のVMリソース構成情報をTerraformでローカルPCに保存・クラウドに復元してみる 初期設定

# OCI上のVMリソース構成情報をTerraformでローカルPCに保存・クラウドに復元してみる 初期設定

## はじめに 
Windows 11 上の **WSL**（[**Windows Subsystem for Linux**](https://learn.microsoft.com/en-us/windows/wsl/about)）上で動作する [**Oracle Linux**](https://apps.microsoft.com/detail/9mxq65hlmc27?hl=en-us&gl=US) に [**Terraform**](https://developer.hashicorp.com/terraform/install)をインストールしてみました。

目的は、OCIでのリソース構成情報を管理し、システム全体の構築または再構築、削除です。

自分で作ったクラウド上のVMやネットワーク、ストレージなど様々なリソースの構成を保存しておき、必要になったときは復元したい場合などがあるのではないでしょうか。

テストや検証用に同じような環境を作成したい場合、毎回手で一から環境を作成していると時間もかかりますし、間違ったり、思わぬところで躓く事もありますね:laughing:

このような構成管理を行う仕組みは是非使いこなせるようになりたいものです。

今回も複数記事の構成に分けて進めていきます。
この記事では terraform の設定と初期化までを行います。

## terraform利用前提となる環境

terraform をインストールする環境は

**OS:　Windows 11 + WSL2 + Oracle Linux 9**

また、接続先のクラウドは

**接続先クラウドサービス： OCI** 

です。

です。[こちらの記事](https://qiita.com/Assemble_EX-80/items/5d941b67a73703b20f9c#windows-10%E3%81%BE%E3%81%9F%E3%81%AF11-%E3%81%A7%E3%81%AE-oracle-linux-9-%E3%81%A8macos%E3%81%8B%E3%82%89%E3%81%AEssh)でも紹介しているように、 Windows 10 や 11 の場合は [WSL2](https://learn.microsoft.com/ja-jp/windows/wsl/install) 上で動く[Oracle Linux](https://apps.microsoft.com/detail/9mxq65hlmc27?hl=en-us&gl=US) をインストールして使うのがお勧めです。

リモートのVMでも手元のPCでも同じLinuxディストリビューションで統一できるのはメリット有ですしレスポンスもよいので使い勝手が良いです。未だの方は是非。


<!--
https://oracle-japan.github.io/ocitutorials/intermediates/terraform/
-->

## **Terraformの設定**
**Terraform: OCI Terraformの設定**
<!--  https://docs.oracle.com/ja-jp/iaas/developer-tutorials/tutorials/tf-provider/01-summary.htm
-->
https://docs.oracle.com/ja-jp/iaas/Content/dev/terraform/tutorials.htm

辺りを一通り眺めてみます。

- Terraformをインストール
- **[Terraformプロバイダ](https://registry.terraform.io/browse/providers)** をインストール

の必要がありそう。**[Terraformプロバイダ](https://registry.terraform.io/browse/providers)** って何だろうね？？
Oracle Cloud Infrastructure もリストにあるみたい。

どうやらプロバイダを設定するといろいろなクラウドベンダ上にあるリソースを管理できるっぽい:smiley:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/0bc6922c-4568-8898-da5d-489feb6ad907.png)



## Terraformインストール
上記マニュアルページに "1.準備" をそのままやってみましょう。
>[1. 準備](
https://docs.oracle.com/ja-jp/iaas/developer-tutorials/tutorials/tf-provider/01-summary.htm#prepare
) 
https://docs.oracle.com/ja-jp/iaas/developer-tutorials/tutorials/tf-provider/01-summary.htm#prepare

### Terraform インストールの有無チェック
>+Terraformのインストール
>1.使用している環境で、Terraformのバージョンを確認します。

とありますので、 terraform -v やってみます。
~~~
$ terraform -v
-bash: terraform: command not found
~~~

Terraformさん、まだインストールされてない😢


### Terraform ダウンロード
>2.ブラウザから、Terraformリリースに移動します。

と書いてありますので 
https://releases.hashicorp.com/terraform/
辺りに行き、最新バージョンを見つけましょう。

試した時点では 1.7.5 が最新らしい。
PCのWSL上にインストールなのでamd64を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/6c014dc4-f8df-b9e6-1c47-046da19c3f9e.png)

~~~
$ mkdir temp
$ cd temp
$ wget https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip
~~~

### unzipコマンドインストール
unzip コマンドがないときは upnzip もあらかじめインストールしましょう。
~~~
$ unzip
-bash: unzip: command not found

$ sudo dnf install unzip
Oracle Linux 9 BaseOS Latest  (x86_64)                                    2.6 MB/s |  22 MB     00:08
Oracle Linux 9 Application Stream Packages (x86_64)                       596 kB/s |  30 MB     00:50
Last metadata expiration check: 0:00:02 ago on xxx 20xx 10:06:34 xx JST.
Dependencies resolved.
==========================================================================================================
 Package            Architecture        Version                      Repository                      Size
==========================================================================================================
Installing:
 unzip              x86_64              6.0-56.0.1.el9               ol9_baseos_latest              195 k

Transaction Summary
==========================================================================================================
Install  1 Package

Total download size: 195 k
Installed size: 392 k
Is this ok [y/N]: y
~~~

### Terraform を unzip
ダウンロードした terraform unzip を unzip 

~~~
[t@sjsur ~]$ unzip terraform_1.7.5_linux_amd64.zip
Archive:  terraform_1.7.5_linux_amd64.zip
  inflating: terraform

$ ls
terraform  terraform_1.7.5_linux_amd64.zip
~~~

### Terraform をコマンドとして動作するよう /usr/local/bin に移動
>8.解凍したフォルダを、インストールするサード・パーティ・アプリケーションのバイナリを含むフォルダに移動します。たとえば、Oracle Linuxの場合、サポートされていないフォルダを/usr/local/binに移動します。

とあるので、そのままコピペして実行します。

~~~
$ sudo mv terraform /usr/local/bin
~~~

### インストール後の確認
改めてバージョンチェック。
はい、Terrraformがインストールできました。
~~~
$ terraform -v
Terraform v1.7.5
on linux_amd64
~~~

## APIサインイン用RSAキーの作成
Oracle Cloud InfrastructureアカウントへのAPIサインイン用のRSAキーを作成します。
このキーを使って認証を取り、terraform から OCI上での操作を行います。

### ホームディレクトリに .oci フォルダを作成

>``mkdir \<your-home-directory\>/.oci``

と書いてあるので **``$ mkdir ~/.oci``** で .oci フォルダを作ります。**``$ mkdir ~``** 等で **``.oci``** フォルダ（ディレクトリ）の存在を確認します。
~~~
$ mkdir ~/.oci
~~~
~~~
$ ls -a ~
.   .bash_history  .bash_profile  .oci  temp          .viminfo
..  .bash_logout   .bashrc        .ssh  .terraform.d  .wget-hsts
~~~

### キー生成

> ``openssl genrsa -out <your-home-directory>/.oci/<your-rsa-key-name>.pem 2048``

とコマンドをたたいて、キー（このコマンドで生成されるのは秘密キー）を生成するそうですので、例えば以下のようなコマンド実行をして、キーを生成、キーが作られたことを確認します。
~~~
$ openssl genrsa -out ~/.oci/my-rsa-key-is-here.pem 2048
~~~
~~~
$ ls .oci
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/f713a3c8-e1ca-5846-186c-2ccdc2051bc4.png)


### 権限変更

>``chmod 600 <your-home-directory>/.oci/<your-rsa-key-name>.pem``

~~~
$ chmod 600 ~/.oci/my-rsa-key-is-here.pem
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/050eccd8-fb91-0c35-a7f4-ecfcfb3946a5.png)

### 公開キー生成

先程作成した秘密鍵から公開鍵を作ります。

コマンドシンタックスは

>``openssl rsa -pubout -in <your-home-directory>/.oci/<your-rsa-key-name>.pem -out $HOME/.oci/<your-rsa-key-name>_public.pem``

このようになっているので、

秘密鍵： my-rsa-key-is-here.pem
公開鍵： my-rsa-key-is-here_public.pem

とする場合は

``$ openssl rsa -pubout -in ~/.oci/my-rsa-key-is-here.pem -out ~/.oci/my-rsa-key-is-here_public.pem``

としてみます。

~~~
$ openssl rsa -pubout -in ~/.oci/my-rsa-key-is-here.pem -out ~/.oci/my-rsa-key-is-here_public.pem
writing RSA key
~~~

ls でファイル確認してみましょう。

~~~
ls -al .oci
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/536891ea-a322-b2d0-6ff4-0207b6fc8992.png)

ちゃんとファイルはできていそうです。

## RSAキーの登録

次は、生成したRSAの公開鍵をOCIに登録します。

ユーザのAPIキーとしてこのRSA公開鍵を登録することによりリモートからterraformでの操作が可能となります。

OCI コンソールの右上の人型のアイコンをクリック **「ユーザー設定」** または **「自分のプロファイル」** を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/c078766d-6071-654c-ada0-947baf0293f5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/fff9654d-5d60-39ee-efef-6a4a1f841cb4.png)

**「APIキー」** を選択、**「APIキーの追加」** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/ef026bff-d0ac-0535-a74e-829c526a3d24.png)


APIキーの追加ダイアログでは **「公開キー・ファイルの選択」** のチェックボックスを選択します。

次に、ファイルをドロップするか1つを選択の **1つを選択** リンクをクリックし、APIキーとして、作成したRSAキーを登録します。

 **※ ここで登録するのは、公開鍵（パブリックキー）です。間違って秘密鍵を登録しないようにしましょう。**
 
この例では先程作成した **my-rsa-key-is-here_public.pem** ファイルを登録しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/8f9fd103-10e1-8adc-b360-9cefb980b781.png)

WLS2 の Oracle Linux 9では、WindowsエクスプローラーでLinux側のホームディレクトリを見ることができますのでRSAキー指定しやすいかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/6599ab8c-df3b-c703-5bc6-a97cec86004e.png)


### RSAキー登録完了とフィンガープリント確認

RSAキーが登録出来たらOCIコンソール上に**フィンガープリント**が表示されます。

この**フィンガープリント**は後ほど、認証のためにプロバイダファイルに記述が必要になる情報ですので、**メモ帳などに控えて**おきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/b46d3931-2dbf-0857-79fe-21236a15cae1.png)







このRSAキーの生成と登録の一連の動作に関してのマニュアルは以下のリンクにありますので参考にしてください。

キーの登録がうまくいかなかったり、terraform apply 等の実行時に authentication エラーとなる場合は、

- キーのパスやファイル名が間違っている
- フィンガープリントが正しくない
- キー生成の時にオプションや引数が間違ったままキーが生成されている

などの可能性があります。

もう一度キーを生成しなおしたり、登録しなおしたり、パスやファイル名の確認をしてみましょう。

**参考ドキュメント**
**RSAキーの生成**
https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/apiigningkey.htm#two

**Oracle® Linux証明書と公開キー・インフラストラクチャの管理**
第2章 Oracle LinuxでのOpenSSLの使用
https://docs.oracle.com/cd/F22978_01/certmanage/openssl.html#%E7%AC%AC2%E7%AB%A0-Oracle-Linux%E3%81%A7%E3%81%AEOpenSSL%E3%81%AE%E4%BD%BF%E7%94%A8

# ポリシーの設定

ポリシーの設定はユーザが管理者グループに属している場合は不要です。
念のため下記に記しておきます。

~~~ 
 allow group <the-group-your-username-belongs> to read all-resources in tenancy
~~~

# プロバイダファイルの作成

terraformでOCIに接続するには先ほど生成したRSAキー情報の他にもいくつかの情報が必要になります。認証に必要な情報は **provider.tf** というファイル **（プロバイダファイル）** にまとめて記述しておくと便利です。

**profile.tf** を作成するために必要な情報を集めます。

## 必要な情報の収集

terraform をリモートから利用するには下記の情報を用意する必要があります。

- **テナンシOCID**
- **ユーザ OCID**
- **プライベートキーのパス**
- **フィンガープリント**
- **リージョン**


  
OCID はOCIの各リソースに紐づく数値と記号の並び（ID）です。
プライベートキーのパスは、先ほど作成したSSLローカルマシン上のプライベートキー（秘密鍵）のパスです。

### テナンシOCID取得
上部のナビゲーション・バーで、「プロファイル」メニュー（右上の人の形のアイコン）をクリックし、テナンシ:　に移動してテナンシ情報TABにある OCIDをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/b638a2fe-04fb-23b3-0aa6-431a4abd26d4.png)

テナンシ情報TABにある OCIDの右隣りの「コピー」を押すとクリップボードにOCIDがコピーされペースト可能になります。
もしくは「表示」を押してOCIDをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/17c94ce9-7c49-8b7c-bc0a-e2ff8dcc1a08.png)

provider.tf に記述が必要となりますので
コピーした OCID はメモ帳などに一旦ペースト等しておいてください。
これがテナンシOCIDとなります。

### ユーザOCID取得

「プロファイル」メニューから、「ユーザ設定」もしくは「自分のプロファイル」をクリック、に移動してOCIDをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/7bef9f1d-7a16-1c84-5049-8643787b167b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/9de43d8f-f7be-99c5-1367-91f94254e813.png)

ユーザーの詳細が表示されたら、OCID を探し、「コピー」を押してユーザOCIDをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/6b28f954-ab2a-295f-baf3-73852df82561.png)

provider.tf に記述が必要となりますので
コピーした OCID はメモ帳などに一旦ペースト等しておいてください。
これがユーザOCIDとなります。

### プライベートキーのパス取得

先程 [RSAキーの作成](https://qiita.com/drafts#api%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E7%94%A8rsa%E3%82%AD%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90)にて作成したキー（秘密鍵）のフルパスを記述する必要があります。

ユーザ名が your_username とすると、パスは

~~~
/home/your_username/.oci/my-rsa-key-is-here.pem
~~~

などという形になります。

### フィンガープリント取得

これは先ほど登録したRSAキー（APIキー）のフィンガープリントです。

例えばこのような形の16進数の並びになります。


~~~
42:54:a9:7d:43:06:3c:da:c7:3e:48:2e:ff:b1:0d:44
~~~

**※ このままコピー・ペーストしても動きません。ご自分で取得されたフィンガープリントをご利用ください。**

### リージョン情報取得

上部のナビゲーション・バーをみればすぐにリージョンがわかります。
**[リージョンおよび可用性ドメイン](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/regions.htm)** の表から、**リージョン識別子（region-identifier）** を見つけてメモします。

東京は **ap-tokyo-1**
大阪は **ap-osaka-1**

ですね。ここでは　東京は **ap-tokyo-1** を利用します。

全ての情報が揃ったら、次は provider.tf の作成を行います。

# スクリプトの作成

##  provider.tfファイル作成
OCIの自分のテナントに接続するために provider.tf ファイルを用意します。

terraform はカレントディレクトリの .tf ファイルを読みに行きますので .tf の拡張子であれば名前はどのようなものでも構いませんが便宜上 provider.tf というファイルにプロバイダ接続情報を記述することとします。

先程取得した情報


- **テナンシOCID**
- **ユーザ OCID**
- **プライベートキーのパス**
- **フィンガープリント**
- **リージョン**

をこのような形でテキストファイルにまとめます。

~~~
  tenancy_ocid = "ocid1.tenancy.oc1..aaaaaaaa3mb7wrcy2xxxx3jxxxoaxx5tkguca"
  user_ocid = "ocid1.user.oc1..aaaaaa6bzv2ghv25inunzaym35ckxxxxxwhxxybxxr2e6a"
  private_key_path = "/home/your_username/.oci/my-rsa-key-is-here.pem"
  fingerprint = "42:54:a9:7d:43:06:3c:da:c7:3e:48:2e:ff:b1:0d:44"
  region = "ap-tokyo-1"
~~~

このテキストファイルからprovider.tf ファイルを作ります。
テキストファイルを

~~~
provider "oci" { 

}
~~~

でくくるだけですね。
下記に provider.tf ファイルの記述例を示します。

### **provider.tf** の例
~~~
provider "oci" {
  tenancy_ocid = "ocid1.tenancy.oc1..aaaaaaaa3mb7wrcy2xxxx3jxxxoaxx5tkguca"
  user_ocid = "ocid1.user.oc1..aaaaaa6bzv2ghv25inunzaym35ckxxxxxwhxxybxxr2e6a"
  private_key_path = "/home/your_username/.oci/my-rsa-key-is-here.pem"
  fingerprint = "42:54:a9:7d:43:06:3c:da:c7:3e:48:2e:ff:b1:0d:44"
  region = "ap-tokyo-1"
}
~~~

# Terraform 初期化

tf-provider というディレクトリ内で terraform を動作させてみます。

### provider.tf をカレントディレクトリに配置する
tf-provider という名前でディレクトリを作り、その配下に先程作成した provider.tf を用意します。

>mkdir ~/tf-provider
>cp ./provider.tf ~/tf-provider
>cd ~/tf-provider
>ls

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/c5183d25-8604-70f1-49d0-22eab51b7993.png)

provider.tf を確認しました。

### terraform init 実行

provider.tf があるディレクトリで

~~~
terraform init
~~~

を実行します。

### 初期化完了確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/3a9329cf-a5c7-221e-e3e4-912699ef9251.png)

正しくプロバイダ情報が設定されており、OCI用のプロバイダプラグインがインストールされ初期化が正常に完了すると

**Terraform has been successfully initialized!**

と表示され初期化が完了します。

ここまで完了すればおおよそ準備完了となります。

# 次回の記事 

**OCI上のVMリソース構成情報をTerraformでローカルPCに保存・クラウドに復元してみる  その２ 構成の保存**

に乞うご期待

<!---

https://docs.oracle.com/ja-jp/iaas/developer-tutorials/tutorials/tf-provider/01-summary.htm#create-scripts

>mkdir tf-provider
>cd tf-provider

Oralce Linux 9 on Windows 11

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737461/6ac9ea68-0cf1-bbfb-bd18-c1e99f725a44.png)

--->