仮想ネットワーク内のエンドツーエンド TLS を使用してアプリケーションを公開する

Note

Azure Spring Apps は、Azure Spring Cloud サービスの新しい名前です。 サービスの名前は新しくなりましたが、スクリーンショット、ビデオ、図などの資産の更新に取り組んでいる間、場所によってはしばらく古い名前が表示されます。

この記事の適用対象: ✔️ Basic または Standard ✔️ Enterprise

この記事では、App Gateway を使用してアプリケーションをインターネットに公開する方法について説明します。 Azure Spring Apps サービス インスタンスが仮想ネットワークにデプロイされている場合、このサービス インスタンス上のアプリケーションには、プライベート ネットワークからのみアクセスできます。 インターネットでアプリケーションにアクセスできるようにするには、Azure Application Gateway と統合する必要があります。

前提条件

Azure Spring Apps 用に Application Gateway を構成する

ブラウザーに表示されるドメイン名は、Application Gateway でトラフィックを Azure Spring Apps バックエンドに転送するために使用されるホスト名と同じにすることをお勧めします。 この推奨事項に従うと、仮想ネットワークにあり、Azure Spring Apps でホストされるアプリケーションを、Application Gateway を使用して公開するときに最高のエクスペリエンスが提供されます。 Application Gateway によって公開されるドメインが、Azure Spring Apps で受け入れられるドメインと異なる場合、Cookie と生成されるリダイレクト URL などが破損する可能性があります。 詳細については、「ホスト名の保存」を参照してください。

Azure Spring Apps の前面に Application Gateway を構成するには、次の手順に従います。

  1. 仮想ネットワークに Azure Spring Apps をデプロイする」の手順に従います。
  2. プライベート ネットワーク内のアプリケーションにアクセスする」の手順に従います。
  3. 選択したドメインの証明書を取得し、Key Vault に格納します。 詳細については、「チュートリアル: Azure Key Vault に証明書をインポートする」を参照してください。
  4. Azure Spring Apps にデプロイされたアプリで、カスタム ドメインとそれに対応する Key Vault 内の証明書を構成します。 詳細については、チュートリアル: Azure Spring Apps への既存のカスタム ドメインのマップに関するページを参照してください。
  5. 次の一覧に従って構成された仮想ネットワークに Application Gateway をデプロイします。
    • 末尾に private.azuremicroservices.io が付いたドメインによって参照されるバックエンド プールで Azure Spring Apps を使用します。
    • Key Vault 内の証明書と同じ証明書を使用して HTTPS リスナーを含めます。
    • 末尾に private.azuremicroservices.io が付いたドメインではなく、Azure Spring Apps で構成されたカスタム ドメイン名を使用する HTTP 設定を使用して仮想ネットワークを構成します。
  6. Application Gateway を指すようにパブリック DNS を構成します。

変数の定義

次に、以下のコマンドを使用して、「仮想ネットワークに Azure Spring Apps をデプロイする」の指示に従って作成したリソース グループと仮想ネットワークに対して変数を定義します。 実際の環境に基づいて値をカスタマイズします。 SPRING_APP_PRIVATE_FQDN を定義する際には、URI から https:// を削除します。

export SUBSCRIPTION='subscription-id'
export RESOURCE_GROUP='my-resource-group'
export LOCATION='eastus'
export SPRING_CLOUD_NAME='name-of-spring-cloud-instance'
export APPNAME='name-of-app-in-azure-spring-apps'
export SPRING_APP_PRIVATE_FQDN='$APPNAME.private.azuremicroservices.io'
export VIRTUAL_NETWORK_NAME='azure-spring-apps-vnet'
export APPLICATION_GATEWAY_SUBNET_NAME='app-gw-subnet'
export APPLICATION_GATEWAY_SUBNET_CIDR='10.1.2.0/24'

Azure へのサインイン

次のコマンドを使用して、Azure CLI にサインインし、アクティブなサブスクリプションを選択します。

