管理者の意のままにAzure API Managementのサブスクリプションキーを設定したい

このエントリは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。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください