【AWS】ラクラク！IPアドレス制限にはマネージドプレフィックスリストを作って共有して使おう！

# はじめに
AWSで社内向けの環境を構築する際に、IPアドレスで接続元を制限することは皆さんもよくあるのではないでしょうか。AWSでは、セキュリティグループで接続を許可するIPアドレスやポートを指定できますが、これをセキュリティグループごと、AWSアカウントごとに対処していたら、設定の更新などで管理が大変です。
そこで役に立つのがマネージドプレフィックスリストです。1度作成したらセキュリティグループの間で流用でき、Resource Access Manager (RAM)を使えばAWSアカウントを跨いでも共有できます。

今回は、そんなマネージドプレフィックスリストを作成し、Organizationsの組織内で共有するまでをご紹介します。

本記事は以下の方向けを想定しています。
* AWSでIPアドレス制限が必要なリソースを構築している方
* マルチアカウントを管理している方

# マネージドプレフィックスリストって？
マネージドプレフィックスリストは、あらかじめ定義しておくIPアドレス(CIDR)のリストです。
AWSマネージドプレフィックスリストとカスタマーマネージドプレフィックスリストの2種類があります。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/managed-prefix-lists.html

**AWSマネージドプレフィックスリスト**は、その名の通り、AWSが管理しているプレフィックスリストで、AWSのサービス(CloudFront、DynamoDB、Route 53、S3など)が使用するIPアドレスが登録されています。リストの登録内容はマネジメントコンソールやAWS CLIなどから確認できます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/working-with-aws-managed-prefix-lists.html

画像は、本記事執筆時点でのマネジメントコンソールで確認したDynamoDBのマネージドプレフィックスリストです。所有者がAWSになっていますね。
DynamoDBが利用するIPアドレスはこのリストで指定された範囲であり、通信をDynamoDBのみに制限したい場合はこちらのプレフィックスリストをセキュリティグループで指定すればよいわけです。
変更があった場合もAWSによって更新されるため、ユーザー側で修正する必要がありません。
![AWSマネージドプレフィックスリストの例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/e7ac759c-d128-4ce1-8e65-49f8103c6ff8.png)

:::note warn
逆に言うと、ユーザーはAWSマネージドプレフィックスリストを編集できません。
:::

**カスタマーマネージドプレフィックスリスト**は、ユーザーが自由に作成できるプレフィックスリストで、今回はこちらを使用します。
マネジメントコンソール上ではAWSマネージドプレフィックスリストと並んで表示されます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/working-with-managed-prefix-lists.html

# カスタマーマネージドプレフィックスリストの作り方
それでは、カスタマーマネージドプレフィックスリストを作成していきましょう。
今回は後で共有することを考えて、Organizationsの管理アカウントで作業します。

## ウェイト/最大エントリ数について
作成する前に1点だけ、マネージドプレフィックスリストを使用する上で理解しておくべきことがあります。

マネージドプレフィックスリストはセキュリティグループに関連付けて使用しますが、そのセキュリティグループには設定できるルールの上限(クォータ)があります。申請により値を緩和することはできますが、有限です。

マネージドプレフィックスリストを指定してルールを設定する場合にクォータの計算に用いられるのがウェイト/最大エントリ数です。
いずれも、セキュリティグループにおけるルール数として換算した場合の値を示し、AWSマネージドプレフィックスリストではウェイト、カスタマーマネージドプレフィックスリストでは最大エントリ数と呼ばれます。

:::note
セキュリティグループ当たりのインバウンドルールまたはアウトバウンドルールの数のデフォルト値は60です。
参考：[Amazon VPC クォータ - Amazon Virtual Private Cloud](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-security-groups)
:::

## 作成するときの注意
カスタマーマネージドプレフィックスリスト作成時には、最大エントリ数を指定する必要があるのですが、前述の通り実際に登録するエントリ数よりむやみに大きい値を設定すると、セキュリティグループに指定できるルール数のクォータを無駄に消費してしまいます。
ですので、実際に指定するエントリ数に近い値を設定しましょう。なお、作成後に後から最大エントリ数を増減させることもできます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/security-group-rules.html#security-group-size

:::note
登録しようとしているIPアドレスが連続している場合は、`192.168.1.0/24`のようにCIDR表記でまとめるとエントリ数を減らせます。
:::

## 手順
マネージドプレフィックスリストはVPCの画面から確認、作成できます。
VPCの「仮想プライベートクラウド」内に「マネージドプレフィックスリスト」があります。

![マネージドプレフィックスリスト作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/932ac58c-3731-42c6-be93-68685daaced3.png)

まず、入力する必要がある項目は「プレフィックスリスト名」と「最大エントリ」の2点です。いずれも作成後に変更可能です。「アドレスファミリー」はデフォルトでIPv4が指定されているので、変更する必要はないことが多いでしょう。

次に、「プレフィックスリストのエントリ」に登録するIPアドレスまたはCIDRブロックを追加します。後からでも追加、編集できるので、ぱぱっと登録してしまいましょう。

