パブリックなAzure API Managementを使ってVNET内の仮想マシンへプライベート通信する

2022.04.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Azure API Managementを使うと様々な環境のAPIを管理出来るようになるのですが、プライベートネットワークもその範囲に含まれています。
API Managementの仮想ネットワーク機能を有効化することで指定した仮想ネットワークへ接続出来るようになるのですが、仮想ネットワーク設定時に「外部」と「内部」の設定があり、少し迷いました。

今回使いたいのは「外部」になりまして、設定する場合の手順をまとめました。

API Managementの仮想ネットワーク設定

API Managementの仮想ネットワーク設定には、「なし」以外には「外部」と「内部」があります。

「外部」はAPI Management自体はパブリックな状態で、バックエンドはプライベートなVNETをターゲットにしています。

「内部」はプライベートなAPI Managementを作成し、バックエンドもプライベートです。
内部モードのAPI Managementへアクセスするためには、まずVNETへVPNやExpressRouteで接続する必要があります。
また、内部を設定した場合はプライベートDNSの構成も必要になります。

設定

まずはVNET内にUbuntuな仮想マシンを1台用意し、Apacheの導入とindex.htmlを用意します。
なお、パブリックIPアドレスは割り当てていないので、この時点では外部からの接続は出来ません。

$ apt install apache2
$ vi /var/www/html/index.html
$ curl http://localhost/
hoge

次に、API Managementを作成します。
Web service URLがバックエンドのエンドポイントを指しているのですが、プライベートIPアドレスを指定しています。
ただし、まだこの時点ではVNETの設定を行っていないため、API Managementを通しても通信は出来ません。

試しにAPIとオペレーションの設定を行いテストしてみましょう。

forward-request (1.309 ms)
    {
    "messages": [
        "Unable to connect to the remote server",
        "Error occured while calling backend service.",
        "An attempt was made to access a socket in a way forbidden by its access permissions 10.0.0.4:80"
    ]
}

リモートサーバーへの接続エラーが発生しますね。
ここで冒頭のVNET設定を「外部」モードで行います。

$ curl -H "Ocp-Apim-Subscription-Key: 3fb30b3215492984835fe6707d381093" http://iwasa-apim.azure-api.net/
hoge

無事、外部からのアクセスが出来るようになりました。

さいごに

本日はAzure API Managementの外部モードでVNETのプライベートAPIへ接続してみました。 また、VNETの接続モードが複数ある点と、外部モード時の設定方法と挙動を確認しました。
API ManagementでVNET構成を検討している方の参考になれば幸いです。