Alibaba Cloud環境でeth0のネットワークインターフェース名を設定できるのか検証してみた

はじめに

こんにちは!エンジニアの成島です。
今回はAlibaba Cloudでeth0のネットワークインターフェース名を設定する方法があるのか、というのを検証していきます。

通常Alibaba Cloudにて環境構築する際に各リソースに名前をつけて管理しますよね。
もちろんネットワークインターフェースにも名前をつけて管理すると思います。
しかし、Alibaba CloudではコンソールやCLIからECSを作成する際にeth0のネットワークインターフェース名をつけることはできません。
ネットワークインターフェースを個別で作成する際には名前をつけることはできますが、
個別で作成したネットワークインターフェースをECSにアタッチしても、それはeth1になってしまいます。
作成後に変更すればいいのでは?と考える方もいるかと思いますが、なんとコンソール及びCLIでeth0の名前を変更することも不可能なのです。

つまり現状eth0のネットワークインターフェース名を設定する方法はありません。

どうにかしてeth0の名前をつけたかったので、模索した結果、
ある方法を使えばeth0のネットワークインターフェース名を設定できる可能性があるという情報が見つかりました。

それは、起動テンプレートを使用するという方法です。
これだけ他の方法では設定できないものを起動テンプレートを使うことで設定できるのか、まだまだ信じられないですね。
実例は見つかりませんでしたが、確かに公式ドキュメント等を調べてみると、設定自体は可能であるかのような記載があります。
それでは、起動テンプレートを使用したら本当にeth0に名前をつけることができるのか、というのを検証していきましょう。

プロダクト紹介

起動テンプレート

起動テンプレートとは、その名の通り、ECSを作成する際の多様な設定をひとまとめにテンプレート化したものになります。
同様な設定を含んだECSを複数台作成したい、という時に毎回毎回コンソールで同設定値を選び作成するのでは手間がかかります。
そのような時に起動テンプレートを使用すると簡単に同設定のECSを作成することができます。
詳細は以下をご覧ください。
起動テンプレートとは

実際にやってみよう

実際にAlibaba Cloud環境で起動テンプレートを使用してeth0のネットワークインターフェース名を設定できるか検証してみましょう。
起動テンプレート作成といっても、いくつか方法があるので、
今回は以下の3パターンで起動テンプレートを使用してeth0のネットワークインターフェース名を設定できるか確認していきたいと思います。

・Alibaba Cloudコンソールを使用した起動テンプレート作成
・Alibaba Cloud CLIを使用した起動テンプレート作成
・Terraformを使用した起動テンプレート作成

■事前のポイント紹介
検証を終えて分かったポイントは以下です。
・起動テンプレート作成のCLIコマンドが正常終了しても値が正常に反映されているとは限らない
・CLIで作成した起動テンプレートをコンソールから使用する際には制限があるため注意が必要
起動テンプレート作成時に指定したパラメータの有効性は、テンプレートを使用してインスタンスを作成するまで確認できない
詳細は記事の中で紹介しているので、留意しながら読み進めてください。

パターン1. Alibaba Cloudコンソールを使用した起動テンプレート作成

まずは視覚的にも分かりやすいと思うので、コンソールを使用して起動テンプレートを作成していきます。
本当にeth0のネットワークインターフェース名を設定できるのか、という観点で検証していくので、パラメータは簡潔にしています。

またパターン3まで共通で以下のパラメータで起動テンプレートを作成していきます。

サイト:国際サイト
リージョン:東京
価格モデル:従量課金
ゾーン:A
インスタンスタイプ:ecs.sn2ne.large
イメージ:CentOS 7.7 64-bit
ストレージ(システムディスク):Ultraクラウドディスク 40GB
VPC:任意のVPC
VSwitch:任意のVSwitch
セキュリティグループ:任意のセキュリティグループ

01. Alibaba Cloud コンソールから起動テンプレートを選択

以下のように画面を遷移
[Alibaba Cloudコンソール]→[Elastic Compute Service]→[デプロイメント & スケーリング]→[インスタンス起動テンプレート]

