Node.js で AWS のリージョンを取得するプログラムを作ってみた

Node.js で AWS リージョンを取得するプログラムの紹介です。
2022.06.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。アノテーションの中村(誠)です。
AWS を利用していると、リソースの一括展開や一括取得の際に、AWS のリージョンを取得したいことがあると思います。
弊社ブログや外部サイト等では、スクリプトによる取得方法が多数紹介されていますが、Node.js で実装している記事がヒットしなかったので作ってみました。

対象読者

・Node.js を使用している方
AWS SDK for JavaScript の基本的な使用方法がわかる方
・Node.js で AWS のリージョンを取得したい方

注意点

今回は Lambda での実行を想定しているので、ローカル環境などでの実行時には適宜コードを修正してください。

使用する API

DescribeRegions API を使用します。
AWS SDK for JavaScript では describeRegions を使用します。

Lambda

・ランタイム
Node.js 14.x

・実行ロール
以下の IAM ポリシーを付与しました。

AWSLambdaBasicExecutionRole
DescribeRegions

・コード

const AWS = require("aws-sdk");
AWS.config.update({ region: "ap-northeast-1" });
AWS.config.apiVersions = {
    ec2: "2016-11-15",
};
const ec2 = new AWS.EC2();

exports.handler = async (event) => {
    const result = await ec2.describeRegions().promise();
    const regions = result.Regions.map(region => region.RegionName);

    console.log(regions);
};

解説

ec2.describeRegions() で取得できるデータは以下のような JSON になっています。

{
  "Regions": [
    {
      "Endpoint": "ec2.eu-north-1.amazonaws.com",
      "RegionName": "eu-north-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.ap-south-1.amazonaws.com",
      "RegionName": "ap-south-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.eu-west-3.amazonaws.com",
      "RegionName": "eu-west-3",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.eu-west-2.amazonaws.com",
      "RegionName": "eu-west-2",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.eu-west-1.amazonaws.com",
      "RegionName": "eu-west-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.ap-northeast-3.amazonaws.com",
      "RegionName": "ap-northeast-3",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.ap-northeast-2.amazonaws.com",
      "RegionName": "ap-northeast-2",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.ap-northeast-1.amazonaws.com",
      "RegionName": "ap-northeast-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.sa-east-1.amazonaws.com",
      "RegionName": "sa-east-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.ca-central-1.amazonaws.com",
      "RegionName": "ca-central-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.ap-southeast-1.amazonaws.com",
      "RegionName": "ap-southeast-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.ap-southeast-2.amazonaws.com",
      "RegionName": "ap-southeast-2",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.eu-central-1.amazonaws.com",
      "RegionName": "eu-central-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.us-east-1.amazonaws.com",
      "RegionName": "us-east-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.us-east-2.amazonaws.com",
      "RegionName": "us-east-2",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.us-west-1.amazonaws.com",
      "RegionName": "us-west-1",
      "OptInStatus": "opt-in-not-required"
    },
    {
      "Endpoint": "ec2.us-west-2.amazonaws.com",
      "RegionName": "us-west-2",
      "OptInStatus": "opt-in-not-required"
    }
  ]
}

上記の JSON から、RegionName のみを抽出するために、map 関数を使用し、RegionName のみの配列を作成しています。
RegionName のみの配列は以下のようになります。

[
  "eu-north-1",
  "ap-south-1",
  "eu-west-3",
  "eu-west-2",
  "eu-west-1",
  "ap-northeast-3",
  "ap-northeast-2",
  "ap-northeast-1",
  "sa-east-1",
  "ca-central-1",
  "ap-southeast-1",
  "ap-southeast-2",
  "eu-central-1",
  "us-east-1",
  "us-east-2",
  "us-west-1",
  "us-west-2"
]

パラメーターについて

今回はパラメーターを指定しなかったので、アカウントで有効になっているリージョンのみを取得しましたが、AllRegions パラメーターを指定することで、無効になっているリージョンも含めたすべてのリージョンを取得することもできます。

const params = {
  AllRegions: true,
};

const result = await ec2.describeRegions(params).promise();

各パラメーターについては、AWS SDK for JavaScript の describeRegions を確認し、必要に応じて指定してください。

まとめ

今回は Node.js で AWS リージョンを取得するプログラムを作ってみました。
リージョンを取得後にループで全リージョンからリソース情報の一括取得などもできると思います。
基本的な内容ですが、参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。