このエントリは2023/12/09現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。
問い合わせ
いつもの人から以下のような問い合わせをもらった。
Azure API Management (以下、APIM) のサブスクリプションを使って利用者を判別しているのだが、通常だとキーはシステム任せで32桁のランダムな文字列が生成される。このキーを管理者が指定した文字列に変更したい。どうすればいいか?
確かにAzure Portalだと以下のように再生成はできるものの、管理者の指定した文字列を設定できるようにはなっていない(そもそも管理者の指定した文字列がセキュアである保証があるか、という問題もあるが、それには触れないでおく)。

ということで、実現性はあるのか否か、実現できるとしたらどのような方法があるのか、という問い合わせを受けた次第。
方法
PowerShellもしくはREST APIを使うと、Subscriptionに対する設定変更が可能である。Azure CLIではコマンドがないので設定変更できない点に注意。
Subscription – Update (REST API)
https://learn.microsoft.com/rest/api/apimanagement/subscription/update
Set-AzApiManagementSubscription (PowerShell)
https://learn.microsoft.com/powershell/module/az.apimanagement/set-azapimanagementsubscription
Let’s try it!
以下のようなサブスクリプションがあるとして(わかりやすくするためにサブスクリプションキーを表示している)。。。

REST APIの場合
PATCH https://management.azure.com/subscriptions/<SubscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ApiManagement/service/<APIM_Name>/subscriptions/<APIM_SubscriptionName>?api-version=2022-08-01
{
"properties": {
"primaryKey": "logicojp-12345",
"secondaryKey": "logicojp-54321"
}
}
REST APIを使う場合、HTTP HeaderとしてIf-Matchを渡す必要があるが、無条件のアップデートであれば、アスタリスク (*) を指定すればよい。
成功すれば200が返ってくる。再度Azure Portalから確認すると、以下の通り設定が反映されていることがわかる。

PowerShellの場合
設定方法が違うだけで、やっていることはかわらない。今回はCloud Shellから試す。
$apimContext = New-AzApiManagementContext -ResourceGroupName <ResourceGroup> -ServiceName <APIM_Name>
Set-AzApiManagementSubscription -Context $apimContext -SubscriptionId <APIM_SubscriptionName> -PrimaryKey "うそぴょーん" -SecondaryKey "そりゃそうよ、おーん"
再度Azure Portalから確認すると、以下のように無事に変更されていることがわかる。今回マルチバイト文字をサブスクリプションキーに設定しているが、HTTP HeaderもしくはQuery Parameterとして渡す場合はURL Encodingする必要がある。実際には面倒なので、Alphanumericの文字列を使うことを強く推奨する。

更問が届いた
回答したら、以下のような更問が届いた。
サブスクリプションキーのサイズ上限ってあるの?
最大長は256。ドキュメントにも書いてある。以下のURLのsidがSubscription Key。
Subscription – Create Or Update
https://learn.microsoft.com/rest/api/apimanagement/subscription/create-or-update?view=rest-apimanagement-2024-05-01&tabs=HTTP
これからもわかる通り、最大256Byte、許容されるパターンも記載がある。
| データ型 | string |
| 最大長 | 256 |
| 許容されるパターン | ^[^*#&+:<>?]+$つまり、以下の文字が入ってはいけない。 * |
実際の確認も簡単。今回は手軽にPowerShellから実行してみた。長すぎるとエラーメッセージを出してくれる。そのエラーがこちら。

Subscription key should be between 1 and 256 characters long, Target= …
ということから、最大長は256。