はじめに

こんにちは。宮井です。

今回は、Terraformを利用したOracle Cloud Infrastructure(以下OCI)環境の構築を検証してみたいと思います。

マネージャー_宮井の登場です♪
宮井の過去記事も是非ご覧下さいね。以下一部抜粋。
Oracle Cloud Infrastructure Foundations 2021 Certified Associate / Oracle Cloud Infrastructure 2021 Architect Associateを取得しました!
OCI Database Managementを設定してみました


そもそもTerraformとはHashiCorp社が提供する構築の自動化ツールです。
Terraformで定義されているOCIのプロバイダ情報というものを利用することで、OCIのComputeインスタンスの作成・変更やVCNの作成などのネットワーク設定等をTerraform上でできます。

Terraformはインフラをコード化するというInfrastructure as Codeを実現するツールの一つです。
インフラをコードとして管理することで、同じ環境を素早くミスなく作ることができ、リソースの構成管理という側面では、構成変更をコードの形で管理可能です。

それでは、前置きはこれくらいとして、早速Terraformを使っていきたいと思います。

今回はIaaS上にTerraformをインストールし、コンピュートインスタンスを作成する手順をご紹介いたします。

下記のOCIのマニュアルを参考に実施しました。
https://docs.oracle.com/ja-jp/iaas/developer-tutorials/tutorials/tf-provider/01-summary.htm

以下の流れで進めていきます。

  • Terraformのインストール
  • APIキーの登録
  • コンピュートインスタンスの作成

1. Terraformのインストール & APIキーの登録

Terraformのインストール

サーバ上にTerraformをインストールします。
といってもZipを展開するのみの作業です。

下記のサイトから対応OSに応じてダウンロードすることが可能です。
https://www.terraform.io/downloads

但し、今回の検証ではwgetを利用してインストールしました。
※検証時より、バージョン等は最新化されてます。適宜置き換えて実行くださいね。

[root@myhost ~]# wget https://releases.hashicorp.com/terraform/1.1.4/terraform_1..1.4_linux_amd64.zip
--2022-01-21 10:08:31--  https://releases.hashicorp.com/terraform/1.1.4/terraform_1.1.4_linux_amd64.zip
・・省略・・
2022-01-21 10:08:32 (39.4 MB/s) - ‘terraform_1.1.4_linux_amd64.zip’ saved [18695508/18695508]
[root@myhost ~]# ls
terraform_1.1.4_linux_amd64.zip
[root@myhost ~]# unzip ./terraform_1.1.4_linux_amd64.zip -d /usr/local/bin/
Archive:  ./terraform_1.1.4_linux_amd64.zip
  inflating: /usr/local/bin/terraform
[root@myhost ~]# terraform -version
Terraform v1.1.4
on linux_amd64

これで完了です。

カンタンですね

APIキーの登録

サーバ上でRSAキー(秘密鍵と公開鍵)を作成し、OCI上のユーザに対してAPIキーとして登録します。
まずは、RSAキーを作成します。

[opc@myhost ~]$ mkdir ${HOME}/.oci
[opc@myhost ~]$ openssl genrsa -out ${HOME}/.oci/rsa_key.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
[opc@myhost ~]$ chmod 600 ${HOME}/.oci/rsa_key.pem
[opc@myhost ~]$ ls -la .oci
total 4
-rw-------. 1 opc opc 1675 Jan 27 04:20 rsa_key.pem
[opc@myhost ~]$ openssl rsa -pubout -in ${HOME}/.oci/rsa_key.pem -out ${HOME}/.oci/rsa_key_public.pem
writing RSA key
[opc@myhost ~]$ ls -la .oci
total 8
-rw-------. 1 opc opc 1675 Jan 27 04:20 rsa_key.pem
-rw-rw-r--. 1 opc opc  451 Jan 27 04:21 rsa_key_public.pem
[opc@myhost ~]$ cat ${HOME}/.oci/rsa_key_public.pem
-----BEGIN PUBLIC KEY-----
・・省略・・
-----END PUBLIC KEY-----
[opc@myhost ~]$

次にOCIのコンソールからユーザー・アカウントに公開キーを追加します。
メインメニューから「アイデンティティとセキュリティ」「ユーザ」をクリックします。

ユーザ選択は飛ばしていますが、対象のユーザを選択します。
ここでは管理者ユーザを対象としていますので、ポリシーは付与済みの想定となっています。

下の方にスライドすると左下にAPIキーというタブがあるかと思いますので、そちらをクリックします。

APIキーの追加をクリックします。

公開キーの貼り付けから、先ほど作成した内容を貼り付けます。

構成ファイルのプレビューという形で下記のような情報が出力されます。
後で使用しますので、メモしておいてください。

閉じるをクリックして、この作業は完了となります。

2. tfファイルの作成

事前準備

