👻
東京リージョンの EC2 で使用される IP アドレスの範囲を取得する
はじめに
東京リージョンの 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
参考サイト
- Karmaで「error TS2468: Cannot find global value 'Promise'.」の対象方法 - nwtgck / Ryo Ota
- AWS IP アドレスの範囲 - Qiita
- aws-cloudfront-samples/update_security_groups_lambda at master · aws-samples/aws-cloudfront-samples
環境
% 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