👻

東京リージョンの EC2 で使用される IP アドレスの範囲を取得する

2021/11/28に公開

はじめに

東京リージョンの EC2 で使用される IP アドレスの範囲を取得する必要があったので試してみる。

現在使用している IP アドレス範囲が JSON 形式で 公開 されているので、以下の条件でフィルタリングすれば良さげ。

  • region が ap-northeast-1
  • service が EC2

とてもわかりやすいリファレンスは以下。
AWS IP アドレスの範囲 - AWS 全般のリファレンス

jq

お手軽に jq を使った場合。リファレンスのサンプル、ほぼそのまま 😅

% END_PONT="https://ip-ranges.amazonaws.com/ip-ranges.json"
% curl -s "${END_PONT}" | jq -r '.prefixes[] | select(.region=="ap-northeast-1") | select(.service=="EC2") | .ip_prefix' | sort

TypeScript

AWS CDK に組み込む予定(Yes! 力技)なので TypeScript で実装してみる。

fetch-ip-ranges.ts
import axios from 'axios';

const END_POINT = 'https://ip-ranges.amazonaws.com/ip-ranges.json';

type Prefix = {
  ip_prefix: string;
  region: string;
  service: string;
  network_border_group: string;
};

type IpRanges = {
  syncToken: string;
  createDate: string;
  prefixes: Prefix[];
};

const filterByServiceAndRegion = (prefixes: Prefix[]) => {
  return prefixes.filter(
    (p: Prefix) => p.region === 'ap-northeast-1' && p.service === 'EC2'
  );
};

const fetchIpRangesPrefixes = async () => {
  try {
    const res = await axios.get(END_POINT);
    const ranges = res.data as IpRanges;

    return filterByServiceAndRegion(ranges.prefixes);
  } catch (e) {
    if (axios.isAxiosError(e)) {
      throw new Error(e.message);
    }
    return [];
  }
};

const main = async () => {
  const prefixes = await fetchIpRangesPrefixes();
  prefixes.forEach((p) => {
    console.log(p.ip_prefix);
  });
};

main();

実行

% npx ts-node fetch-ip-ranges.ts

ハマったところ

async や await を使用すると以下のエラーが発生。

error TS2468: Cannot find global value 'Promise'.

以下で解決(マジですか 🤣

% npm i -D @types/node

参考サイト

環境

% sw_vers
ProductName:    macOS
ProductVersion: 11.3.1
BuildVersion:   20E241

% jq --version
jq-1.6

% tsc --version
Version 4.5.2

% npx ts-node --version
v10.4.0

Discussion