ニフクラ ブログ

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

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

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

14日目は@kzmakeさんのニフクラのHatoba(β)でdapr + マイクロサービスを動かしてみたでした。2日目のdaprでつくるマイクロサービスに続き、マイクロサービスは最近話題になっているクラウドネイティブを構成する技術の1つです。ニフクラにおいてもHatoba(β)をはじめとして、今後もクラウドネイティブなサービス展開が行われる予定です。

さて、改めましてこんにちは。1日目にニフクラがTerraformに対応したので使ってみた【基礎編】を執筆した@miyuushです。

今回は1日目の続編かつ応用編として、Terraform NIFCLOUD Providerを利用してニフクラ上のサーバーにディスクなどを紐付ける手順を説明します。

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

事前準備

応用編の内容に入る前に、【基礎編】Terraform NIFCLOUD Providerを使用してニフクラのサーバーを構築してみよう事前準備は最低限実施しておく必要があります。
以下の手順は実施しましょう。

基礎編で作成したニフクラリソースの定義ファイルを再掲いたします。

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"
}

このリソース定義ファイルでは、ニフクラのサーバー・ファイアウォール・SSHキーが定義されています。

【応用編】Terraform NIFCLOUD Providerを使用してニフクラのサーバーにディスク・付替IP・プライベートLANを紐付けてみよう

それでは、応用編で新たに作成するニフクラリソースの定義ファイルを作成します。今回は応用編ということでリソースごとに定義ファイルを分けます。

ニフクラのディスク

disk.tf

resource "nifcloud_volume" "web" {
  size            = 100
  volume_id       = "volume001"
  disk_type       = "High-Speed Storage A"
  instance_id     = nifcloud_instance.web.instance_id
  reboot          = "true"
  accounting_type = "2"
}

ニフクラのディスクの定義では、ディスクのサイズ(単位はGB)やディスクのタイプなどを定義する必要があります。また、instance_idにはディスクを増設するサーバーのIDも指定します。

付替IP

elastic_ip.tf

resource "nifcloud_elastic_ip" "web" {
  ip_type           = false
  availability_zone = "east-11"
}

付替IPの定義は非常にシンプルです。ip_typeは、付け替えるIPアドレスがプライベートIPアドレスなのかパブリックIPアドレスなのかを指定します。ここでは、パブリックIPアドレスに付替IPを適用したいのでfalseにしています。

プライベートLAN

private_lan.tf

resource "nifcloud_private_lan" "web" {
  private_lan_name  = "privatelan01"
  availability_zone = "east-11"
  cidr_block        = "192.168.1.0/24"
  accounting_type   = "2"
}

プライベートLANの定義では、プライベートLANのネットワークアドレスと使用できるIPアドレスの範囲をCIDR表記で指定します。

以上が、【基礎編】ではご紹介していないリソース定義ファイルの説明になります。
付替IPとプライベートLANをニフクラのサーバーに紐付けるためには、ニフクラのサーバーの定義ファイルに少し変更を加える必要があります。そのため、変更部分について簡単にご説明いたします。

ニフクラのサーバー

定義ファイル全体を示す前に、リソース・データソースごとにみていきます。

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"
    ip_address = nifcloud_elastic_ip.web.public_ip
  }

  network_interface {
    network_id = nifcloud_private_lan.web.network_id
    network_name = nifcloud_private_lan.web.private_lan_name
    ip_address = "static"
  }

  user_data = data.template_file.script.rendered
}

まず、ニフクラのサーバーの定義で変更したのは、ネットワークインターフェースに関する部分です。ネットワークインターフェースの定義はパブリックIPアドレスとプライベートIPアドレスに分かれています。それぞれを定義するポイントは以下になります。

パブリックIPアドレス

  • ここではip_addressに付替IPのリソース定義を指定することで、パブリックIPアドレスに付替IPを適用しています

プライベートIPアドレス

  • ここではnetwork_idnetwork_nameの値にプラベートLANのリソース定義を指定しています
  • Terraform NIFCLOUD Providerのv1.0.0では、ルーターなどのネットワークリソースに対応していないため、サーバーをプライベートLAN内に配置するためには、プライベートIPアドレスを静的に設定する必要があります
  • そのため、ip_addressには"static"を指定します

続いて、プライベートIPアドレスを静的に設定する方法についてです。プライベートIPアドレスは、サーバーの定義ファイルの最後に記述されているuser_dataで設定しています。user_dataにはサーバーの起動時に読み込むユーザーデータを指定します。ここでは、Terraformのtemplate_fileという機能を使って、サーバーの起動時にスクリプトを実行するようにしています。
以下にその定義を示します。

data "template_file" "script" {
  template = file("scripts/userdata.sh")

  vars = {
    private_address = "192.168.1.10/24"
  }
}

ここでは、テンプレートソースとしてシェルスクリプトを読み込んでいます。varsでは、テンプレートソースの中で使用できる変数を定義できます。 今回はサーバーのプライベートIPアドレスを定義しています。 以下に読み込むシェルスクリプトを示します。

