はじめに

みなさんはAmazon VPC IP Address Manager (IPAM)をご存知でしょうか?
AWSの中で使用するIPアドレスの管理をすることができるサービスで、従来Excelなどを使って作成していたIPアドレス管理表の代替となる便利なサービスです。

https://docs.aws.amazon.com/ja_jp/vpc/latest/ipam/what-it-is-ipam.html

IPAMを使うと、AWSアカウントの中で課金されているパブリックIPアドレスを探すこともできます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/ipam/view-public-ip-insights.html

今回はこの機能を使用して、Organizationsの配下にあるAWSアカウントの中で使われているパブリックIPを一括で調査してみました。
ちょっとしたつまずきもあったので、気づきも含めて手順を記載します。

なお、本記事ではAWS Organizationsについての説明は割愛させていただきますのでご了承ください。

背景

まずは、今回IPAMを使ってパブリックIP課金を調査することになった背景について説明します。

私が個人利用しているAWSアカウントでは、リソースの消し忘れや不正利用に気づけるようにAWS Budgetsの予算アクションという機能を活用しています。
https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/budgets-controls.html

また、私は個人アカウントの管理にOrganizationsを使用しています。
管理アカウントで請求情報やもらったクレジットを管理し、実際に検証したりハンズオンしたりするときは新しいメンバーアカウントを適宜作成しています。
そして、これらのアカウントをIAM Identity Centerで一括管理するという環境になっています。

このような環境で、管理アカウントでのみ予算アクションを設定しておき、Organizations全体の請求額を監視するという仕組みにしています。

今までの利用傾向を元に10ドル、8ドルという閾値を設定しているのですが、警告メールがつい最近届きました。

管理アカウントのBilling and Cost Managementの画面から請求情報を確認したところ、VPCの請求が毎日0.24ドル発生していることがわかりました。

より詳しく見ていくと、「Idle public IPv4 address」の料金であることがわかりました。

ということで、このパブリックIP課金がどのアカウントで発生しているのかを調べる必要が出てきました。
IAM Identity Centerを使用しているので一つ一つのアカウントを調べるのはそこまで苦ではないのですが、せっかくならOrganizations配下のアカウントに対して一括で調査したいと思ったのが、今回の背景になります。

少し前置きが長くなってしまいましたが、ここから具体的に今回やったことについて書いていきます。

パブリックIP課金が発生しているメンバーアカウントでの作業と見え方

今回、パブリックIP課金が発生していたメンバーアカウントを特定するのはすぐにできたので、まずはそのアカウントでIPAMを有効にしていきます。
「データレプリケーションを許可」にチェックを入れた上で名前を設定し、検知するリージョンには全てのリージョンを設定します。
他の設定はデフォルトのままで、IPAMを作成します。

しばらく待機するとIPAMの画面が更新されるので待ちます。
画面が更新されると、「パブリック IP に関するインサイト」の画面で関連付けられていないEIPを特定することができました。

画面の下部にはより詳細な情報が記載されています

ここまでが、Organizationsを使ってない場合の一般的なIPAMの使い方になります

なお、IPAMで他のアカウントの情報も連携する時には、左のメニューの「組織設定」から設定を入れていくことになります。
試しにこのアカウントで組織設定を開いてみると、「このアカウントをIPAMの管理に使うアカウントにすることはできない」という旨のメッセージが表示されていました。

管理アカウントでの作業と見え方

まず最初に目指したのは、Organizationsの管理アカウントからパブリックIPの管理ができるようにすることです。
なので、管理アカウントでIPAMの設定を入れてみました。

とりあえず、管理アカウントでも前述の手順と同じようにIPAMを作成にしました。
なお、私は管理アカウントでリソースを作ったりしていないので、IPAMを作成して十分な時間が経っても「パブリック IP が見つかりません」と表示されました。

ここで左のメニューから「組織設定」を開くと、設定に関する注意書きが表示されています

Your IPAM is not discovering your organiziation’s resources. For IPAM to discover resources in your entire organization you must delegate an account in your organization as the IPAM administrator. You cannot delegate the organization management account as the IPAM administrator.

