ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

ニフクラがTerraformに対応したので使ってみた【基礎編】

この記事は富士通クラウドテクノロジーズ Advent Calendar 2020の1日目の記事です。

こんにちは、富士通クラウドテクノロジーズに今年4月入社の@miyuushです。

今回は、先日公開されたTerraform NIFCLOUD Providerの簡単なご紹介と、実際にニフクラ上にサーバーなどのリソースを構築する手順を説明いたします。

f:id:nifcloud-developers:20201127182828p:plain

Terraform NIFCLOUD Providerとは?

Terraform NIFCLOUD Providerは、Terraformからニフクラのインフラストラクチャを操作するためのプラグインです。
本格的な説明の前に、Terraformについて簡単に紹介いたします。

Terraformとは?

Terraformは、HashiCorp社が提供するIaC(Infrastructure as Code)ツールです。
下記のような特徴があります。

  • IaCツールなため、インフラストラクチャの状態をコードで保存可能かつバージョン管理可能
  • 宣言型のインフラストラクチャ定義ファイルでインフラストラクチャを管理
    • そのため、ユーザはインフラストラクチャが構築されるまでの手順を意識する必要がない
  • AWSやGCPなど、様々なパブリッククラウドサービスに対応している

www.terraform.io

Terraform NIFCLOUD Providerの特徴

先日公開されたTerraform NIFCLOUD Providerのv1.0.0では、以下のニフクラリソースに対応しております。
これらのニフクラリソースの状態をTerraformのインフラストラクチャ定義ファイルで管理できます。

  • サーバー
  • ディスク
  • ファイアウォール
  • SSHキー
  • 付替IPアドレス
  • プライベートLAN
  • SSL証明書(アップロード)

今後のエンハンスにて、上記のリソース以外にも順次対応する予定になっております。

【基礎編】Terraform NIFCLOUD Providerを使用してニフクラのサーバーを構築してみよう

それでは、ニフクラのサーバーを構築してみます。

事前準備

Terraformのダウンロード・インストール

以下のページから、使用OSに対応したTerraformのダウンロード・インストールを行う必要があります。
なお、本記事ではLinuxサーバーを用いて作業を行います。

www.terraform.io

ディレクトリの作成

リソース定義ファイルを配置するディレクトリを作成します。 今回はsampleというディレクトリ名にします。

$ mkdir sample && cd sample

以下の手順で作成する定義ファイル、コマンドの実行は全てsampleディレクトリの中で行うものとします。

ニフクラのアクセスキーを取得

ニフクラをTerraformで利用する場合にはアクセスキーを取得する必要があります。
以下のページの手順でアクセスキーを取得可能です。アクセスキーはリソース定義ファイル内に記載するので確認できるようにしておきましょう。

pfs.nifcloud.com

ニフクラのサーバーの定義ファイル作成

事前準備が終わったので、次は作成するニフクラリソースの定義ファイルを作成します。
ここでは、ニフクラのサーバーとそれに必要となるファイアウォール、SSHキーを作成することにします。
リソース定義ファイルの全体を示す前に、プロバイダー設定・各リソースの設定について、簡単に解説します。

Terraformとプロバイダーの設定

terraform {
  required_providers {
    nifcloud = {
      source = "nifcloud/nifcloud"
    }
  }
}

provider "nifcloud" {
  access_key = "[アクセスキー]"
  secret_key = "[シークレットアクセスキー]"
  region     = "jp-east-1"
}

最初に、使用するTerraformプロバイダーの指定やTerraformのバージョンなどを指定する必要があります。ここではニフクラのプロバイダーを使用する設定を行っています。

また、指定したプロバイダーの資格情報やリージョン・バージョンの指定なども行う必要があります。ニフクラのプロバイダーでは、資格情報とリージョンを指定するします。

各リソースの設定

構築するリソースごとに、必要な設定値を指定します。

ニフクラのサーバー
resource "nifcloud_instance" "web" {
  instance_id       = "web001"
  availability_zone = "east-11"
  image_id          = data.nifcloud_image.ubuntu.id
  key_name          = nifcloud_key_pair.web.key_name
  security_group    = nifcloud_security_group.web.group_name
  instance_type     = "small"
  accounting_type   = "2"

  network_interface {
    network_id = "net-COMMON_GLOBAL"
  }

  network_interface {
    network_id = "net-COMMON_PRIVATE"
  }

}

