OCI上のVMリソース構成情報をTerraformでローカルPCに保存・クラウドに復元してみる その1 初期設定
はじめに
Windows 11 上の WSL(Windows Subsystem for Linux)上で動作する Oracle Linux に Terraformをインストールしてみました。
目的は、OCIでのリソース構成情報を管理し、システム全体の構築または再構築、削除です。
自分で作ったクラウド上のVMやネットワーク、ストレージなど様々なリソースの構成を保存しておき、必要になったときは復元したい場合などがあるのではないでしょうか。
テストや検証用に同じような環境を作成したい場合、毎回手で一から環境を作成していると時間もかかりますし、間違ったり、思わぬところで躓く事もありますね
このような構成管理を行う仕組みは是非使いこなせるようになりたいものです。
今回も複数記事の構成に分けて進めていきます。
この記事では terraform の設定と初期化までを行います。
terraform利用前提となる環境
terraform をインストールする環境は
OS: Windows 11 + WSL2 + Oracle Linux 9
また、接続先のクラウドは
接続先クラウドサービス: OCI
です。
です。こちらの記事でも紹介しているように、 Windows 10 や 11 の場合は WSL2 上で動くOracle Linux をインストールして使うのがお勧めです。
リモートのVMでも手元のPCでも同じLinuxディストリビューションで統一できるのはメリット有ですしレスポンスもよいので使い勝手が良いです。未だの方は是非。
Terraformの設定
Terraform: OCI Terraformの設定
https://docs.oracle.com/ja-jp/iaas/developer-tutorials/tutorials/tf-provider/01-summary.htm
辺りを一通り眺めてみます。
- Terraformをインストール
- Terraformプロバイダ をインストール
の必要がありそう。Terraformプロバイダ って何だろうね??
Oracle Cloud Infrastructure もリストにあるみたい。
どうやらプロバイダを設定するといろいろなクラウドベンダ上にあるリソースを管理できるっぽい
Terraformインストール
上記マニュアルページに "1.準備" をそのままやってみましょう。
1. 準備
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を選びます。
$ 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
権限変更
chmod 600 <your-home-directory>/.oci/<your-rsa-key-name>.pem
$ chmod 600 ~/.oci/my-rsa-key-is-here.pem
公開キー生成
先程作成した秘密鍵から公開鍵を作ります。
コマンドシンタックスは
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
ちゃんとファイルはできていそうです。
RSAキーの登録
次は、生成したRSAの公開鍵をOCIに登録します。
ユーザのAPIキーとしてこのRSA公開鍵を登録することによりリモートからterraformでの操作が可能となります。
OCI コンソールの右上の人型のアイコンをクリック 「ユーザー設定」 または 「自分のプロファイル」 を選びます。
「APIキー」 を選択、「APIキーの追加」 をクリックします。
APIキーの追加ダイアログでは 「公開キー・ファイルの選択」 のチェックボックスを選択します。
次に、ファイルをドロップするか1つを選択の 1つを選択 リンクをクリックし、APIキーとして、作成したRSAキーを登録します。
※ ここで登録するのは、公開鍵(パブリックキー)です。間違って秘密鍵を登録しないようにしましょう。
この例では先程作成した my-rsa-key-is-here_public.pem ファイルを登録しています。
WLS2 の Oracle Linux 9では、WindowsエクスプローラーでLinux側のホームディレクトリを見ることができますのでRSAキー指定しやすいかと思います。
RSAキー登録完了とフィンガープリント確認
RSAキーが登録出来たらOCIコンソール上にフィンガープリントが表示されます。
このフィンガープリントは後ほど、認証のためにプロバイダファイルに記述が必要になる情報ですので、メモ帳などに控えておきましょう。
この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をコピーします。
テナンシ情報TABにある OCIDの右隣りの「コピー」を押すとクリップボードにOCIDがコピーされペースト可能になります。
もしくは「表示」を押してOCIDをコピーします。
provider.tf に記述が必要となりますので
コピーした OCID はメモ帳などに一旦ペースト等しておいてください。
これがテナンシOCIDとなります。
ユーザOCID取得
「プロファイル」メニューから、「ユーザ設定」もしくは「自分のプロファイル」をクリック、に移動してOCIDをコピーします。
ユーザーの詳細が表示されたら、OCID を探し、「コピー」を押してユーザOCIDをコピーします。
provider.tf に記述が必要となりますので
コピーした OCID はメモ帳などに一旦ペースト等しておいてください。
これがユーザOCIDとなります。
プライベートキーのパス取得
先程 RSAキーの作成にて作成したキー(秘密鍵)のフルパスを記述する必要があります。
ユーザ名が 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
※ このままコピー・ペーストしても動きません。ご自分で取得されたフィンガープリントをご利用ください。
リージョン情報取得
上部のナビゲーション・バーをみればすぐにリージョンがわかります。
リージョンおよび可用性ドメイン の表から、リージョン識別子(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
provider.tf を確認しました。
terraform init 実行
provider.tf があるディレクトリで
terraform init
を実行します。
初期化完了確認
正しくプロバイダ情報が設定されており、OCI用のプロバイダプラグインがインストールされ初期化が正常に完了すると
Terraform has been successfully initialized!
と表示され初期化が完了します。
ここまで完了すればおおよそ準備完了となります。
次回の記事
OCI上のVMリソース構成情報をTerraformでローカルPCに保存・クラウドに復元してみる その2 構成の保存
に乞うご期待