このエントリは2025/04/21現在の情報に基づいています。将来の機能追加や変更に伴い、記載事項からの乖離が発生する発生する可能性があります。
問い合わせ
Azure API Management (APIM) にご執心のいつもの主から、以下のような問い合わせがあった。
現在APIMで外部公開するためのAPI Gatewayを構成しようとしている。カスタムドメインが必要なので、構成したが、自己証明書ではさすがにあれなので、まともな証明書を取得したい。ただできるだけおかねを掛けたくない。ドメインは自分自身のブログサイト用のものがあって利用中なので、FQDNとしてパブリックに利用できるように構成できる。なんとかならないか?
「おかねをケチり節約したい」というのはよく聞くので(でも対した費用にならないし、1回の宴会費用のほうが高いはず、知らんけど)、この主から問い合わせがあったということは、他からも問い合わせがありそうだな、と思ったので調べてみた。
マネージドTLS証明書
現在public previewではあるが、マネージドTLS証明書が無料で利用できる。
Azure API Management インスタンスのカスタム ドメイン名を構成する / Configure a custom domain name for your Azure API Management instance
https://learn.microsoft.com/azure/api-management/configure-custom-domain
証明書は簡単に作成できる&プラットフォームで管理され、かつ自動更新されるので、失効のリスクはない。利用者はDNSへのCNAMEとTXTの両レコードを追加する必要があるが、Azure Portalから作成すると、これもどのレコードを作成すればいいか明記されているので、間違うことはない(はず)。
まず、DNSにManaged GatewayのCNAMEを追加し、その後以下の画面のように追加していく。

注意点
- 現時点ではpublic preview
- V2では利用できない
特にV2で利用できないのは難儀なので、早く対応してもらいたいところ。
CLIなどからは作成できないのか?
Azure Portalから作成できるということは、REST APIは存在するのではないか、そしてCLIから作成できないか?
という問い合わせが来るだろうなぁ、と思ったら即座に届いたので、こちらも調べておいた。
REST APIで、properties.hostnameConfigurationsにカスタムドメインの構成情報を設定すればOK。Azure CLIでもプロパティの設定は可能だが、JSONでまとめて構成できるREST APIを実行したほうが簡単。Bearer tokenの取得はaz restでを任せることで、認証周りの細かいところをよしなにやってくれる。
例えば、gw.logico-jp.ioというCNAMEを作ったとして、それをGatewayに割り当てる場合、
{
"properties": {
"hostnameConfigurations": [
{
"hostName": "元々のFQDN",
"type": "Proxy",
"certificateSource": "BuiltIn",
"certificate": null,
"defaultSslBinding": true,
"negotiateClientCertificate": false
},
{
"hostName": "gw.logico-jp.io",
"type": "Proxy",
"certificateSource": "Managed",
"defaultSslBinding": true,
"negotiateClientCertificate": false
}
]
}
}
13行目にカスタムドメインのFQDN(元々のFQDNのCNAME)を、そしてcertificateSourceとしてManagedを指定し、これをリクエスト本文として利用し、以下のURLに対してPATCHメソッドを実行する。
https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}?api-version=2024-06-01-preview
ここで、Gateway Hostname ConfigurationのURLを直接指定していない理由は、現時点ではConsumption SKUを使っている場合にGateway IDを取得できないから。そのため、API Management ServiceのURLに対して実行している。
このあと、TXTレコードに必要なカスタム ドメイン所有権識別子 (Domain Ownership Identifier) を取得する。これは以下のドキュメントにある通りでPOSTで実行する。
Api Management Service – Get Domain Ownership Identifier
https://learn.microsoft.com/rest/api/apimanagement/api-management-service/get-domain-ownership-identifier?view=rest-apimanagement-2024-06-01-preview&tabs=HTTP
呼び出しURLは https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.ApiManagement/getDomainOwnershipIdentifier?api-version=2024-06-01-preview のような感じ(個人的にはgetDomainOwnershipIdentifierというのはどうなのか、そしてGETなのにPOSTで発行するのはイケてないと思う)。
例えば、先ほどのgw.logico-jp.ioで、以下のような所有権識別子が返ってきた場合、
{
"domainOwnershipIdentifier": "KLE1vdMblVeHECAi4nCe3oNaXXXXvNlLrXt2ev84KM="
}
DNSが管理するドメインはlogico-jp.ioなので、この場合、apimuid.gwというTXTレコードに、上記domainOwnershipIdentifierの値を設定すればよい。
自己証明書の発行
今回は自己証明書ではない、Well-known CAに紐付くTLS証明書を作成したい(しかもお財布に優しく)、というリクエストなので対象外ではあるが、自己証明書はKey VaultやPowerShell、OpenSSLなどを使って作成できる。
証明書の作成方法 / Certificate creation methods
https://learn.microsoft.com/azure/key-vault/certificates/create-certificate
openssl-genrsa
https://docs.openssl.org/master/man1/openssl-genrsa/
openssl-req
https://docs.openssl.org/master/man1/openssl-req/
openssl-x509
https://docs.openssl.org/master/man1/openssl-x509/
New-SelfSignedCertificate
https://learn.microsoft.com/powershell/module/pki/new-selfsignedcertificate?view=windowsserver2025-ps