ニフクラのサーバーの定義では、key_namesecurity_groupの値に、後述するSSHキーとファイアウォールの定義を指定しています。このようにすることで、ニフクラのサーバーが構築された時にSSHキーおよびファイアウォールと紐付けされるようになります。

また、image_idの値はTerraformのData Sourcesという機能を用いて、OSイメージ名からOSイメージIDを取得できるようになっています。
以下のようにimage_nameを指定することが出来ます。

data "nifcloud_image" "ubuntu" {
  image_name = "Ubuntu Server 20.04 LTS"
}
SSHキー
resource "nifcloud_key_pair" "web" {
  key_name   = "webkey"
  public_key = "c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFEeFVVSmtIWFFvalVmeGphT3dQNVJmMjhOTVRFSjJFblBQdFk0b1NkZFBpRllnMWVDTGFNU08wV25nZVIrVk5sU215am1qU2xRWjBsc1BkcHZjWnY0KzZiMDlLUUZlT3NxakdjNE9Ga1o2MTZyTEI3UmdzblZnSXl3QmtIZ2lsMVQzbFRwRHVtYVk2TFFaRjRiaVpTNkNyaFdYeVhiSjFUVmYyZ0hIYXZPdi9WSS9ITjhIejlnSDg5Q0xWRVFOWFVQbXdjbC83ZE4yMXE4QnhNVkpGNW1sSW1RcGxwTjFKQVRwdnBXSXVXSzZZOFpYblEvYVowMDBMTFVBMVA4N1l3V2FRSWJRTGVPelNhc29GYm5pbkZ3R05FdVdCK0t5MWNMQkRZc1lmZExHQnVYTkRlVmtnUUE3ODJXWWxaNU1lN0RVMWt0Q0U3Qk5jOUlyUVA1YWZDU2g="
}

SSHキーの定義では、public_keyに自身で公開鍵を作成して、Base64方式にエンコードしたものを設定する必要があります。
以下は、公開鍵の作成からBase64方式にエンコードする手順の例です。

# SSHキーペアを生成
$ ssh-keygen -f webkey
(パスフレーズ設定)
# Base64形式にエンコード
$ base64 webkey.pub -w0
(エンコード結果出力)
ファイアウォールとルール
resource "nifcloud_security_group" "web" {
  group_name        = "webfw"
  availability_zone = "east-11"
}

resource "nifcloud_security_group_rule" "web" {
  security_group_names = [nifcloud_security_group.web.group_name]
  type                 = "IN"
  from_port            = 80
  protocol             = "TCP"
  cidr_ip              = "0.0.0.0/0"
}

ファイアウォールの定義では、あくまでファイアウォールの名前とゾーンを指定して作成するだけになっています。そのため、通信の可否を設定するためのルールも定義する必要があります。
ルールの定義では、security_group_namesにファイアウォールの定義を指定することで、指定したファイアウォールにルールを追加可能です。

リソース定義ファイル全体

これまで解説したリソース定義ファイルの全体は以下になります。
ちなみに、リソースの定義ファイルは拡張子が.tfのものを指します。

sample.tf

terraform {
  required_providers {
    nifcloud = {
      source = "nifcloud/nifcloud"
    }
  }
}

provider "nifcloud" {
  access_key = "[アクセスキー]"
  secret_key = "[シークレットアクセスキー]"
  region     = "jp-east-1"
}

resource "nifcloud_instance" "web" {
  instance_id       = "web001"
  availability_zone = "east-11"
  image_id          = data.nifcloud_image.ubuntu.id
  key_name          = nifcloud_key_pair.web.key_name
  security_group    = nifcloud_security_group.web.group_name
  instance_type     = "small"
  accounting_type   = "2"

  network_interface {
    network_id = "net-COMMON_GLOBAL"
  }

  network_interface {
    network_id = "net-COMMON_PRIVATE"
  }

}

