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 | リソースの名前 | 
たまにリソースの中に入れ子でリソースがある時があり、以下のようにフォーマットから外れるものも存在。
拡張リソースというらしい。
/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' ]