f:id:sbc_narushima:20200623163726p:plain

02. テンプレート作成画面へ

[テンプレートの作成]を押下

f:id:sbc_narushima:20200623163130p:plain

03. パラメータ設定

各種パラメータを設定

f:id:sbc_narushima:20200623163123p:plain

どんどん設定していき、ネットワークインターフェースの設定まで行くと、

f:id:sbc_narushima:20200623163117p:plain

ん、、、

ネットワークインターフェース名の設定欄がありません。

ということで、Alibaba Cloudコンソールから起動テンプレートを作成する際には、
通常のECS作成時と同様にeth0のネットワークインターフェース名を設定することはできませんでした。
残念です、、CLIまたはTerraformに頼るしかなさそうですね、、

パターン2. Alibaba Cloud CLIを使用した起動テンプレート作成

Alibaba Cloudコンソールではeth0のネットワークインターフェース名の設定はできませんでしたが、
CLIを使用したら本当に設定できるのか、というのを検証していきたいと思います。

なお、今回はCLIのインストール方法については割愛します。
またAliyunのバージョンは「3.0.9」を使用します。

01. API確認

まずはAlibaba Cloud CLIで起動テンプレートを作成するコマンドを確認していきます。
コマンドの構成は以下のようになっているので、分かるところからあたりを付けていきます。

aliyun <product> <ApiName> --parameter Value

おそらくproductはECSで、Templateという文字列が入っているだろうと当たりをつけ、Grepしてみます。

# aliyun ecs --help |grep Template
  CreateLaunchTemplate
  CreateLaunchTemplateVersion
  DeleteLaunchTemplate
  DeleteLaunchTemplateVersion
  DescribeLaunchTemplateVersions
  DescribeLaunchTemplates
  ModifyLaunchTemplateDefaultVersion

CreateLaunchTemplateというAPIがありましたね。
間違いないので今回はaliyun ecs CreateLaunchTemplateを使用していきます。

02. リクエストパラメータ確認

次にどのようなパラメータが存在するのか確認していきます。

# aliyun ecs CreateLaunchTemplate --help
Alibaba Cloud Command Line Interface Version 3.0.9

Product: Ecs (Elastic Compute Service)
Link:    https://help.aliyun.com/api/ecs/CreateLaunchTemplate.html

Parameters:
  --LaunchTemplateName                      String  Required 
  --RegionId                                String  Required 
  --AutoReleaseTime                         String  Optional 
  --DataDisk.n.Category                     String  Optional 
  --DataDisk.n.DeleteWithInstance           Boolean Optional 
  --DataDisk.n.Description                  String  Optional 
  --DataDisk.n.Device                       String  Optional 
  --DataDisk.n.DiskName                     String  Optional 
  --DataDisk.n.Encrypted                    String  Optional 
  --DataDisk.n.Size                         Integer Optional 
  --DataDisk.n.SnapshotId                   String  Optional 
  --Description                             String  Optional 
  --EnableVmOsConfig                        Boolean Optional 
  --HostName                                String  Optional 
  --ImageId                                 String  Optional 
  --ImageOwnerAlias                         String  Optional 
  --InstanceChargeType                      String  Optional 
  --InstanceName                            String  Optional 
  --InstanceType                            String  Optional 
  --InternetChargeType                      String  Optional 
  --InternetMaxBandwidthIn                  Integer Optional 
  --InternetMaxBandwidthOut                 Integer Optional 
  --IoOptimized                             String  Optional 
  --KeyPairName                             String  Optional 
  --NetworkInterface.n.Description          String  Optional 
  --NetworkInterface.n.NetworkInterfaceName String  Optional 
  --NetworkInterface.n.PrimaryIpAddress     String  Optional 
  --NetworkInterface.n.SecurityGroupId      String  Optional 
  --NetworkInterface.n.VSwitchId            String  Optional 
  --NetworkType                             String  Optional 
  --PasswordInherit                         Boolean Optional 
  --Period                                  Integer Optional 
  --RamRoleName                             String  Optional 
  --ResourceGroupId                         String  Optional 
  --SecurityEnhancementStrategy             String  Optional 
  --SecurityGroupId                         String  Optional 
  --SpotDuration                            Integer Optional 
  --SpotPriceLimit                          Float   Optional 
  --SpotStrategy                            String  Optional 
  --SystemDisk.Category                     String  Optional 
  --SystemDisk.Description                  String  Optional 
  --SystemDisk.DiskName                     String  Optional 
  --SystemDisk.Iops                         Integer Optional 
  --SystemDisk.Size                         Integer Optional 
  --Tag.n.Key                               String  Optional 
  --Tag.n.Value                             String  Optional 
  --TemplateResourceGroupId                 String  Optional 
  --TemplateTag.n.Key                       String  Optional 
  --TemplateTag.n.Value                     String  Optional 
  --UserData                                String  Optional 
  --VSwitchId                               String  Optional 
  --VersionDescription                      String  Optional 
  --VpcId                                   String  Optional 
  --ZoneId                                  String  Optional 

