TerraformでOCIのインスタンスを確保する

Ubuntu(20.04)より操作。

なぜ Oracle なのか

VPS を使うときに GCP や AWS、さくらクラウドなど様々なものがあるが、なるべくコストをかけずに済ませたいと考えたときに Free tier という存在がある。
GCP はサービスにもよるが一年間、AWS もサービスによるが一年間というイメージだ。
その中で Oracle が運営している Oracle Cloud Infrastructure は、
・1/8 OCPU と 1GB メモリをそれぞれ備えた 2 つの AMD ベースのコンピュート VM
・1 つの VM または最大 4 つの VM として使用可能な 4 つの Arm ベースの Ampere A1 コアと 24GB のメモリ
を Free tier として提供している。

あまりにも豊富な Free tier のため、使ってみたいと思うのはいうまでもない。
私もpleromaや身内で使っている Minecraft サーバーを下の1つのVMまたは最大4つのVMとして使用可能な4つのArmベースのAmpere A1コアと24GBのメモリで運用している。
今のところ使用する上でのストレスはほぼ感じていない。がこの OCI やはり他が提供している Free tier より提供しているマシンが強いため、人気がとてもある。
そのため Tokyo リージョンはほぼほぼ取れない。(Osaka リージョンは楽に取れたと夏頃風の噂で聞いたが)
管理画面から確保できるまで粘るのもいいが、Terraform という自動でインスタンスを確保してくれる便利なツールがある。今回はこれを使う。

1.Terraform のインストール

Terraform をインストールする

terminal
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=$(dpkg --print-architecture)] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt update
sudo apt install terraform

terraform -vで terraform が入ってることが確認できたら ok

2.RSA キーを作成する

<your-rsa-key-name>は自分の好きな名前に変更してほしい

.oci ディレクトリを作成する。

terminal
mkdir $HOME/.oci

次に秘密鍵を生成する

terminal
openssl genrsa -out $HOME/.oci/<your-rsa-key-name>.pem 2048

権限を変更する、自分だけが読み書きできるようにする

terminal
chmod 600 $HOME/.oci/<your-rsa-key-name>.pem

公開鍵を生成する

terminal
openssl rsa -pubout -in $HOME/.oci/<your-rsa-key-name>.pem -out $HOME/.oci/<your-rsa-key-name>\_public.pem

公開鍵をコピーする

terminal
cat $HOME/.oci/<your-rsa-key-name>\_public.pem

3.公開鍵をユーザーアカウントに追加する

ユーザーアバターをクリックし、

ユーザー設定をクリックする。

リソースから API キーをクリックする

API キーの追加をクリックし

公開キーの貼り付けを選択し、BEGIN PUBLIC KEYからEND PUBLIC KEYまでを入力欄に貼り付け、追加をクリック。

4.必要な情報を収集する

Terraform に必要な情報を収集する。

  • tenancy-ocid:
    • ユーザーアバターから、Tenancy:your-tenancy をクリック
    • OCID の横にあるコピーをクリックし、メモ帳にコピーする
  • user-ocid:
    • ユーザーアバターから、ユーザー設定を選択
    • OCID の横にあるコピーをクリックし、メモ帳にコピーする
  • finger:
    • ユーザーアバターから、ユーザー設定に移動
    • リソース内にある API キーをクリックする
    • 登録した公開鍵のフィンガープリントをメモ帳にコピーする
  • region-identifier:
    • 上部のリージョンが書いてある部分をクリック
    • リージョンの管理をクリックする
    • 一番上にあるはずの利用しているリージョンのリージョン識別子をメモ帳にコピーする
  • rsa-private-key-path:
    • 2.RSA キーを生成するで生成したパスをコピー
    • (私の環境ではうまくいかなかったため`/home/your-user/.oci/.pem とした)

5.スクリプトを作成する

ディレクトリを作成する

terminal
mkdir tf-provider

provider.tfというファイルを作成する

terminal
touch provider.tf

provider.tfを編集する。
4の必要な情報を収集するで収集したを当てはめる、文字列は””で囲むこと

provider.tf
provider "oci"{
tenancy_ocid = "<tenancy-ocid>"
user_ocid = "<user-ocid>"
private_key_path = "<rsa-private-key-path>"
fingerprint = "<fingerprint>"
region = "<region-identifier>"
}

availability-domeins.tfというファイルを作成する。

terminal
touch availability-domains.tf

availability-domains.tfを編集する。
4の必要な情報を収集するで収集したを置き換える、文字列は””で囲むこと

availability-domains.tf line_numner:false
1
2
3
4
5
6
7
8
// Source from https://registry.terraform.io/providers/hashicorp/oci/latest/docs/data-sources/identity_availability_domains

// <tenancy-ocid> is the compartment OCID for the root compartment.
// Use <tenancy-ocid> for the compartment OCID.

data "oci_identity_availability_domains" "ads" {
compartment_id = "<tenancy-ocid>"
}

output.tfを作成する

terminal
touch output.rf

output.tfを以下のように編集する

output.tf
// Output the "list" of a;; availability domains
output "all-availability-domains-in-your-tenancy" {
value = data.oci_identity_availability_domains.ads.availability_domains
}

3.スクリプトを実行スクリプトを実行

terraform initを実行する。
ls -altf-provider内に.terraformというフォルダが生成されているのを確認する。

terraform planを実行し、Plan: 0 to add, 0 to change, 0 to destroyを返していることを確認する。

terraform applyを実行しApply complete! Resources: 0 added, 0 changed, 0 destroyed.と返していることを確認する。

これで問題なければ、terraformでociを叩けることができた。

4.tfファイルを生成する。

インスタンスを作るときに、作成ではなくスタックとして保存を使う。
インスタンス名やコンパーメントを選んだら作成をクリック。

管理画面に遷移したら、tfファイルをダウンロードする

ダウンロードしたzipファイルを解答し、中身のmain.tfを適当な名前に変え、編集する

create-instance
- provider "oci" {}

resource "oci_core_instance" "generated_oci_core_instance" {
・・・

provider “oci” {}は既に定義済みなので削除する。

保存できたらterraform plan1 addedとなっていることを確認し、terraform applyで実際に生成される。

5.cronに設定する

always free枠を狙う場合、毎回毎回コマンド実行するのも面倒なのでcronに設定する。今回は一分おきにした

cron line:diff
*/1  *   *   *   * cd /terraform-dir/ && /usr/bin/terraform apply -auto-approve >> /var/log/cron.log

terraformの構成ファイルが入っているディレクトリにアクセス、そのディレクトリでサイレントで構築するような形態になっている。

コメント