resource "nifcloud_key_pair" "web" {
  key_name   = "webkey"
  public_key = "c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFEeFVVSmtIWFFvalVmeGphT3dQNVJmMjhOTVRFSjJFblBQdFk0b1NkZFBpRllnMWVDTGFNU08wV25nZVIrVk5sU215am1qU2xRWjBsc1BkcHZjWnY0KzZiMDlLUUZlT3NxakdjNE9Ga1o2MTZyTEI3UmdzblZnSXl3QmtIZ2lsMVQzbFRwRHVtYVk2TFFaRjRiaVpTNkNyaFdYeVhiSjFUVmYyZ0hIYXZPdi9WSS9ITjhIejlnSDg5Q0xWRVFOWFVQbXdjbC83ZE4yMXE4QnhNVkpGNW1sSW1RcGxwTjFKQVRwdnBXSXVXSzZZOFpYblEvYVowMDBMTFVBMVA4N1l3V2FRSWJRTGVPelNhc29GYm5pbkZ3R05FdVdCK0t5MWNMQkRZc1lmZExHQnVYTkRlVmtnUUE3ODJXWWxaNU1lN0RVMWt0Q0U3Qk5jOUlyUVA1YWZDU2g="
}

resource "nifcloud_security_group" "web" {
  group_name        = "webfw"
  availability_zone = "east-11"
}

resource "nifcloud_security_group_rule" "web" {
  security_group_names = [nifcloud_security_group.web.group_name]
  type                 = "IN"
  from_port            = 80
  protocol             = "TCP"
  cidr_ip              = "0.0.0.0/0"
}

data "nifcloud_image" "ubuntu" {
  image_name = "Ubuntu Server 20.04 LTS"
}

Terraformプロバイダーの設定

次に、Terraformのワークスペースの初期化や、定義ファイルで指定されたTerraformプロバイダーをダウンロードするためにterraform initコマンドを実行します。

$ terraform init
(省略)
Terraform has been successfully initialized!
(省略)