リクエストパラメータがたくさん存在していますね。
お目当のネットワークインターフェース関連のものがあるか、更にGrepしてみると、

# aliyun ecs CreateLaunchTemplate --help | grep NetworkInterface
  --NetworkInterface.n.Description          String  Optional 
  --NetworkInterface.n.NetworkInterfaceName String  Optional 
  --NetworkInterface.n.PrimaryIpAddress     String  Optional 
  --NetworkInterface.n.SecurityGroupId      String  Optional 
  --NetworkInterface.n.VSwitchId            String  Optional 

「--NetworkInterface.n.NetworkInterfaceName」というパラメータがありますね。
これは期待できそう!

03. 起動テンプレート作成

任意のパラメータを設定し、コマンドを実行してみます。

aliyun ecs CreateLaunchTemplate \
--LaunchTemplateName "template-test" \
--RegionId "ap-northeast-1" \
--ImageId "centos_7_7_x64_20G_alibase_20200426.vhd" \
--InstanceChargeType "PostPaid" \
--InstanceName "ecs-template-test" \
--InstanceType "ecs.sn2ne.large" \
--InternetChargeType "PayByTraffic" \
--NetworkInterface.0.Description "test0" \
--NetworkInterface.0.NetworkInterfaceName "eni-template-eth0" \
--NetworkInterface.0.PrimaryIpAddress "192.168.10.40" \
--NetworkInterface.0.SecurityGroupId "sg-xxxxxxxxxxxxxxxxxxxx" \
--NetworkType "vpc" \
--SecurityGroupId "sg-xxxxxxxxxxxxxxxxxxxx" \
--SystemDisk.Category "cloud_efficiency" \
--SystemDisk.Size "40" \
--VSwitchId "vsw-xxxxxxxxxxxxxxxxxxxxx" \
--VpcId "vpc-xxxxxxxxxxxxxxxxxxxxx" \
--ZoneId "ap-northeast-1a"

※NetworkTypeを指定しないとコンソールから本起動テンプレートを使用する際にVPCまわりの設定が正常に反映されません。
指定しなかった場合のデフォルトは「vpc」になっていますが、明示的に指定してください。
※ImageIdは最新のもの以外を指定するとコンソールから本起動テンプレートを使用する際に正常に反映されません。
最新のイメージIDを指定してください。
どちらもCLIでのみ起動テンプレートを使用する際には問題ありません。

コマンドは正常に実行され、以下のように出力されました。

{
  "RequestId": "BC75C06F-7304-4203-BCB5-2B78DC0776D3",
  "LaunchTemplateId": "lt-xxxxxxxxxxxxxxxxxxxx"
}

04. 作成された起動テンプレート確認

実際に作成された起動テンプレートを確認していきます。

aliyun ecs DescribeLaunchTemplateVersions \
--RegionId "ap-northeast-1" \
--LaunchTemplateId "lt-xxxxxxxxxxxxxxxxxxxx"

