はじめに
EC2
インスタンスにて、プライベートなIPアドレスをあるインスタンスから別のインスタンスに引き継ぐしたいということがあった。
その際の作業手順をメモしておく。
ユースケース
- 起動済みのあるインスタンスから、別のインスタンスへのIPアドレスを引き継ぐ。
(起動済み→起動済みの引き継ぎはできない。そのため、起動済みインスタンスから、AMI
で起動するインスタンスへの引き継ぎとなる。)
準備
EC2
インスタンスを2台用意しておく。
EC2インスタンスの作成
どちらも下記のような構成
※前回の記事と同じ構成
項目 | 設定値 |
---|---|
OS | AmazonLinux2023 |
アーキテクチャ | 64 ビット(Arm) |
インスタンスタイプ | t4g.nano |
ストレージ | 8GB(gp3) |
事前確認
EC2インスタンス1個目 (EC2-ENI-test-1)
- IPの確認
ip a
[ec2-user@ip-172-31-43-212 ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 0e:1c:83:aa:34:61 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-090cf549c8113ae9e
altname device-number-0
inet 172.31.43.212/20 metric 512 brd 172.31.47.255 scope global dynamic ens5
valid_lft 3357sec preferred_lft 3357sec
inet6 fe80::c1c:83ff:feaa:3461/64 scope link
valid_lft forever preferred_lft forever
eni-090cf549c8113ae9e
であることがわかった。
※メタデータでも取得できるらしいが、うまく行かなかったのでコンソールから調査した。
EC2インスタンス2個目 (EC2-ENI-test-2)
- IPの確認
ip a
[ec2-user@ip-172-31-39-61 ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 0e:53:98:11:de:71 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-0017418a115ee264b
altname device-number-0
inet 172.31.39.61/20 metric 512 brd 172.31.47.255 scope global dynamic ens5
valid_lft 3296sec preferred_lft 3296sec
inet6 fe80::c53:98ff:fe11:de71/64 scope link
valid_lft forever preferred_lft forever
eni-0017418a115ee264b
であることがわかった。
流れ
前提
EC2-ENI-test-1
(172.31.43.212
) のIPアドレスをEC2-ENI-test-2
に移行する。EC2-ENI-test-2
についている(172.31.39.61
) のIPアドレスは使わない。
手順
EC2-ENI-test-1
に紐づいているENI
の削除時の動作を変更する。(終了時に削除しないように)EC2-ENI-test-1
に のインスタンスを削除する。EC2-ENI-test-2
のAMI
を作成する。- 3で作成したAMIを起動し、
EC2-ENI-test-1
のENI
をアタッチする。
EC2インスタンスの削除時の動作を変更する
削除する EC2-ENI-test-1
のインスタンスを選択し、ネットワーキング
を調べる。
「インスタンスの削除時に削除
」の「有効化」のチェックを外す。
こうすることで、インスタンスの削除時にENIは削除されなくなる。
EC2インスタンス (EC2-ENI-test-1
) を終了する
メニューから、インスタンス
→ EC2-ENI-test-1
を選択し、
アクションから「インスタンスを終了
」をする。
EC2-ENI-test-2
のAMIを作成する
※既存のインスタンスに対して、プライマリENIは削除、変更できないので、
AMIを作成して、EC2-ENI-test-2
のインスタンスと同じインスタンスを作成する。
そこに EC2-ENI-test-1
のENIをアタッチすることにした。
※プライマリENIをデタッチしようとすると、 「The network interface at device index 0 and networkCard index 0 cannot be detached.」
とエラーが出る。
AMI
を作成する。EC2-ENI-test-2
を選択し、アクション
→ イメージとテンプレート
→ イメージを作成
をする。
EC2-ENI-test-2
のAMIからインスタンスを作成する
※参考
現在のENIの状態 eni-090cf549c8113ae9e
はデタッチされており、利用可能な状態。
メニュー → AMI
から、先ほど作成した AMI
を選択する。
その後、 AMIからインスタンスを起動
をする。
インスタンスの作成 & ENIのアタッチ
ネットワーク
→ 編集
にて、 ENI
と同じサブネットを選択する。
選択すると、 高度なネットワーク設定
ができるようになる。高度なネットワーク設定
から ネットワークインターフェース
で ENIを選択する。
※このときセキュリティグループを新規に作成するとエラーが出るので、「既存のセキュリティグループを選択する」を押して、共通のセキュリティグループには何も選択しないこと。
また、 パブリック IP の自動割り当て
も 無効化
にしないとエラーが出るので注意。
作成した EC2インスタンス
に、eni-090cf549c8113ae9e
のENIがアタッチされていることを確認する。172.31.43.212
のプライベートIPアドレスがついていることを確認。
確認
EC2
インスタンスの起動後、下記でip
を確認する。
[ec2-user@ip-172-31-43-212 ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 0e:1c:83:aa:34:61 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-090cf549c8113ae9e
altname device-number-0
inet 172.31.43.212/20 metric 512 brd 172.31.47.255 scope global dynamic ens5
valid_lft 3285sec preferred_lft 3285sec
inet6 fe80::c1c:83ff:feaa:3461/64 scope link
valid_lft forever preferred_lft forever
無事、プライベートIPが引き継ぎできた。EC2-ENI-test-2
に引き継げないので、 AMI
から作成したものにつけている。
ここが今回の肝となる部分だった。
参考
- 新規EC2に既存のプライベートIPアドレス及びMACアドレスを引き継ぐ
https://blog.serverworks.co.jp/ec2-ip-take-over - ネットワーク設定を変更してインスタンスへ接続出来なくなった場合の対処方法
https://dev.classmethod.jp/articles/tsnote-ec2-secondary-eni-001/ - Elastic Network Interface
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html
おわりに
起動済みのEC2インスタンスから、インスタンスへIPが変更できるものかと思っていたが、実際に調査/検証するとそうではないことがわかった。
プライマリENIが変更できないというのは知っておいてよかった事実なので書いてよかったと思った。
今後は引き継ぎしたいIPアドレスがEC2インスタンスに引っ付いている場合、AMIを作成する or EC2インスタンスを終了するの手段で解決できるので活用していきたい。