userdata.sh

#!/bin/bash

cat << EOS > /etc/netplan/99-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
      ens224:
          dhcp4: false
          addresses: [${private_address}]
          dhcp6: false
EOS
netplan apply

【基礎編】、【応用編】ともにサーバーのOSはUbuntu 20.04 LTSを指定しており、固定IPアドレスの設定には /etc/netplan/01-netcfg.yamlを書き換えるまたはyaml形式の別なファイルを作成する必要があります。
/etc/netplan/01-netcfg.yamlの一部を以下に示します。

network:
    version: 2
    renderer: networkd
    ethernets:
        ens192:
            dhcp4: yes
            dhcp6: yes
            dhcp-identifier: mac
        ens224:
            dhcp4: yes
            dhcp6: yes
            dhcp-identifier: mac

この設定ファイルには、ens192ens224などのネットワークインターフェースごとにその設定が記載されています。今回は/etc/netplan/01-netcfg.yamlを直接書き換えるのではなく、/etc/netplan/99-netcfg.yamlという別のファイルを編集します。ens224がプライベートIPアドレスの設定になっているため、DHCPを無効化して固定のIPアドレスを記述したもので上書きします。

サーバーの起動後には以下のようなネットワーク設定ファイルが作成されています。なお、/etc/netplan/以下に複数の.yamlファイルを配置すると、ファイル名の辞書順に読み込みが行われます。そのため、01-netcfg.yamlより後に読み込まれる/etc/netplan/99-netcfg.yamlには、ens224の設定のみ記述するとその部分だけ上書きされます。

99-netcfg.yaml

network:
    version: 2
    renderer: networkd
    ethernets:
        ens224:
            dhcp4: false
            addresses: [192.168.1.10/24]
            dhcp6: false

これまで解説したニフクラのサーバーの定義ファイルの全体は以下になります。

server.tf

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"
    ip_address = nifcloud_elastic_ip.web.public_ip
  }

  network_interface {
    network_id = nifcloud_private_lan.web.network_id
    network_name = nifcloud_private_lan.web.private_lan_name
    ip_address = "static"
  }

  user_data = data.template_file.script.rendered
}

data "template_file" "script" {
  template = file("scripts/userdata.sh")

  vars = {
    private_address = "192.168.1.10/24"
  }
}

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

ディレクトリ構成

今回はリソースごとにファイルを分けているため、全体のディレクトリ構成を示します。(firewall.tfprovider.tfsshkey.tfについては、【基礎編】各リソースの定義ファイルを参照)

sample
  ├── disk.tf
  ├── elastic_ip.tf
  ├── firewall.tf
  ├── private_lan.tf
  ├── provider.tf
  ├── scripts
  │       └── userdata.sh
  ├── server.tf
  └── sshkey.tf

Terraformの実行

定義ファイルの作成が完了したため、Terraformプロバイダーの設定・定義ファイルの検証・適用を行い、ニフクラリソースを構築します。【基礎編】でもご説明したので、ここではコマンドのみ示します。

  • Terraform プロバイダーの設定: terraform init
  • 定義ファイルの検証: terraform plan
  • 定義ファイルの適用: terraform apply

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

定義ファイルに記載したリソースが実際に作成されたのかを、ニフクラのコントロールパネルから確認してみます。(ファイアウォールとSSHキーの確認は【基礎編】参照)

f:id:nifcloud-developers:20201208134243p:plain
図1: ニフクラのディスクの基本情報

f:id:nifcloud-developers:20201208134412p:plain
図2: 作成された付替IP

f:id:nifcloud-developers:20201208134523p:plain
図3: プライベートLANの基本情報

図1, 2, 3より、定義ファイルの通りにディスク・付替IP・プライベートLANが作成されていることが分かります。

サーバーのネットワーク情報も確認してみます。

f:id:nifcloud-developers:20201208135043p:plain
図4: サーバーのネットワーク情報

図4より、サーバーのパブリックIPアドレスには付替IPが適用されています。プライベートIPアドレスは、サーバー起動時に実行されたシェルスクリプトにより、指定した固定IPアドレスになっていることが分かります。

ここまで、【基礎編】と【応用編】の2つの記事にわたってTerraform NIFCLOUD Provider v1.0.0の使い方をご紹介してきました。

まとめ

今回はTerraform NIFCLOUD Providerを使用して、ニフクラ上のサーバーにディスク・付替IP・プライベートLANを紐付ける方法をご説明しました。プライベートLANの紐付けにあたり、サーバーのネットワークインターフェース設定を、サーバーの起動時に変更する方法もご紹介しました。起動時に任意のスクリプトが実行されるようにすることで、様々なサーバーの設定を行えるようになります。


この記事は富士通クラウドテクノロジーズ Advent Calendar 2020の15日目の記事でした。
明日は@yt09191971さんが「ニフクラSDKを使うにはJupyter Notebookが意外に便利な件について」を書いてくれるそうです。Jupyter NotebookはPythonでデータ処理を行う時に使うくらいだったので、気になりますね。