AWS Resource ExplorerをSDK for JavaScript v3で操作してみた

2022.11.16

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

AWS Resource Explorerとは?

2022年11月8日(現地時間)にリリースされたばかりのサービスで、自分が作ったリソースをリージョンをまたいで検索できるというものです。

詳しくはこちらの記事をご覧ください。

[新機能] リージョン・サービスを横断してリソースを検索できる AWS Resource Explorer が使えるようになっていました

マネジメントコンソールから操作することもできますが、SDKも用意されているので、SDK for JavaScript v3を使って色々操作してみました。

環境

Node.js v14.17.4

Resource Explorerの有効化

まずマネジメントコンソールからResource Explorerを有効にします。

Resource Explorerを開き、「Resource Explorerをオンにする」

次に、「高速セットアップ」を選択し、アグリゲータインデックスリージョンを選択します。

最後に右下の「Resource Explorerをオンにする」をクリックすると、各リージョンにインデックスが作られます。

これだけでResource Explorerを有効にすることができました。とても簡単ですね。

用語について

この記事で登場するResource Explorerの用語について簡単に解説します。

インデックス(ローカル、アグリゲーター)

Resource Explorerをオンにすると、各リージョンでインデックスが作成されます。インデックスにはローカルインデックスとアグリゲータインデックスがあります。セットアップ画面でアグリゲータインデックスリージョンとして選択したリージョンにはアグリゲータインデックスが作成され、その他のリージョンにはローカルインデックスが作成されます。

リージョン内のリソースに関する情報は、それぞれのリージョンのローカルインデックスに保存されます。ローカルインデックスに保存された情報はアグリゲータインデックスにも複製されます。つまり、アグリゲータインデックスには他のリージョンの情報が集約されているということになります。リージョンをまたいで検索したい場合は、アグリゲータインデックスのあるリージョンを使います。

ビュー

リレーショナルデータベースのビューをイメージするとわかりやすいと思います。あらかじめ条件を絞り込んだ状態でビューを作成することで、都度クエリを実行しなくても条件に当てはまるリソースのみを表示させることができます。

インストール

それではこのResource ExplorerをSDKで操作していきましょう。

SDK v3になってから、パッケージを個別にインストールする仕組みになりました。Resource Explorerのクライアントをインストールします。また、私の場合は認証のパッケージも必要でしたので、あわせてインストールしています。

yarn add @aws-sdk/credential-providers
yarn add @aws-sdk/client-resource-explorer-2

インストールされたバージョンは3.210.0です。

クライアントのセットアップ

プロジェクトフォルダ内にindex.jsを作成します。以下、このファイルにコードを書いていきます。

Resource Explorerを使うためのコンフィグを行います。私はクレデンシャルファイルで設定したプロファイルを使うために、クレデンシャルの設定を行いました。

const Credential = require("@aws-sdk/credential-providers")
const ResorceExplorer = require("@aws-sdk/client-resource-explorer-2")

const client = new ResorceExplorer.ResourceExplorer2Client({
    credentials: Credential.fromIni({
        profile: "personal",
        mfaCodeProvider: async(mfaSerial) => {
            return "ワンタイムパスワード"
        }
    })
})

サポートされているリソースの種類を取得する

現時点では、全てのリソースが検索できるわけではないようです。Resource Explorerで検索できるリソースの種類は下記の公式ドキュメントに記載されています。

Resource types you can search for with Resource Explorer

この一覧をSDKで取得することができます。

const listSupportCommand = new ResorceExplorer.ListSupportedResourceTypesCommand({})
client.send(listSupportCommand).then(
    (data) => {
        console.log(`**** ${data.ResourceTypes.length}個 ****`)
        console.log(data.ResourceTypes)
    },
    (error) => {
        console.log(error)
    }
)

リソースを検索する

Resource Explorerのメインの用途です。これもSDKで操作してみます。

コードの内容としてはクエリを指定するだけというシンプルなものになります。

const searchCommand = new ResorceExplorer.SearchCommand({
    QueryString: "rds"
})
client.send(searchCommand).then(
    (data) => {
        console.log(`**** ${data.Resources.length}個 ****`)
        console.log(data.Resources)
    },
    (error) => {
        console.log(error)
    }
)

QueryStringに指定する文字列は、マネジメントコンソールのクエリに入力する文字列と同じものを指定します。

クエリにはキーワードを指定して検索できます。例えば「rds」と入力すると、RDSサービスに属するものの他、リソース名やタグに「rds」という文字列が含まれているものもヒットします。スペースを使用して複数のキーワードを指定すると、OR検索になります。

