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' ]