※DescribeLaunchTemplatesを使用するとネットワークインターフェース情報が出力されません。
DescribeLaunchTemplateVersionsを使用することでネットワークインターフェース情報が出力されます。
以下のように出力されました。

{
  "TotalCount": 1,
  "PageSize": 10,
  "RequestId": "76077BFF-83C4-4F6A-BC14-4AA560FE2753",
  "PageNumber": 1,
  "LaunchTemplateVersionSets": {
    "LaunchTemplateVersionSet": [
      {
        "LaunchTemplateName": "template-test",
        "LaunchTemplateData": {
          "ZoneId": "ap-northeast-1a",
          "DataDisks": {
            "DataDisk": []
          },
          "InstanceChargeType": "PostPaid",
          "SecurityGroupId": "sg-xxxxxxxxxxxxxxxxxxxx",
          "VSwitchId": "vsw-xxxxxxxxxxxxxxxxxxxxx",
          "SystemDisk.Size": 40,
          "InternetChargeType": "PayByTraffic",
          "InstanceName": "ecs-template-test",
          "VpcId": "vpc-xxxxxxxxxxxxxxxxxxxxx",
          "NetworkType": "vpc",
          "NetworkInterfaces": {
            "NetworkInterface": []
          },
          "ImageId": "centos_7_7_x64_20G_alibase_20200426.vhd",
          "SystemDisk.Category": "cloud_efficiency",
          "InstanceType": "ecs.sn2ne.large",
          "Tags": {
            "InstanceTag": []
          }
        },
        "CreatedBy": "218565085724061885",
        "ModifiedTime": "2020-06-17T07:36:08Z",
        "CreateTime": "2020-06-17T07:36:08Z",
        "DefaultVersion": true,
        "LaunchTemplateId": "lt-xxxxxxxxxxxxxxxxxxxx",
        "VersionNumber": 1
      }
    ]
  }
}

NetworkInterfacesのブロックに値が入っていません。
国際サイトのドキュメントセンターを確認するとNetworkInterface.N.NetworkInterfaceNameについて以下のように記載されています。
「注 NetworkInterface.NパラメーターのNの値は1を超えることはできません。」
公式ドキュメントの記述の通り設定した値「NetworkInterface.0」では値は反映されないようです。

05. 起動テンプレート作成2回目

「NetworkInterface.0」のパラメータを全て「NetworkInterface.1」に変更し、再度起動テンプレートを作成してみます。

--NetworkInterface.1.Description "test0" \
--NetworkInterface.1.NetworkInterfaceName "eni-template-eth0" \
--NetworkInterface.1.PrimaryIpAddress "192.168.10.40" \
--NetworkInterface.1.SecurityGroupId "sg-xxxxxxxxxxxxxxxxxxxx" \

コマンドは正常に実行されました。

06. 作成された起動テンプレート確認2回目

該当ブロックは以下のように出力されました。

          "NetworkInterfaces": {
            "NetworkInterface": [
              {
                "Description": "test0",
                "SecurityGroupId": "sg-xxxxxxxxxxxxxxxxxxxx",
                "NetworkInterfaceName": "eni-template-eth0",
                "PrimaryIpAddress": "192.168.10.40"
              }
            ]
          },

値が正常に入っているようです。
これはちょっと期待できそうですね!

07. テンプレートからECS起動

作成した起動テンプレートからECSを起動します。

aliyun ecs RunInstances \
--RegionId "ap-northeast-1" \
--LaunchTemplateId "lt-xxxxxxxxxxxxxxxxxxxx"

コマンドは正常に実行され、以下のように出力されました。

{
  "RequestId": "C78C6D36-1F27-46A7-8D10-C865258E1A2B",
  "InstanceIdSets": {
    "InstanceIdSet": [
      "i-xxxxxxxxxxxxxxxxxxxx"
    ]
  }
}

08. ネットワークインターフェース名の確認

eth0のネットワークインターフェース名が設定されたか、確認してみましょう。