(翻訳)IPAMが組織のリソースを検出しない。 IPAMが組織全体のリソースを検出するには、組織内のアカウントをIPAM管理者として委任する必要があります。 組織管理アカウントをIPAM管理者として委任することはできない。

どうやら、Organizationsの管理アカウントでIPAMの管理を行うことはできず、別のメンバーアカウントをIPAMの管理アカウントにする必要があるようです。

ということで、「委任」をクリックした後に、別のメンバーアカウントのアカウントIDを記載してみます。
ここで設定したアカウントは、今回パブリックIP課金が発生していたメンバーアカウントとは別のアカウントです。

ちなみに、「詳細を表示」をクリックするとメンバーアカウントの情報を引っ張ってくるために必要なIAMロールの情報が見れます

ポリシー全文はこんな感じでした

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "IPAMDiscoveryDescribeActions",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeAccountAttributes",
        "ec2:DescribeAddresses",
        "ec2:DescribeByoipCidrs",
        "ec2:DescribeIpv6Pools",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DescribePublicIpv4Pools",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSecurityGroupRules",
        "ec2:DescribeSubnets",
        "ec2:DescribeVpcs",
        "ec2:DescribeVpnConnections",
        "ec2:GetIpamDiscoveredAccounts",
        "ec2:GetIpamDiscoveredResourceCidrs",
        "globalaccelerator:ListAccelerators",
        "globalaccelerator:ListByoipCidrs",
        "organizations:DescribeAccount",
        "organizations:DescribeOrganization",
        "organizations:ListAccounts",
        "organizations:ListDelegatedAdministrators"
      ],
      "Resource": "*"
    },
    {
      "Sid": "CloudWatchMetricsPublishActions",
      "Effect": "Allow",
      "Action": "cloudwatch:PutMetricData",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "cloudwatch:namespace": "AWS/IPAM"
        }
      }
    }
  ]
}

IPAMを有効化したアカウントに対して、このIAMロールを自動で作成する仕組みのようです。

設定が完了すると、「IPAM の委任された管理者」の欄に先ほど入力したアカウントの情報が記載されます。

IPAMの管理用アカウントでの作業と見え方

今度は、先ほどOrganizationsの管理アカウントで委任先に設定したメンバーアカウントにログインします。

IPAMの画面に移動すると、IPAMの管理先として設定されている旨がちゃんと表示されています!

組織の IPAM の委任管理者であることを検出しました。IPAM を作成すると、組織のすべてのアカウントのリソースが監視されます。

このアカウントではまだIPAMを作成していなかったので、IPAMを作成し少し待ちます。
すると、別のアカウントで放置されているEIPを検知してくれました!

※アカウントIDをマスキングするとわかりにくいので、ここでは一部のみマスキングしてアカウントが違うことがわかるようにしています。

画面下部に記載されている詳細情報を見ると、EIPが放置されているアカウントのIDやEIPのリソース名などもちゃんと検知していることが確認できます。

このように、Organizations配下のアカウントで使われているパブリックIPの管理を、IPAMで一括管理する設定が無事にできました。

なお、今回実施した設定はAWS公式ドキュメントに正確な情報が記載されていますので、実際に作業をする際にはこちらも併せてご覧ください
https://docs.aws.amazon.com/ja_jp/vpc/latest/ipam/enable-integ-ipam.html

まとめ

Organizationsを使用している環境でIPAMを活用することで、パブリックIPの利用状況の管理が効率化できることがわかりました。
また、Organizationsの管理アカウントではIPAMの一括管理設定をすることができず、メンバーアカウントでIPAMの一括管理をする必要があることがわかりました。

AWSのマルチアカウントのベストプラクティスでは、ログ保管や請求など役割によってOrganizationsのOUを分ける設計が紹介されています。
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_ous_best_practices.html

今回もその考え方に近い考え方であることがわかったので、実際に使用する時はネットワーク管理者用のアカウントを用意した上でIPAMの管理を委任すると良いでしょう。

この記事が誰かの助けになれば嬉しいです!