EC2インスタンスのプライベートIPアドレスを引き継ぐ

はじめに

EC2 インスタンスにて、プライベートなIPアドレスをあるインスタンスから別のインスタンスに引き継ぐしたいということがあった。
その際の作業手順をメモしておく。

ユースケース

  • 起動済みのあるインスタンスから、別のインスタンスへのIPアドレスを引き継ぐ。
    (起動済み→起動済みの引き継ぎはできない。そのため、起動済みインスタンスから、AMIで起動するインスタンスへの引き継ぎとなる。)

準備

  • EC2 インスタンスを2台用意しておく。

EC2インスタンスの作成

どちらも下記のような構成
前回の記事と同じ構成

項目設定値
OSAmazonLinux2023
アーキテクチャ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 IDの確認 EC2 コンソールから、インスタンスを選択する。
    その後、「ネットワーキング」タブを開きネットワークインターフェースを確認する。
    confirm-eni-ec2-1

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 IDの確認 EC2 コンソールから、インスタンスを選択する。
    その後、「ネットワーキング」タブを開きネットワークインターフェースを確認する。
    confirm-eni-ec2-2

eni-0017418a115ee264b であることがわかった。

流れ

前提

  • EC2-ENI-test-1 (172.31.43.212) のIPアドレスをEC2-ENI-test-2 に移行する。
  • EC2-ENI-test-2についている(172.31.39.61) のIPアドレスは使わない。

手順

  1. EC2-ENI-test-1 に紐づいているENIの削除時の動作を変更する。(終了時に削除しないように)
  2. EC2-ENI-test-1 に のインスタンスを削除する。
  3. EC2-ENI-test-2 の AMI を作成する。
  4. 3で作成したAMIを起動し、EC2-ENI-test-1ENI をアタッチする。

EC2インスタンスの削除時の動作を変更する

削除する EC2-ENI-test-1 のインスタンスを選択し、ネットワーキング を調べる。
take-over-ip-1

インターフェイスID をクリックする。
take-over-ip-2

終了時の動作を変更」をクリックする。
take-over-ip-3

インスタンスの削除時に削除」の「有効化」のチェックを外す。
こうすることで、インスタンスの削除時にENIは削除されなくなる。
take-over-ip-4

EC2インスタンス (EC2-ENI-test-1) を終了する

メニューから、インスタンスEC2-ENI-test-1 を選択し、
アクションから「インスタンスを終了」をする。
delete-ec2-instance-1
delete-ec2-instance-2

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 を選択し、
アクションイメージとテンプレートイメージを作成 をする。
create-ami-1

入力をして、「イメージを作成」をする。
create-ami-2

メニュー → AMIを押し、進捗を確認しておく。
create-ami-3

利用可能になればOK!
create-ami-4

EC2-ENI-test-2 のAMIからインスタンスを作成する

※参考
現在のENIの状態 eni-090cf549c8113ae9e はデタッチされており、利用可能な状態。
list-eni-1

メニュー → AMI から、先ほど作成した AMI を選択する。
その後、 AMIからインスタンスを起動 をする。
create-ec2-instance-from-ami-1

インスタンスの作成 & ENIのアタッチ

ネットワーク編集 にて、 ENIと同じサブネットを選択する。
選択すると、 高度なネットワーク設定 ができるようになる。
高度なネットワーク設定 から ネットワークインターフェース で ENIを選択する。
※このときセキュリティグループを新規に作成するとエラーが出るので、「既存のセキュリティグループを選択する」を押して、共通のセキュリティグループには何も選択しないこと。 また、 パブリック IP の自動割り当て無効化 にしないとエラーが出るので注意。

下記の設定でインスタンスを作成した。
create-ec2-instance-from-ami-2

作成した 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

172.31.43.212 で問題なし。
list-ec2-instance-1

無事、プライベートIPが引き継ぎできた。
EC2-ENI-test-2 に引き継げないので、 AMI から作成したものにつけている。
ここが今回の肝となる部分だった。

参考

おわりに

起動済みのEC2インスタンスから、インスタンスへIPが変更できるものかと思っていたが、実際に調査/検証するとそうではないことがわかった。
プライマリENIが変更できないというのは知っておいてよかった事実なので書いてよかったと思った。
今後は引き継ぎしたいIPアドレスがEC2インスタンスに引っ付いている場合、AMIを作成する or EC2インスタンスを終了するの手段で解決できるので活用していきたい。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。