![入力後の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/52e3d91f-a9d7-493c-b6fd-e5942c92742d.png)

「プレフィックスリストを作成」をクリックすると、作成が完了します。
![作成完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/bd033b31-764b-414e-a15f-0c3000131575.png)

:::note
プレフィックスリストを更新すると、更新前の登録内容は過去バージョンとして残ります。過去に使っていたバージョンを後から復元することも可能です。
:::

# カスタマーマネージドプレフィックスリストの共有
カスタマーマネージドプレフィックスリストを作成したところで、今度は別のAWSアカウントに共有する設定をします。
今回はOrganizationsの管理アカウントで作業し、組織全体に共有するよう設定しますが、子アカウントから組織全体に共有することも可能です(管理の面では推奨しませんが……)。

1つのAWSアカウントしか利用されていない方は、マネージドプレフィックスリストの作成までで十分です。

## 共有する側
リソースを共有するにはRAMを使用しますが、RAMの画面を開かなくてもプレフィックスリストの画面にある「共有」タブから直接共有設定画面に飛べます。
![共有タブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/401a8551-013c-4d5a-bfcd-f4c7ffeca74b.png)

### 1. リソース共有の詳細を指定
このステップでは、共有するリソースを指定します。
カスタマーマネージドプレフィックスリストを共有するには、リソースとして「プレフィックスリスト」を選択します。
改めて見ると、GlueやSagemaker、ネットワーク関連のリソースなど結構な種類のリソースを共有できることに気づきます。

![リソースの指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/e37e44c5-ea06-4c80-8eb7-b86ce82d8afd.png)

### 2. マネージド型アクセス許可を関連付ける
このステップでは、アクセス許可を指定します。
修正する必要はないのでそのまま次に進みます。

![アクセス許可](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/814f073a-ddf7-44c4-b7a4-a115f201a42b.png)

### 3. プリンシパルにアクセス権限を付与する
このステップでは、共有先のプリンシパルを指定します。
共有先は、Organizationsの組織全体または組織単位、個別のAWSアカウント、IAMロール、またはIAMユーザーに対応しています。
ここでは、「自分の組織内でのみ共有を許可」を選択し、プリンシパルとしてOrganizationsの組織全体を指定します。

![プリンシパル指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/4ce4dcf3-4a1d-418c-97f7-1fa5b974b6e7.png)

### 4. 確認と作成
このステップでは、入力した内容を確認します。
問題なければ、「リソース共有を作成」をクリックします。

![確認画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/1cc387af-83c7-4fcd-92f5-29e29c604db2.png)

### 5. 共有完了
以上でカスタマーマネージドプレフィックスリストを組織内のアカウントに共有する設定が完了しました。
![共有完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/788017e3-411b-4fb2-8f85-b25bddfc343f.png)

## 共有される側
共有される側では何も操作する必要はありません。
共有設定が完了したら、以下のように対象のリソースが出現するようになります。

![共有される側](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/570a6c17-d210-4f32-bb3d-d03166d6ea9a.png)

セキュリティグループの作成画面でもソースとして指定できるようになります。
![セキュリティグループ作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/da21bb91-04db-4293-ad1c-773c91981a17.png)

なお、共有されたプレフィックスリストは編集できません。変更が必要な場合は所有者に問い合わせるとよいでしょう。

:::note warn
共有されたプレフィックスリストを使用する場合は、登録内容や用途を把握した上で使用するようにしましょう。誤って別のプレフィックスリストを指定すると、アクセス範囲の設定誤りによる誤開示につながりかねません。
:::

# メリット
カスタマーマネージドプレフィックスリストを作成してリソース共有するメリットをまとめてみます。
基本的に複数のAWSアカウントを使用するなら作成して損はないでしょう。

## 一元管理できる
マネージドプレフィックスリストを共有すると、共有先全てで利用できるようになり、漏れがなくなります。特にOrganizationsの組織全体や組織単位に共有しておけば、子アカウントが増えた場合でも最初から利用可能です。

また、登録内容を更新すると共有先にも反映されるため、個別に対応する必要がなくなります。個別に作成して、設定ミスや登録内容が古いままという事態を防ぐことができます。


## 利用状況を把握できる
マネージドプレフィックスリストの詳細画面の「関連付け」タブでは、プレフィックスリストが関連付けられているセキュリティグループを確認できますが、こちらは共有先で関連付けられている情報も表示されます。
Organizationsで管理している場合、全ての子アカウントでしっかりと関連付けされているかを確認できるため、管理者目線では設定漏れの把握にも便利でしょう。

![関連付けタブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830637/602394a6-fdf0-4ddf-af8f-c833df5dac52.png)

# おわりに
今回は、カスタマーマネージドプレフィックスリストを作成し、Organizationsの組織内で共有するまでの流れをご紹介しました。

私も最初はセキュリティグループに個別にIPアドレスを指定していましたが、この機能を活用してからは毎回設定する煩わしさが解消されました。
一度使ったら楽なこと間違いなしですので、ぜひ活用してみてください。