# aliyun ecs DescribeNetworkInterfaces \
--RegionId "ap-northeast-1" \
--InstanceId "xxxxxxxxxxxxxxxxxxxx"

※DescribeInstancesを使用するとネットワークインターフェース情報が一部しか出力されません。
DescribeNetworkInterfacesを使用することで詳細なネットワークインターフェース情報が出力されます。
以下のように出力されました。

{
  "TotalCount": 2,
  "RequestId": "14F4C388-CDD1-411E-9EC1-4C227C23FCCE",
  "PageSize": 10,
  "NextToken": "AAAAAdDWBF2w6Olxc+cMPjUtUMp8waxPcU1tpxXNQ60SMqYycbOMeqxjyxEDHlDdNM5rPQ==",
  "PageNumber": 1,
  "NetworkInterfaceSets": {
    "NetworkInterfaceSet": [
      {
        "Status": "InUse",
        "PrivateIpAddress": "192.168.10.40",
        "Description": "test0",
        "ZoneId": "ap-northeast-1a",
        "ResourceGroupId": "",
        "InstanceId": "i-xxxxxxxxxxxxxxxxxxxx",
        "VSwitchId": "vsw-xxxxxxxxxxxxxxxxxxxxx",
        "NetworkInterfaceName": "eni-template-eth0",
        "Attachment": {},
        "NetworkInterfaceId": "eni-xxxxxxxxxxxxxxxxxxxx",
        "MacAddress": "00:16:3e:00:41:37",
        "SecurityGroupIds": {
          "SecurityGroupId": [
            "sg-xxxxxxxxxxxxxxxxxxxx"
          ]
        },
        "Type": "Secondary",
        "QueueNumber": 2,
        "Ipv6Sets": {
          "Ipv6Set": []
        },
        "VpcId": "vpc-xxxxxxxxxxxxxxxxxxxxx",
        "OwnerId": xxxxxxxxxxxxxxxx,
        "AssociatedPublicIp": {},
        "CreationTime": "2020-06-17T08:00:44Z",
        "PrivateIpSets": {
          "PrivateIpSet": [
            {
              "PrivateIpAddress": "192.168.10.40",
              "AssociatedPublicIp": {},
              "Primary": true
            }
          ]
        }
      },
      {
        "Status": "InUse",
        "PrivateIpAddress": "192.168.10.47",
        "ZoneId": "ap-northeast-1a",
        "ResourceGroupId": "",
        "InstanceId": "i-xxxxxxxxxxxxxxxxxxxx",
        "VSwitchId": "vsw-xxxxxxxxxxxxxxxxxxxxx",
        "Attachment": {},
        "NetworkInterfaceId": "eni-yyyyyyyyyyyyyyyyyyyy",
        "MacAddress": "00:16:3e:00:13:a5",
        "SecurityGroupIds": {
          "SecurityGroupId": [
            "sg-xxxxxxxxxxxxxxxxxxxx"
          ]
        },
        "Type": "Primary",
        "QueueNumber": 2,
        "Ipv6Sets": {
          "Ipv6Set": []
        },
        "VpcId": "vpc-xxxxxxxxxxxxxxxxxxxxx",
        "OwnerId": xxxxxxxxxxxxxxxx,
        "AssociatedPublicIp": {},
        "CreationTime": "2020-06-17T08:00:38Z",
        "PrivateIpSets": {
          "PrivateIpSet": [
            {
              "PrivateIpAddress": "192.168.10.47",
              "AssociatedPublicIp": {},
              "Primary": true
            }
          ]
        }
      }
    ]
  }
}

2つのブロックに分かれ、ネットワークインターフェースの情報が出力されています。
「Type」が「Primary」となっているブロックがあり、このブロックがeth0を意味しています。
あれ、、、
このeth0のブロックには各種設定が入っていません。
「Type」が「Secondary」となっているブロック、これがeth1となりますが、
インターフェース名などの設定情報は全てこのeth1のブロックに入っていました。
ということでAlibaba Cloud CLIを使用したeth0のネットワークインターフェース名の設定は不可能でした。