また、フィルタを指定して結果を厳密に絞り込むことができます。例えば、「service:rds」と入力すると、RDSサービスに属するリソースだけがヒットし、リソース名やタグにrdsという文字列が含まれるものは除外されます。フィルタを指定する場合、スペースを使用するとAND検索になります。「service:rds test」と入力すると、「RDSサービスに属するリソースのうち、testという文字列が含まれているもの」がヒットします。

その他にも、ワイルドカードやNOT検索など様々な検索方法があります。公式のユーザーガイドに詳しい説明が載っていますのでご覧ください。

Search query syntax reference for Resource Explorer

上記のコードを実行すると、マネジメントコンソールのクエリに「rds」と指定したのと同じリソースを取得できることがわかります。

ビューの作成

ビューを作成するには、フィルタ条件とビュー名を指定します。

const createViewCommand = new ResorceExplorer.CreateViewCommand({
    Filters: {
        FilterString: "service:rds"
    },
    ViewName: "rds-view"
})
client.send(createViewCommand).then(
    (data) => {
        console.log("**** ビュー作成完了 ****")
        console.log(data)
    },
    (error) => {
        console.log(error)
    }
)

ビューが作成されました。フィルタクエリもバッチリ設定できています。

このビューを使って検索してみると、フィルタクエリの通り、RDSサービスに属するリソースに絞られて表示されることがわかります。

ビュー一覧の取得

const listViewCommand = new ResorceExplorer.ListViewsCommand({})
client.send(listViewCommand).then(
    (data) => {
        console.log(`**** ${data.Views.length}個 ****`)
        console.log(data.Views)
    },
    (error) => {
        console.log(error)
    }
)

ビューの一覧が取得できます。

ビューにタグを追加

タグは複数指定できます。下記のコードでは、default-viewにNameタグとTestタグを設定しています。

const tagCommand = new ResorceExplorer.TagResourceCommand({
    resourceArn: "arn:aws:resource-explorer-2:ap-northeast-1:xxxxxxxxxxxx:view/default-view/xxxxxxxxxxx",
    Tags: {
        Name: "default",
        Test: "test"
    }
})
client.send(tagCommand).then(
    (data) => {
        console.log("**** タグ追加完了 ****")
        console.log(data)
    },
    (error) => {
        console.log(error)
    }
)

デフォルトビューの変更

現在、default-viewがデフォルトのビューとなっていますが、先ほど作ったrds-viewをデフォルトにしてみます。

デフォルトにしたいビューのARNを指定します。

const associateDefaultViewCommand = new ResorceExplorer.AssociateDefaultViewCommand({
    ViewArn: "arn:aws:resource-explorer-2:ap-northeast-1:xxxxxxxxxxxx:view/rds-view/xxxxxxxxxxxxx"
})
client.send(associateDefaultViewCommand).then(
    (data) => {
        console.log("**** デフォルトビュー変更完了 ****")
    },
    (error) => {
        console.log(error)
    }
)

rds-viewがデフォルトになりました。

インデックスタイプの更新

ローカルインデックスとアグリゲータインデックスがあると冒頭で説明しましたが、これらを切り替えることができます。(注意あり:後述)

現在、ap-northeast-1のインデックスはアグリゲータになっています。

これをローカルに変更してみます。

const updateIndexCommand = new ResorceExplorer.UpdateIndexTypeCommand({
    Arn: "arn:aws:resource-explorer-2:ap-northeast-1:xxxxxxxxxxxx:index/xxxxxxxxxxxx",
    Type: "LOCAL" // or "AGGREGATOR"
})
client.send(updateIndexCommand).then(
    (data) => {
        console.log("**** インデックス更新完了 ****")
    },
    (error) => {
        console.log(error)
    }
)

ローカルになりました。

注意:アグリゲータインデックスを削除/降格すると、次のアグリゲータインデックスを作成するまで24時間待つ必要があります。

AWS Resource Explorer のアグリゲータインデックスを削除/降格させると次のアグリゲータインデックスの準備まで 24 時間待つ必要がある

まとめ

新機能Resource ExplorerのSDKコマンドの一部を紹介しました。

本記事で紹介していないコマンドは、下記の公式ドキュメントをご覧ください。

Resource Explorer 2 Client - AWS SDK for JavaScript v3

AWSの機能を色々試していると、どのリージョンにどのリソースを作ったかつい忘れてしまい、消し忘れていないか不安になることがよくあります。このサービスを使えば、リージョンを横断して検索ができるので、そういった不安から解放されそうです。SDKでプログラムにも組み込めるので、意図しない検索結果だったら通知する仕組みを作ったりもできそうです。

使い方もシンプルでわかりやすいですし、とても便利なサービスだと感じました。