今回はComputeインスタンスを作成に焦点を絞ってますので、VCNやサブネット設定、コンパートメント等は既存のものを利用します。次の変数ファイルにてOCIDが必要ですので、適宜確認ください。

また、作成するOSイメージについては、下記の文書から確認できます。
リージョンごとに変数が異なるため、気を付けてください。
https://docs.oracle.com/en-us/iaas/images/

変数ファイルの作成(variable.tf)

Terraformで必要なファイルは同一のディレクトリに格納しますので、
Computeインスタンス作成用のディレクトリを作成します。

[opc@myhost ~]$ mkdir tf-compute
[opc@myhost ~]$ cd tf-compute

初めに変数ファイルを作成し、テナント情報やコンピュートインスタンス作成に関する情報を定義します。このあたりは、マニュアルからアレンジを入れています。
テナント情報とコンピュートインスタンス作成情報を1ファイルで定義していますが、分けて定義することで、テナント情報は共通で利用し、インスタンス情報を台数分用意するという形もいいかと思います。
赤字は適宜置き換えてください。

[opc@myhost tf-compute]$ vi variable.tf
variable "tenancy_ocid" {
  default = "<tenancy_ocid>"
}
variable "user_ocid" {
  default = "<user_ocid>"
}
variable "private_key_path" {
  default = "~/.oci/rsa_key.pem"
}
variable "fingerprint" {
  default = "<fingerprint>"
}
variable "region" {
  default = "ap-tokyo-1"
}
variable "compartment_ocid" {
  default = "<compartment_ocid>"
}
variable "display_name" {
  default="terraform-test-compute"
}
variable "shape" {
  default="VM.Standard2.1"
}
variable "instance_image_ocid" {
  type = map
  default = {
    ap-tokyo-1 = "ocid1.image.oc1.ap-tokyo-1.aaaaaaaa54fzz7npbwowfjke2nohrjbbvl6m7uqx567kgdfhha7stgaezalq"
    ap-osaka-1 = "ocid1.image.oc1.ap-osaka-1.aaaaaaaabo6azpo6tyifb4vals5agz53e6pbwfjhgfjf4axqdyienlnhguqa"
  }
}
variable "subnet_id" {
  default = "<subnet_id>"
}
variable "ssh_authorized_keys" {
  default = "~/id_rsa.pub"
}

プロバイダファイルの作成(provider.tf)

こちらはOCIに接続するための情報を記載します。
先ほど定義した変数を参照する形としていますので、共通で利用できます。

[opc@myhost tf-compute]$ vi provider.tf
provider "oci" {
  tenancy_ocid = "${var.tenancy_ocid}"
  user_ocid = "${var.user_ocid}"
  private_key_path = "${var.private_key_path}"
  fingerprint = "${var.fingerprint}"
  region = "${var.region}"
}

データ取得用ファイルの作成

マニュアルでは可用性ドメインを取得して変数定義する形をとっておりましたので、ご紹介もかねて同じ手順を踏もうと思います。
dataというブロックを利用して可用性ドメイン情報を取得します。
こちらのファイルを作成することで、OCI上の可用性ドメインの情報を取得し、その値をリソース作成時に使用可能です。また順序関係を意識する必要はありません。

[opc@myhost tf-compute]$ vi availability-domains.tf
data "oci_identity_availability_domains" "ads" {
  compartment_id = "${var.compartment_ocid}"
}

リソース作成用ファイルの作成

次にリソース作成用のファイルを定義します。
resourceというブロックを利用してリソースを作成しますが、
Terraformには、oci_core_instanceというコンピュートインスタンスに関するリソースが定義されており、そちらを利用します。

その他にオプションとして設定できる項目については、下記をご確認頂ければと思います。
https://registry.terraform.io/providers/hashicorp/oci/latest/docs

可用性ドメインに関しては、先ほど作成したデータ取得用ファイルから取得する手順となっています。

[opc@myhost tf-compute]$ vi compute.tf
resource "oci_core_instance" "terraform_test_instance" {
    # Required
    availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
    compartment_id = "${var.compartment_ocid}"
    shape = "${var.shape}"
    source_details {
        source_id = "${var.instance_image_ocid[var.region]}"
        source_type = "image"
    }
# Optional
    display_name = "${var.display_name}"
    create_vnic_details {
        assign_public_ip = true
        subnet_id = "${var.subnet_id}"
    }
    metadata = {
        ssh_authorized_keys = file("${var.ssh_authorized_keys}")
    }
    preserve_boot_volume = false
}

アウトプット用ファイルの作成

リソース情報を出力しておきたい場合は、outputブロックを利用して、
outputファイルを作成します。

[opc@myhost tf-compute]$ vi outputs.tf
output "name-of-first-availability-domain" {
  value = data.oci_identity_availability_domains.ads.availability_domains[0].name
}

