FJcloud実践
TerraformでFJcloud-Vにリソースを構築する方法~応用編~
この記事は、ニフクラブログで2020-12-15に公開された記事を移転したものです。
この記事は富士通(旧富士通クラウドテクノロジーズ) Advent Calendar 2020の15日目の記事です。
14日目は@kzmakeさんのFJcloud-V(旧ニフクラ)のHatoba(β)でdapr + マイクロサービスを動かしてみたでした。2日目のdaprでつくるマイクロサービスに続き、マイクロサービスは最近話題になっているクラウドネイティブを構成する技術の1つです。FJcloud-V(旧ニフクラ)においてもクラウドネイティブなサービス展開が行われる予定です。
さて、改めましてこんにちは。1日目にTerraformでFJcloud-Vにリソースを構築する方法~基礎編~を執筆した@miyuushです。
今回は1日目の続編かつ応用編として、Terraform NIFCLOUD Providerを利用してFJcloud-V(旧ニフクラ)上のサーバーにディスクなどを紐付ける手順を説明します。
- GitHub
https://github.com/nifcloud/terraform-provider-nifcloud - Terraform Registry
https://registry.terraform.io/providers/nifcloud/nifcloud/latest - ドキュメント
https://registry.terraform.io/providers/nifcloud/nifcloud/latest/docs
目次
事前準備
応用編の内容に入る前に、TerraformでFJcloud-Vにリソースを構築する方法~基礎編~の事前準備は最低限実施しておく必要があります。
以下の手順は実施しましょう。
基礎編で作成したFJcloud-V(旧ニフクラ)リソースの定義ファイルを再掲いたします。
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"
}
このリソース定義ファイルでは、FJcloud-V(旧ニフクラ)のサーバー・ファイアウォール・SSHキーが定義されています。
【応用編】Terraform NIFCLOUD Providerを使用してFJcloud-V(旧ニフクラ)のサーバーにディスク・付替IP・プライベートLANを紐付けてみよう
それでは、応用編で新たに作成するFJcloud-V(旧ニフクラ)リソースの定義ファイルを作成します。今回は応用編ということでリソースごとに定義ファイルを分けます。
FJcloud-V(旧ニフクラ)のディスク
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"
}
FJcloud-V(旧ニフクラ)のディスクの定義では、ディスクのサイズ(単位は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をFJcloud-V(旧ニフクラ)のサーバーに紐付けるためには、FJcloud-V(旧ニフクラ)のサーバーの定義ファイルに少し変更を加える必要があります。そのため、変更部分について簡単にご説明いたします。
FJcloud-V(旧ニフクラ)のサーバー
定義ファイル全体を示す前に、リソース・データソースごとにみていきます。
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
}
まず、FJcloud-V(旧ニフクラ)のサーバーの定義で変更したのは、ネットワークインターフェースに関する部分です。ネットワークインターフェースの定義はパブリックIPアドレスとプライベートIPアドレスに分かれています。それぞれを定義するポイントは以下になります。
パブリックIPアドレス
- ここでは
ip_address
に付替IPのリソース定義を指定することで、パブリックIPアドレスに付替IPを適用しています
プライベートIPアドレス
- ここでは
network_id
・network_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
この設定ファイルには、ens192
・ens224
などのネットワークインターフェースごとにその設定が記載されています。今回は/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
これまで解説したFJcloud-V(旧ニフクラ)のサーバーの定義ファイルの全体は以下になります。
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.tf
・provider.tf
・sshkey.tf
については、【基礎編】の各リソースの定義ファイルを参照)
sample
├── disk.tf
├── elastic_ip.tf
├── firewall.tf
├── private_lan.tf
├── provider.tf
├── scripts
│ └── userdata.sh
├── server.tf
└── sshkey.tf
Terraformの実行
定義ファイルの作成が完了したため、Terraformプロバイダーの設定・定義ファイルの検証・適用を行い、FJcloud-V(旧ニフクラ)リソースを構築します。【基礎編】でもご説明したので、ここではコマンドのみ示します。
- Terraform プロバイダーの設定:
terraform init
- 定義ファイルの検証:
terraform plan
- 定義ファイルの適用:
terraform apply
コントロールパネルから確認
定義ファイルに記載したリソースが実際に作成されたのかを、FJcloud-V(旧ニフクラ)のコントロールパネルから確認してみます。(ファイアウォールとSSHキーの確認は【基礎編】参照)
図1, 2, 3より、定義ファイルの通りにディスク・付替IP・プライベートLANが作成されていることが分かります。
サーバーのネットワーク情報も確認してみます。
図4より、サーバーのパブリックIPアドレスには付替IPが適用されています。プライベートIPアドレスは、サーバー起動時に実行されたシェルスクリプトにより、指定した固定IPアドレスになっていることが分かります。
ここまで、【基礎編】と【応用編】の2つの記事にわたってTerraform NIFCLOUD Provider v1.0.0の使い方をご紹介してきました。
まとめ
今回はTerraform NIFCLOUD Providerを使用して、FJcloud-V(旧ニフクラ)上のサーバーにディスク・付替IP・プライベートLANを紐付ける方法をご説明しました。プライベートLANの紐付けにあたり、サーバーのネットワークインターフェース設定を、サーバーの起動時に変更する方法もご紹介しました。起動時に任意のスクリプトが実行されるようにすることで、様々なサーバーの設定を行えるようになります。
この記事は富士通(旧富士通クラウドテクノロジーズ) Advent Calendar 2020の15日目の記事でした。
明日は@yt09191971さんが「FJcloud-V(旧ニフクラ)SDKを使うにはJupyter Notebookが意外に便利な件について」を書いてくれるそうです。Jupyter NotebookはPythonでデータ処理を行う時に使うくらいだったので、気になりますね。