上記のような出力が得られれば、問題なく実行できています。
また、カレントディレクトリに`ダウンロードしたプロバイダーの.terraformディレクトリが作成されます。

定義ファイルの検証

次に、定義ファイルの構文が正しいかどうか・どのようなリソースが作成、変更、削除されるかを確認するためにterraform planコマンドを実行します。

$ terraform plan
(省略)
------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # nifcloud_instance.web will be created
  + resource "nifcloud_instance" "web" {
      + accounting_type         = "2"
      + availability_zone       = "east-11"
      + disable_api_termination = false
      + id                      = (known after apply)
      + image_id                = "221"
      + instance_id             = "web001"
      + instance_state          = (known after apply)
      + instance_type           = "small"
      + key_name                = "webkey"
      + private_ip              = (known after apply)
      + public_ip               = (known after apply)
      + security_group          = "webfw"
      + unique_id               = (known after apply)

      + network_interface {
          + network_id = "net-COMMON_GLOBAL"
        }
      + network_interface {
          + network_id = "net-COMMON_PRIVATE"
        }
    }

  # nifcloud_key_pair.web will be created
  + resource "nifcloud_key_pair" "web" {
      + fingerprint = (known after apply)
      + id          = (known after apply)
      + key_name    = "webkey"
      + public_key  = "c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFEeFVVSmtIWFFvalVmeGphT3dQNVJmMjhOTVRFSjJFblBQdFk0b1NkZFBpRllnMWVDTGFNU08wV25nZVIrVk5sU215am1qU2xRWjBsc1BkcHZjWnY0KzZiMDlLUUZlT3NxakdjNE9Ga1o2MTZyTEI3UmdzblZnSXl3QmtIZ2lsMVQzbFRwRHVtYVk2TFFaRjRiaVpTNkNyaFdYeVhiSjFUVmYyZ0hIYXZPdi9WSS9ITjhIejlnSDg5Q0xWRVFOWFVQbXdjbC83ZE4yMXE4QnhNVkpGNW1sSW1RcGxwTjFKQVRwdnBXSXVXSzZZOFpYblEvYVowMDBMTFVBMVA4N1l3V2FRSWJRTGVPelNhc29GYm5pbkZ3R05FdVdCK0t5MWNMQkRZc1lmZExHQnVYTkRlVmtnUUE3ODJXWWxaNU1lN0RVMWt0Q0U3Qk5jOUlyUVA1YWZDU2g="
    }

  # nifcloud_security_group.web will be created
  + resource "nifcloud_security_group" "web" {
      + availability_zone      = "east-11"
      + group_name             = "webfw"
      + id                     = (known after apply)
      + log_limit              = 1000
      + revoke_rules_on_delete = false
    }

  # nifcloud_security_group_rule.ssh will be created
  + resource "nifcloud_security_group_rule" "ssh" {
      + cidr_ip              = "0.0.0.0/0"
      + from_port            = 80
      + id                   = (known after apply)
      + protocol             = "TCP"
      + security_group_names = [
          + "webfw",
        ]
      + type                 = "IN"
    }

Plan: 4 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------
(省略)

上記の出力を確認すると、定義ファイル内のリソースが全て作成されることが分かります。

定義ファイルの適用

terraform planコマンドで、作成されるリソースの情報が定義ファイルの内容と一致していることが確認できたので、terraform applyコマンドで実際にリソースを構築します。

$ 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(問題なければ`yes`と入力)

nifcloud_security_group.web: Creating...
nifcloud_key_pair.web: Creating...
nifcloud_key_pair.web: Creation complete after 4s [id=webkey]
nifcloud_security_group.web: Still creating... [10s elapsed]
nifcloud_security_group.web: Still creating... [20s elapsed]
nifcloud_security_group.web: Creation complete after 28s [id=webfw]
nifcloud_security_group_rule.ssh: Creating...
nifcloud_instance.web: Creating...
nifcloud_security_group_rule.ssh: Still creating... [10s elapsed]
nifcloud_instance.web: Still creating... [10s elapsed]
nifcloud_security_group_rule.ssh: Still creating... [20s elapsed]
nifcloud_instance.web: Still creating... [20s elapsed]
nifcloud_security_group_rule.ssh: Creation complete after 24s [id=sgrule-476634086]
nifcloud_instance.web: Still creating... [30s elapsed]
(サーバー作成中のメッセージが10秒毎に出力されるため、一部省略)
nifcloud_instance.web: Still creating... [3m0s elapsed]
nifcloud_instance.web: Still creating... [3m10s elapsed]
nifcloud_instance.web: Still creating... [3m20s elapsed]
nifcloud_instance.web: Creation complete after 3m23s [id=web001]

コントロールパネルから確認

定義ファイルに記載した全てのリソースが作成されたようなので、ニフクラのコントロールパネルから確認してみます。

f:id:nifcloud-developers:20201120100241p:plain
図1: ニフクラのサーバの基本情報

図1より、定義ファイルの通りにニフクラのサーバーが構築されていることが分かります。ファイアウォールとSSHキーも正常に紐付けられています。

ファイアウォールとSSHキーについても確認してみます。

f:id:nifcloud-developers:20201120100156p:plain
図2: ファイアウォールのルール

f:id:nifcloud-developers:20201120100311p:plain
図3: ファイアウォールが適用されているサーバー

f:id:nifcloud-developers:20201120100333p:plain
図4: SSHキーの基本情報

図2, 3, 4より、ファイアウォール・SSHキーに関しても正常に作成出来ていることが分かります。

以上で、基礎編としてのTerraform NIFCLOUD Providerを使用したニフクラのサーバー構築は完了となります。

まとめ

今回はTerraform NIFCLOUD Providerの簡単なご紹介と、実際に使用してニフクラのサーバー・ファイアウォール・SSHキーを作成する手順を解説しました。
ニフクラがTerraformに対応したことで、リソースの定義ファイルを作成してCLIで簡単に操作出来るようになりました。

次回は応用編ということで、今回紹介しなかったニフクラのディスク・付替IP・プライベートLANをニフクラのサーバーに紐付ける方法を解説する予定です。

この記事は富士通クラウドテクノロジーズ Advent Calendar 2020の1日目の記事でした。
明日は@kzmakeさんが「daprでつくるマイクロサービス」を書いてくれるそうです。