az login
az account set --subscription $SUBSCRIPTION

証明書を取得する

運用環境にデプロイする場合、公的に署名された証明書を使用する可能性が高くなります。 この場合、証明書を Azure Key Vault にインポートします。 詳細については、「チュートリアル: Azure Key Vault に証明書をインポートする」を参照してください。 証明書に証明書チェーン全体が含まれていることを確認してください。

Azure Spring Apps でパブリック ドメイン名を構成する

トラフィックは、パブリック ドメイン名を使用して Azure Spring Apps にデプロイされたアプリケーションに送信されます。 このホスト名をリッスンし、HTTPS 経由でリッスンするようにアプリケーションを構成するには、次のコマンドを使用して、カスタム ドメインをアプリに追加します。

export KV_NAME='name-of-key-vault'
export KV_RG='resource-group-name-of-key-vault'
export CERT_NAME_IN_AZURE_SPRING_APPS='name-of-certificate-in-Azure-Spring-Apps'
export CERT_NAME_IN_KEY_VAULT='name-of-certificate-with-intermediaries-in-key-vault'
export DOMAIN_NAME=myapp.mydomain.com

# provide permissions to Azure Spring Apps to read the certificate from Key Vault:
export VAULTURI=$(az keyvault show \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --query properties.vaultUri \
    --output tsv)

# get the object id for the Azure Spring Apps Domain-Management Service Principal:
export ASADM_OID=$(az ad sp show \
    --id 03b39d0f-4213-4864-a245-b1476ec03169 \
    --query objectId \
    --output tsv)

# allow this Service Principal to read and list certificates and secrets from Key Vault:
az keyvault set-policy \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --object-id $ASADM_OID \
    --certificate-permissions get list \
    --secret-permissions get list

# add custom domain name and configure TLS using the certificate:
az spring certificate add \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --name $CERT_NAME_IN_AZURE_SPRING_APPS \
    --vault-certificate-name $CERT_NAME_IN_KEY_VAULT \
    --vault-uri $VAULTURI
az spring app custom-domain bind \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --domain-name $DOMAIN_NAME \
    --certificate $CERT_NAME_IN_AZURE_SPRING_APPS \
    --app $APPNAME

ネットワーク リソースを作成する

作成する Azure Application Gateway は、Azure Spring Apps サービス インスタンスと同じ仮想ネットワーク、またはそれとピアリングされた仮想ネットワークに参加します。 最初に、az network vnet subnet create を使用して、仮想ネットワーク内にアプリケーション ゲートウェイ用の新しいサブネットを作成し、さらに az network public-ip create を使用して、アプリケーション ゲートウェイのフロントエンドとしてパブリック IP アドレスを作成します。

export APPLICATION_GATEWAY_PUBLIC_IP_NAME='app-gw-public-ip'
az network vnet subnet create \
    --name $APPLICATION_GATEWAY_SUBNET_NAME \
    --resource-group $RESOURCE_GROUP \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --address-prefix $APPLICATION_GATEWAY_SUBNET_CIDR
az network public-ip create \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --name $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --allocation-method Static \
    --sku Standard

Application Gateway のマネージド ID を作成する

Application Gateway は、証明書を読み取るために Key Vault にアクセスできる必要があります。 これを行うには、ユーザー割り当て マネージド ID を使用します。 次のコマンドを使用して、マネージド ID を作成します。

export APPGW_IDENTITY_NAME='name-for-appgw-managed-identity'
az identity create \
    --resource-group $RESOURCE_GROUP \
    --name $APPGW_IDENTITY_NAME

その後、後で Key Vault の証明書にアクセスする権限を付与するために使用されるため、マネージド ID の objectId をフェッチします。

export APPGW_IDENTITY_CLIENTID=$(az identity show \
    --resource-group $RESOURCE_GROUP \
    --name $APPGW_IDENTITY_NAME \
    --query clientId \
    --output tsv)