パターン3. Terraformを使用した起動テンプレート作成

Alibaba Cloudコンソール及びAlibaba Cloud CLIではeth0のネットワークインターフェース名の設定はできませんでしたが、
Terraformを使用したら本当に設定できるようになるのか、というのを検証していきたいと思います。
※CLIが不可能な時点で望み薄ですが、、、

なお、今回はTerraformのインストール方法については割愛します。
またTerraformのバージョンは「0.12.24」を使用します。

01. 変数ファイル準備

事前に変数ファイルを準備しておきます。

# vi terraform.tfvars

以下のように記載します。

access_key = "xxxxxxxxxxxxxxxxxxxxxxxx"
secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
region = "ap-northeast-1"
zone = "ap-northeast-1a"

02. Provider設定

Providerの設定を行います。

# vi 00_common.tf

以下のように記載します。

# CommonEnv
# from terraform.tfvars
variable "access_key" {}
variable "secret_key" {}
variable "region" {}
variable "zone" {}

provider "alicloud" {
   access_key           = var.access_key
   secret_key           = var.secret_key
   region               = "ap-northeast-1"
}

03. terraform初期化設定

以下のコマンドを実行し、必要なプラグインをダンロードします。

# terraform init

04. 起動テンプレート作成用tfファイル作成

起動テンプレート作成用のtfファイルを作成します。

# vi 10_launch_template.tf

以下のように記載します。

resource "alicloud_launch_template" "template" {
  name                          = "tf-template-test"
  image_id                      = "centos_7_7_x64_20G_alibase_20200426.vhd"
  instance_charge_type          = "PostPaid"
  instance_name                 = "tf-ecs-template-test"
  instance_type                 = "ecs.sn2ne.large"
  internet_charge_type          = "PayByTraffic"
  network_type                  = "vpc"
  security_group_id             = "sg-xxxxxxxxxxxxxxxxxxxx"
  system_disk_category          = "cloud_efficiency"
  system_disk_size              = 40
  vswitch_id                    = "vsw-xxxxxxxxxxxxxxxxxxxxx"
  vpc_id                        = "vpc-xxxxxxxxxxxxxxxxxxxxx"
  zone_id                       = "ap-northeast-1a"
  network_interfaces {
    name              = "eth0"
    description       = "test0"
    primary_ip        = "192.168.10.40"
    security_group_id = "sg-xxxxxxxxxxxxxxxxxxxx"
    vswitch_id        = "vsw-xxxxxxxxxxxxxxxxxxxxx"
  }
}

記述方法はTerraformの公式ドキュメントを参考にしています。
alicloud_launch_template

本ページにeth0のインスタンス名を設定できそうな記述がありましたので、採用しました。

05. terraform実行

仮実行し、構文に問題ないか確認します。

# terraform plan

問題なければ以下を実行します。

# terraform apply

コマンドは正常に実行され、以下のように出力されました。

alicloud_launch_template.template: Creating...
alicloud_launch_template.template: Creation complete after 1s [id=lt-xxxxxxxxxxxxxxxxxxxx]

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

06. 作成された起動テンプレート確認

実際に作成された起動テンプレートを確認していきます。

aliyun ecs DescribeLaunchTemplateVersions \
--RegionId "ap-northeast-1" \
--LaunchTemplateId "lt-xxxxxxxxxxxxxxxxxxxx"

該当ブロックは以下のように出力されました。

  "NetworkInterfaces": {
            "NetworkInterface": [
              {
                "Description": "test0",
                "VSwitchId": "vsw-xxxxxxxxxxxxxxxxxxxxx",
                "SecurityGroupId": "sg-xxxxxxxxxxxxxxxxxxxx",
                "NetworkInterfaceName": "eth0",
                "PrimaryIpAddress": "192.168.10.40"
              }
            ]
          },

値は正常に入っています。
果たして、、、

07. テンプレートからECS起動

作成した起動テンプレートからECSを起動します。

