Azure Resource IDを正規表現で取得 Regex to Azure ResourceID

AzureのリソースIDからサブスクリプションIDやリソースグループ名などを取得したいときもあると思う。

AzureのリソースID(ResourceID)とはAzure Resource Managerにおけるリソースの一意な識別子のことで、
以下のフォーマット。

/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}/p>

パラメーター必須type説明
subscriptionIdはい文字列 (GUID 形式)リソースを作成するときに用いたサブスクリプションID
resourceGroupNameはいstringリソースが所属しているリソースグループ名
resourceProviderNamespaceはいstringリソース プロバイダー名
resourceTypeはいstringリソース プロバイダーの名前空間を含むリソースの種類
resourceNameはいstringリソースの名前
Azure Resource IDのパラメータ

たまにリソースの中に入れ子でリソースがある時があり、以下のようにフォーマットから外れるものも存在。
拡張リソースというらしい。

/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{baseResourceProviderNamespace}/{baseResourceType}/{baseResourceName}/providers/{extensionResourceProviderNamespace}/{extensionResourceType}/{extensionResourceName}

SQL Databaseあたりはこの拡張リソース。

/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.SQL/servers/serverName/databases/databaseName

Regex

前置きが長くなったが、拡張リソースの場合は置いておき、通常のパターンのフォーマットを正規表現で要素ごとに取得する。

作成した正規表現。

"\^/subscriptions/([a-f\\d\]{8}-[a-f\\d\]{4}-[a-f\\d\]{4}-[a-f\\d\]{4}-[a-f\\d\]{12})/resource[gG]roups/([a-zA-Z\\d\-\_\.\(\)].{1,90})/providers/([a-zA-Z\.\\d]+)/([a-zA-Z]+)/(.+)"

テスト

nodejsでテスト。

azureResourceRegex = new RegExp("\^/subscriptions/([a-f\\d\]{8}-[a-f\\d\]{4}-[a-f\\d\]{4}-[a-f\\d\]{4}-[a-f\\d\]{12})/resource[gG]roups/([a-zA-Z\\d\-\_\.\(\)].{1,90})/providers/([a-zA-Z\.\\d]+)/([a-zA-Z]+)/(.+)")
id = "/subscriptions/11111111-1111-4111-1111-111111111111/resourcegroups/resourcegroupname/providers/Microsoft.providername/resourcetype/resourcename"
console.log(id.match(azureResourceRegex));

要素毎に取得できた

[
  "/subscriptions/11111111-1111-4111-1111-111111111111/resourcegroups/rg-hoge/providers/Microsoft.ContainerInstance/containerGroups/aaaaaaa",
  "11111111-1111-4111-1111-111111111111",
  "resourcegroupname",
  "Microsoft.providername"
  "resourcetype",
  "resourcename",
  index: 0,
  input: '/subscriptions/11111111-1111-4111-1111-111111111111/resourcegroups/rg-hoge/providers/Microsoft.ContainerInstance/containerGroups/aaaaaaa']
]

拡張リソースでもテスト。

azureResourceRegex = new RegExp("\^/subscriptions/([a-f\\d\]{8}-[a-f\\d\]{4}-[a-f\\d\]{4}-[a-f\\d\]{4}-[a-f\\d\]{12})/resource[gG]roups/([a-zA-Z\\d\-\_\.\(\)].{1,90})/providers/([a-zA-Z\.\\d]+)/([a-zA-Z]+)/(.+)")
id = "/subscriptions/11111111-1111-4111-1111-111111111111/resourcegroups/rg-hoge/providers/Microsoft.SQL/servers/serverName/databases/databaseName"
console.log(id.match(azureResourceRegex));

結果。
一応エラーはなく、ResourceNameのところが長く出る。

[ '/subscriptions/11111111-1111-4111-1111-111111111111/resourcegroups/rg-hoge/providers/Microsoft.SQL/servers/serverName/databases/databaseName',
  '11111111-1111-4111-1111-111111111111',
  'rg-hoge',
  'Microsoft.SQL',
  'servers',
  'serverName/databases/databaseName',
  index: 0,
  input: '/subscriptions/11111111-1111-4111-1111-111111111111/resourcegroups/rg-hoge/providers/Microsoft.SQL/servers/serverName/databases/databaseName' ]

コメントする

メールアドレスが公開されることはありません。