export APPGW_IDENTITY_OID=$(az ad sp show \
    --id $APPGW_IDENTITY_CLIENTID \
    --query objectId \
    --output tsv)

Key Vault にポリシーを設定する

Application Gateway のマネージド ID が Key Vault に格納されている証明書へのアクセスを許可されるように、次のコマンドを使用して Key Vault を構成します。

az keyvault set-policy \
    --name $KV_NAME \
    --resource-group $KV_RG \
    --object-id $APPGW_IDENTITY_OID \
    --secret-permissions get list \
    --certificate-permissions get list

アプリケーション ゲートウェイの作成

az network application-gateway create を使用してアプリケーション ゲートウェイを作成し、バックエンド プール内のサーバーとしてアプリケーションのプライベート完全修飾ドメイン名 (FQDN) を指定します。 ユーザー割り当てマネージド ID を使用し、証明書のシークレット ID を使用して Key Vault 内の証明書を指すようにしてください。 次に、az network application-gateway http-settings update を使用して、パブリック ホスト名を使用するように HTTP 設定を更新します。

export APPGW_NAME='name-for-application-gateway'

export KEYVAULT_SECRET_ID_FOR_CERT=$(az keyvault certificate show \
    --name $CERT_NAME_IN_KEY_VAULT \
    --vault-name $KV_NAME \
    --query sid \
    --output tsv)

az network application-gateway create \
    --name $APPGW_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --capacity 2 \
    --sku Standard_v2 \
    --frontend-port 443 \
    --http-settings-cookie-based-affinity Disabled \
    --http-settings-port 443 \
    --http-settings-protocol Https \
    --public-ip-address $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --subnet $APPLICATION_GATEWAY_SUBNET_NAME \
    --servers $SPRING_APP_PRIVATE_FQDN \
    --key-vault-secret-id $KEYVAULT_SECRET_ID_FOR_CERT \
    --identity $APPGW_IDENTITY_NAME

Azure によってアプリケーション ゲートウェイが作成されるのに最大 30 分かかる場合があります。

バックエンドに対してドメイン名を使用するように HTTP 設定を更新する

末尾に ".private.azuremicroservices.io" が付いたドメインの代わりにパブリック ドメイン名をホスト名として使用するように HTTP 設定を更新して、トラフィックを Azure Spring Apps に送信します。

az network application-gateway http-settings update \
    --resource-group $RESOURCE_GROUP \
    --gateway-name $APPGW_NAME \
    --host-name-from-backend-pool false \
    --host-name $DOMAIN_NAME \
    --name appGatewayBackendHttpSettings

Application Gateway のデプロイを確認する

作成後、次のコマンドを使用してバックエンドの正常性を確認します。 このコマンドの出力を使用すると、アプリケーション ゲートウェイがプライベート FQDN を介してアプリケーションに到達するかどうかを確認できます。

az network application-gateway show-backend-health \
    --name $APPGW_NAME \
    --resource-group $RESOURCE_GROUP

次の例に示す出力は、バックエンド プールの正常な状態を示します。

{
  "backendAddressPools": [
    {
      "backendHttpSettingsCollection": [
        {
          "servers": [
            {
              "address": "my-azure-spring-apps-hello-vnet.private.azuremicroservices.io",
              "health": "Healthy",
              "healthProbeLog": "Success. Received 200 status code",
              "ipConfiguration": null
            }
          ]
        }
      ]
    }
  ]
}

DNS を構成してアプリケーションにアクセスする

次に、CNAME または A レコードを使用して、Application Gateway を指すようにパブリック DNS を構成します。 次のコマンドを使用して、Application Gateway のパブリック アドレスを見つけることができます。

az network public-ip show \
    --resource-group $RESOURCE_GROUP \
    --name $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --query [ipAddress] \
    --output tsv

これで、パブリック ドメイン名を使用してアプリケーションにアクセスできるようになりました。

次のステップ