aliyun ecs RunInstances \
--RegionId "ap-northeast-1" \
--LaunchTemplateId "lt-xxxxxxxxxxxxxxxxxxxx"

コマンドは正常に実行され、以下のように出力されました。

{
  "RequestId": "C78C6D36-1F27-46A7-8D10-C865258E1A2B",
  "InstanceIdSets": {
    "InstanceIdSet": [
      "i-xxxxxxxxxxxxxxxxxxxx"
    ]
  }
}

08. ネットワークインターフェース名の確認

願いを込め、eth0のネットワークインターフェース名が設定されたか、確認してみましょう。

# aliyun ecs DescribeNetworkInterfaces \
--RegionId "ap-northeast-1" \
--InstanceId "i-xxxxxxxxxxxxxxxxxxxx"

該当ブロックは以下のように出力されました。

{
  "NetworkInterfaceSets": {
    "NetworkInterfaceSet": [
      {
        "PrivateIpAddress": "192.168.10.40",
        "Description": "test0",
        "ZoneId": "ap-northeast-1a",
        "InstanceId": "i-xxxxxxxxxxxxxxxxxxxx",
        "VSwitchId": "vsw-xxxxxxxxxxxxxxxxxxxxx",
        "NetworkInterfaceName": "eth0",
        "NetworkInterfaceId": "eni-xxxxxxxxxxxxxxxxxxxx",
        "Type": "Secondary",
        "VpcId": "vpc-xxxxxxxxxxxxxxxxxxxxx",
        "PrivateIpSets": {
          "PrivateIpSet": [
            {
              "PrivateIpAddress": "192.168.10.40",
              "AssociatedPublicIp": {},
              "Primary": true
            }
          ]
        }
      },
      {
        "PrivateIpAddress": "192.168.10.50",
        "ZoneId": "ap-northeast-1a",
        "InstanceId": "i-xxxxxxxxxxxxxxxxxxxx",
        "VSwitchId": "vsw-xxxxxxxxxxxxxxxxxxxxx",
        "NetworkInterfaceId": "eni-yyyyyyyyyyyyyyyyyyyy",
        "Type": "Primary",
        "VpcId": "vpc-xxxxxxxxxxxxxxxxxxxxx",
        "PrivateIpSets": {
          "PrivateIpSet": [
            {
              "PrivateIpAddress": "192.168.10.50",
              "AssociatedPublicIp": {},
              "Primary": true
            }
          ]
        }
      }
    ]

なんと、、、
完全に敗北です。。。
設定した値は全てSecondary(つまりeth1)に反映されており、
eth0には値が反映されませんでした。
ということで、Terraformで作成した起動テンプレートでeth0のネットワークインターフェース名を作成することは不可能でした。
Terraformの公式ドキュメントの記述例は以下ですが、これでは誰もがeth0の名前をつけれると勘違いするので、変更していただきたいですね。。。

  network_interfaces {
    name              = "eth0"
    description       = "hello1"
    primary_ip        = "10.0.0.2"
    security_group_id = "xxxx"
    vswitch_id        = "xxxxxxx"
  }

さいごに

今回の焦点としては起動テンプレートを使用するとeth0のネットワークインターフェース名を設定できるのか、ということでしたので
結論から言うと、eth0のネットワークインターフェース名を設定できなかったということになります。

つまり、冒頭にも記載した通り、現状eth0のネットワークインターフェース名を設定する方法はありません。

今回はコンソール、CLI、Terraformという3パターンで起動テンプレートを使用した検証を行いました。
CLIやTerraformの公式ドキュメントを見ると、あたかも設定が可能であるかのような記載がされていましたが、
結果としてeth0のネットワークインターフェース名の設定は不可能でしたので、
eth0のネットワークインターフェース名の設定を含んだ環境構築の際には注意が必要です。
基本設計時においてもこの制約を把握して設計することが大切となります。

eth0の名前を設定できない点については、Alibaba Cloud側にリクエストを送り、現在修正を依頼中です。
今後の仕様変更に期待しましょう。

それではまたいつかお会いしましょう。