3. Terraformの実行

Terraformの実行

それではTerraformを実行していきます。
まずは、”terraform init” コマンドを利用して初期化を行います。
実行に必要なファイルが生成されます。

[opc@myhost tf-compute]$ ls -l
total 20
-rw-rw-r--. 1 opc opc   97 Mar 16 09:44 availability-domains.tf
-rw-rw-r--. 1 opc opc  642 Mar 16 09:44 compute.tf
-rw-rw-r--. 1 opc opc  130 Mar 16 09:45 outputs.tf
-rw-rw-r--. 1 opc opc  204 Mar 16 09:44 provider.tf
-rw-rw-r--. 1 opc opc 1151 Mar 16 09:42 variable.tf
[opc@myhost tf-compute]$ terraform init

Initializing the backend...

Initializing provider plugins...

・・・省略・・・
Terraform has been successfully initialized!
・・・省略・・・
[opc@myhost tf-compute]$ ls -la
total 32
drwxrwxr-x. 3 opc opc 4096 Mar 16 09:47 .
drwx------. 8 opc opc 4096 Mar 16 09:45 ..
-rw-rw-r--. 1 opc opc   97 Mar 16 09:44 availability-domains.tf
-rw-rw-r--. 1 opc opc  642 Mar 16 09:44 compute.tf
-rw-rw-r--. 1 opc opc  130 Mar 16 09:45 outputs.tf
-rw-rw-r--. 1 opc opc  204 Mar 16 09:44 provider.tf
drwxr-xr-x. 3 opc opc   23 Mar 16 09:47 .terraform
-rw-r--r--. 1 opc opc 1077 Mar 16 09:47 .terraform.lock.hcl
-rw-rw-r--. 1 opc opc 1151 Mar 16 09:42 variable.tf

次に”terraform plan” コマンドを利用して作成予定の情報を確認します。
今回はコンピュートインスタンスの作成のため、”1 to add”と表示されています。

[opc@myhost tf-compute]$ terraform plan

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # oci_core_instance.terraform_test_instance will be created
  + resource "oci_core_instance" "terraform_test_instance" {
      + availability_domain                 = "JpHi:AP-TOKYO-1-AD-1"
      + boot_volume_id                      = (known after apply)
      + capacity_reservation_id             = (known after apply)
      + compartment_id                      = "***"
      + dedicated_vm_host_id                = (known after apply)
      + defined_tags                        = (known after apply)
      + display_name                        = "terraform-test-compute"
・・・省略・・・
Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + name-of-first-availability-domain = "JpHi:AP-TOKYO-1-AD-1"
・・・省略・・・
[opc@myhost tf-compute]$

それでは実際にリソースを作成します。
”terraform apply” コマンドを利用して作成予定の情報を確認します。

[opc@myhost tf-compute]$ terraform apply
・・・省略・・・
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes
oci_core_instance.terraform_test_instance: Creating...
oci_core_instance.terraform_test_instance: Still creating... [10s elapsed]
oci_core_instance.terraform_test_instance: Still creating... [20s elapsed]
oci_core_instance.terraform_test_instance: Still creating... [30s elapsed]
oci_core_instance.terraform_test_instance: Still creating... [40s elapsed]
oci_core_instance.terraform_test_instance: Creation complete after 41s [id=xxxx]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

name-of-first-availability-domain = "JpHi:AP-TOKYO-1-AD-1"
[opc@myhost tf-compute]$

こちらで無事作成が完了しました。
OCIの画面上から見ても確かにインスタンスが作成されています。

さいごに

今回はTerraformを利用してOCI環境を構築してみましたが、イメージは伝わりましたでしょうか?

コンソール画面からの作成より、ステップ数が多いようにも思われたかもしれないですが、冒頭にも述べたようにコードとしてパラメータ管理できる点や、複数台作る際にはファイルとして使いまわしがしやすく、メリットがあるかと思います。

また、今回ご紹介したTerraformを利用したリソース・マネージャというOCIサービスのサービスもありますので、機会があればまたご紹介したいと思います。

Oracle Cloud についてご検討の際は、弊社までお問い合わせください。

実際に手を動かさないとわからない部分もあるかと思いますので、是非トライしてみてくださいね
Oracle Cloudカテゴリの記事も是非ご覧くださいませ。

投稿者プロフィール

DBひとりでできるもん運営チーム
DBひとりでできるもん運営チーム
「DBひとりでできるもん」運営チームです。
「親しみやすさと技術力」をテーマに、技術情報・サービス・インフラ系資格取得に役立つ情報、社員等の情報をお届けします。
70名弱の事業部員で鋭意、執筆中です。
少しでも当社を知って頂けるよう、愛情込めて頑張ります!
※facebook、X(旧twitter)、インスタグラムでは「DBひとりでできるもん」の更新情報を発信しています。