EC2のプライベートIPアドレスを任意で割り当てる方法とサブネットCIDR予約

# はじめに
クラウド環境におけるIPアドレスは固定化せずにDHCPで動的に割り当てることがベストプラクティスとされていますが、特にオンプレミス環境からクラウド環境へリフトする場合、既存のアプリケーション上の制約やミドルウェアのライセンスの制約等で、どうしても任意のプライベートIPアドレスを割り当てないといけない場合があります。

そのような場合に任意のプライベートIPアドレスを割り当てる方法を紹介したいと思います。

- 【次】[AWS Backupからの復元時にEC2に任意のプライベートIPアドレスを割り当てる方法](https://qiita.com/sakai00kou/items/77eafd4600e96ef3c828)

## EC2におけるIPアドレスの変更タイミング
任意のプライベートIPアドレスを割り当てる方法を紹介する前に、EC2で使用するIPアドレスはどのタイミングで変更されるかを整理してみようと思います。

EC2のIPアドレスにはパブリックIPアドレスとプライベートIPアドレスがありますが、基本的にはどちらも起動時にDHCPでIPアドレスが割り当てられます。

DHCPの仕様上はDHCPのリース期間満了時に解放されて他で利用することができるようになりますが、AWSの場合は停止等を行ったタイミングで変更されます。

パブリックIPアドレスとプライベートIPアドレスでは、変更される契機が異なり、パブリックIPの場合は停止起動を行うことで解放されますが（`Elastic IP`未使用時）、プライベートIPの場合はインスタンスが存在している限り、変更されることはありません。

|事象|パブリックIPアドレス|プライベートIPアドレス|
|:--|:--|:--|
|インスタンス再起動|変更なし|変更なし|
|インスタンス停止・起動|変更|変更なし|
|インスタンス入れ替え|変更|変更|

バックアップからの復元等によるインスタンスの入れ替えは、AWSではマシンイメージからの再作成となるため、中身のデータとしてはバックアップ時のものとなりますが、入れ替え時にネットワーク関連の設定は再作成されるため、アドレスを引き継ぐようなことはできません。

もっと詳しく知りたい方は以下公式ドキュメントをご参照ください。

- [Amazon EC2 インスタンスの IP アドレス指定 - プライベート IPv4 アドレス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-private-addresses)
- [Amazon EC2 インスタンスの IP アドレス指定 - パブリック IPv4 アドレス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-public-addresses)

## パブリッククラウド環境におけるプライベートIPアドレスの任意指定
クラウド環境におけるIPアドレスの任意指定は、オンプレミス環境で固定IPを設定することとは異なり、今回で言えばEC2側でIPを手動で設定して固定するようなことはできません。

EC2側で固定IPを設定したとしても、AWS側から割り当てられたIPアドレスと異なるIPアドレスでは通信ができないようにAWS側で制御されているため、AWS側からDHCPで割り当てられたIPアドレスを使用するほかありません。

そのため、DHCPで割り当てられるIPアドレスを固定化するというアプローチが必要となりますので以下で紹介します。

- [新規作成するEC2に任意のプライベートIPアドレスを割り当てる場合](#新規作成するec2に任意のプライベートipアドレスを割り当てる場合)
- [既存のEC2に任意のプライベートIPアドレスを割り当てる場合](#既存のec2に任意のプライベートipアドレスを割り当てる場合)
- [バックアップイメージから任意のプライベートIPアドレスを割り当てたEC2を作成する場合](#バックアップイメージから任意のプライベートipアドレスを割り当てたec2を作成する場合)

### 新規作成するEC2に任意のプライベートIPアドレスを割り当てる場合
EC2作成時に、「**高度なネットワーク設定**」の項目から「**プライマリIP**」欄、または「**セカンダリIP**」欄に任意で指定したいIPアドレスを入力することで任意のIPアドレスを割り当てることができます。

但し、割り当てるIPアドレスは選択したサブネットの範囲内である必要があるためご注意ください。

![Monosnap_20240817_103944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/968542a8-2f4b-780e-6b78-f83c1397f36c.png)

プライマリIPとセカンダリIP、どちらで指定したほうが良いかは後述の「[プライマリIPで割り当てるか、セカンダリIPで割り当てるか](#プライマリipで割り当てるかセカンダリipで割り当てるか)」で私の考えを述べようと思うので、そちらを参考に導入するシステムの特性を考慮して選択するようにしてください。

### 既存のEC2に任意のプライベートIPアドレスを割り当てる場合
既存で動いているEC2に任意のIPアドレスを割り当てたい場合はセカンダリIPアドレスで設定する必要があります。

任意のIPアドレスを割り当てたいEC2を選択し、「**アクション**」→「**ネットワーキング**」→「**IPアドレスの管理**」に進みます。

![Monosnap_20240817_170406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/668a1419-727d-d30f-043a-aa770d4aefdd.png)

アタッチされているインタフェース名を選択すると、現在割り当てられているプライマリIPアドレスが表示されるため、「**新しいIPアドレスの割り当て**」で入力画面を表示させた後、任意で指定したいIPアドレスを入力し、「**保存**」すれば割り当てられます。

![Monosnap_20240817_170533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/32828c9b-7b67-31d1-1f5c-55ffa738ae9c.png)

全てのOSが同様の動作になるかはわかりませんが、`Amazon Linux 2023`で確認した限り、特にEC2の停止・起動を行わなくても1分ほどで自動で通信できるようになりました。

もししばらく待っても通信できない場合はEC2の再起動やネットワークサービスの再起動等を行ってください。

### バックアップイメージから任意のプライベートIPアドレスを割り当てたEC2を作成する場合
作成方法が違うだけで新規作成する場合とほぼ同様ですが、あらかじめバックアップしておいたマシンイメージ（`AMI`）から任意のプライベートIPアドレスを割り当てたEC2を作成する方法です。

既存のEC2をバックアップして、`AMI`から再作成することで、作成時にネットワークの設定を行うことができるので、新規作成時と同様に任意のIPアドレスを指定します。

バックアップは、バックアップしたいEC2を選択した状態で、「**アクション**」→「**イメージとテンプレート**」→「**イメージの作成**」から作成できます。

バックアップイメージからの作成は「**AMI**」→「**AMIからインスタンスを起動**」を選択することで、新規作成時と同じような画面が表示されるため、新規作成時と同様、「**高度なネットワーク設定**」から「**プライマリIP**」、もしくは「**セカンダリIP**」を指定します。

注意点として、バックアップイメージ元のEC2が（起動中・停止中問わず）存在しており、新しいEC2に割り当てたいIPアドレスがイメージ元のEC2でまだ使用されている場合は、後述の問題が発生するため「[プライマリIPで割り当てるか、セカンダリIPで割り当てるか](#プライマリipで割り当てるかセカンダリipで割り当てるか)」をご確認ください。

なお、バックアップイメージから復元する方法でも`AWS Backup`の機能で復元する場合はマネジメントコンソール上からの任意のIPアドレス指定はできないため、次回やり方を紹介したいと思います。

## プライマリIPで割り当てるか、セカンダリIPで割り当てるか
プライマリIPで割り当てたほうが良いか、セカンダリIPで割り当てたほうが良いかはシステム構成や運用方法によって異なりますが、プライマリIPで割り当てた場合は、例えばバックアップイメージから復旧する際、元のEC2が存在するとIPアドレスが被ってしまい、元のEC2を削除するまで復旧することができません。

セカンダリIPの場合は解放することができるので、元のEC2側でIPアドレスを解放してから新しいEC2側に割り当てることで、元のEC2を残したまま新しいEC2を起動することができますが、**プライマリIPは解放することができない**ため、EC2の削除が必須となってしまいます。

:::note info
更に補足すると、プライマリIPが割り振られているENIは他に代わりのENIをアタッチしたとしてもデタッチできないため、EC2を削除するしか方法がありません。
:::

![IP重複.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/efc95bf9-c4b5-2ea4-cbf5-e5bcc3caf13c.png)

じゃあ任意で割り当てたいIPアドレスについては常にセカンダリIPで割り当てれば良いかというとそんなこともなく、任意でIPを割り当てたい目的として特定のIPからのアクセス制御用途で使用する場合は注意が必要です。

通常EC2から発信（EC2からコネクションを開始）する際に使われる送信元IPアドレスはプライマリIPアドレスとなるため、発信元IPを任意のIPアドレスにする必要がある場合はプライマリIPで指定しないといけない可能性があります。

![アウトバウンド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/e31e6d85-1bc0-bf21-dec5-b1e4f358b71e.png)

発信IPではなく、何かしらのサービスを提供しているサーバで使用するIPを任意のIPアドレスで指定したい場合はセカンダリIPの指定でも問題ありません。

IP通信の仕様として、接続元の端末（下図でいうとクライアント）に応答する際のEC2側IPアドレスは、接続を受け付けた際のIPアドレスで応答するため、セカンダリIPアドレスでの指定でも問題がないこととなります。

![インバウンド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/6dcf1dd8-7562-0d33-360b-bcfe42254434.png)

上記を参考にしてプライマリIPで割り当てるかセカンダリIPで割り当てるかを検討してください。

## サブネットCIDR予約
上述の方法でEC2に任意のIPアドレスを割り当てることはできましたが、使用したかったIPアドレスがAWS側で既に割り当てられてしまっているということも無いとは言えません。

システム上、IPアドレスを任意で割り当てる必要がある場合は、あらかじめ任意で割り当てるIPアドレスの範囲を決めておき、動的に割り当てられないようにするのが良いでしょう。

- [サブネット CIDR 予約](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/subnet-cidr-reservation.html)

特定のIPアドレスのみAWS側から割り当てないようにするには、「**VPCダッシュボード**」→「**サブネット**」から指定のサブネットを選択し、「**アクション**」から「**CIDR予約を編集**」を選択します。

「**IPv4 CIDR予約を追加**」（IPv6の場合は「**IPv6**」タブから）を選択して、以下のように予約タイプとCIDRを指定することで、AWSから動的に割り当てたくないIPアドレス範囲を指定することができます。

![Monosnap_20240818_111608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/fa99fb5b-dbfe-033f-4b1c-00126f802f71.png)

上の設定の通り、AWSから割り当てないIPアドレスの範囲を指定する予約タイプは「**プレフィックス**」と「**明示的**」の二種類あります。

プレフィックスについてはあまり知りませんでしたが、プライマリIPやセカンダリIPを指定する場合と同様、「**高度なネットワーク設定**」から設定できる項目で、1つのEC2インスタンス内で複数のIPアドレスを使用するような場合（例えばコンテナを動かしてそれぞれにIPアドレスを割り当てる等）に、まとめて`/28`等で使用IPを割り当ててEC2内で使用するための機能のようです。

サブネットCIDR予約の「**プレフィックス**」も「**明示的**」も`10.1.10.0/28`等のサブネット区切りで指定することになりますが、「**プレフィックス**」はプレフィックスで使用するために予約しておきたい範囲を指定することで、割り当てないようにするタイプとなり、「**明示的**」は単純に任意でIPアドレスを割り当てたい範囲を指定して、AWS側から割り当てないようにするタイプとなります。

注意点として、予約タイプをプレフィックスとして指定すると、プレフィックスの指定でしか使用できなくなり、予約している範囲のIPアドレスをプライマリIPまたはセカンダリIPに任意に割り当てようとすると以下のように表示されて失敗します。

![Monosnap_20240818_123417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/ade3424d-c55f-d557-def9-f6d19314d09a.png)

逆に明示的で指定した場合はプライマリIP、セカンダリIP、プレフィックスどれでも予約アドレスの範囲を使用できるため、あらかじめこの範囲はプレフィックスとしてだけ使用すると決められている場合以外は明示的な設定で良いのではないかと思います。

# おわりに
今回はプライベートIPアドレスを任意で割り当てる方法をご紹介しました。

基本的には送信元IPアドレスの固定のためにIPアドレスを指定したい場合以外はセカンダリIPで指定したほうが良いと思います。

前述の通り、バックアップイメージからの復元方法としては、`AWS Backup`から復元する方法もありますが、`AWS Backup`のマネジメントコンソール画面上からではIPアドレスの指定を行うことができないため、`AWS Backup`から復元する際に任意のIPアドレスを指定する方法は次回紹介したいと思います。