【Terraform】複数nic(ENI)を持つEC2を構築する

とある案件でタイトル通りの構成が必要になり、構築サーバー数も膨大なのでTerraformでやろう!と思い色々試行錯誤してみました。

いくつか、つまずいたポイントもあったので、併せて記載しておきます。

$ terraform -version
Terraform v0.13.1
+ provider registry.terraform.io/hashicorp/aws v3.64.2

下記がEC2、ENI、EIPの定義ymlです。

resource "aws_network_interface" "ec22nic1" {
  subnet_id       = aws_subnet.public1.id
  private_ips     = ["10.60.0.11"]
  security_groups = [aws_security_group.ec2pub.id]
}

resource "aws_network_interface" "ec22nic2" {
  subnet_id       = aws_subnet.public2.id
  private_ips     = ["10.200.0.11"]
  security_groups = [aws_security_group.ec2pub.id]
}

resource "aws_instance" "ec22nic" {
  ami           = "ami-0318ecd6d05daa212"
  instance_type = "t2.micro"
  key_name = aws_key_pair.ec22nic.id
  network_interface {
    network_interface_id = aws_network_interface.ec22nic1.id
    device_index         = 0
  }
  network_interface {
    network_interface_id = aws_network_interface.ec22nic2.id
    device_index         = 1
  }
  tags = {
    Name = "2nic-instance"
  }
}

resource "aws_eip" "ec22nic" {
  network_interface = aws_network_interface.ec22nic1.id
  vpc        = true
  depends_on = [aws_internet_gateway.main]
}

引っ掛った点としては、以下でした。


・aws_instanceより先にnetwork_interfaceが作られる必要がある(当然か)

・割り当てられるnetwork_interfaceの数はEC2インスタンスタイプによって制限される

・resource “aws_instance”に通常定義するvpc_security_group_idやsubnet_idは記述しない
(security groupはENIに紐づくのでaws_instanceでは定義しない、subnetはEC2に割り当てたENIが存在するsubnetに自動で配置される)

・resource “aws_eip”では、instanceではなくnetwork_interfaceを指定する

なお、既にrunningのEC2にはnetwork_interfaceをattacheする方法の方が良いそうです。

こちらは構築後、EC2にSSHしてipアドレスを確認した結果です。

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-10-60-0-11 ~]$ ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 06:95:8d:2d:a1:4f brd ff:ff:ff:ff:ff:ff
    inet 10.60.0.11/16 brd 10.60.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::495:8dff:fe2d:a14f/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1:  mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 06:36:35:b9:25:bf brd ff:ff:ff:ff:ff:ff
    inet 10.200.0.11/16 brd 10.200.255.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::436:35ff:feb9:25bf/64 scope link 
       valid_lft forever preferred_lft forever

期待通り複数ipアドレスを保持できています。