この記事は、ニフクラブログで2020-12-15に公開された記事を移転したものです。
この記事は富士通クラウドテクノロジーズ Advent Calendar 2020の15日目の記事です。
14日目は@kzmakeさんのニフクラのHatoba(β)でdapr + マイクロサービスを動かしてみたでした。2日目のdaprでつくるマイクロサービスに続き、マイクロサービスは最近話題になっているクラウドネイティブを構成する技術の1つです。ニフクラにおいてもクラウドネイティブなサービス展開が行われる予定です。
さて、改めましてこんにちは。1日目にニフクラがTerraformに対応したので使ってみた【基礎編】を執筆した@miyuushです。
今回は1日目の続編かつ応用編として、Terraform NIFCLOUD Providerを利用してニフクラ上のサーバーにディスクなどを紐付ける手順を説明します。
- GitHub
- Terraform Registry
- ドキュメント
事前準備
応用編の内容に入る前に、【基礎編】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_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
これまで解説したニフクラのサーバーの定義ファイルの全体は以下になります。
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プロバイダーの設定・定義ファイルの検証・適用を行い、ニフクラリソースを構築します。【基礎編】でもご説明したので、ここではコマンドのみ示します。
- Terraform プロバイダーの設定:
terraform init
- 定義ファイルの検証:
terraform plan
- 定義ファイルの適用:
terraform apply
コントロールパネルから確認
定義ファイルに記載したリソースが実際に作成されたのかを、ニフクラのコントロールパネルから確認してみます。(ファイアウォールとSSHキーの確認は【基礎編】参照)
図1, 2, 3より、定義ファイルの通りにディスク・付替IP・プライベートLANが作成されていることが分かります。
サーバーのネットワーク情報も確認してみます。
図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でデータ処理を行う時に使うくらいだったので、気になりますね。