とある案件でタイトル通りの構成が必要になり、構築サーバー数も膨大なので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アドレスを保持できています。