Azure Container Instances を仮想ネットワークにデプロイする

完了

このユニットでは、Azure Container Instances コンテナーに顧客の API を表すサンプル アプリケーションを作成します。 このアプリケーションは、外部データベースにアクセスする API で構成されます。その外部データベースは、Azure SQL Database としてデプロイします。

仮想ネットワーク内にコンテナー化されたアプリケーションを作成し、仮想ネットワーク アクセス権をもつお客様のみがアプリにアクセスできるようにします。 このアプリケーションには、その仮想ネットワーク内からのみ到達可能であるため、テスト用の仮想マシンをジャンプ ホストとして作成して、顧客のアクセスをシミュレートし、アプリケーションが動作していることを確認します。

仮想ネットワークは分離されたネットワーク セグメントであり、ワークロードをデプロイすると。それにはプライベートでのみアクセス可能です。必要であれば、パブリック インターネット経由でアクセスできるようにもできます。 通常、仮想ネットワークでは VM をホストしますが、コンテナー インスタンスなどの他の Azure リソースを仮想ネットワークにデプロイすることもできます。

仮想ネットワークにデプロイされた Azure リソースは、仮想ネットワークの範囲からプライベート IP アドレスを受け取ります。 プライベート IP には、仮想ネットワーク内、ピアリングされた仮想ネットワーク、サイト間 VPN または Azure ExpressRoute 経由で接続されたオンプレミス ネットワークからのみ到達できます。

次の図に、このユニットでデプロイするトポロジを示します。

Diagram that shows an overview of the topology.

  1. Azure 仮想ネットワーク内に顧客 API を含むコンテナー インスタンスをデプロイします。
  2. API のテストに使用する VM を同じ仮想ネットワーク内にデプロイします。 この VM が必要である理由は、お客様のビジネス要件に従って、この仮想ネットワークにデプロイされたコンテナー インスタンスにはパブリック インターネット経由で到達できないためです。
  3. 顧客 API が操作する必要がある Azure SQL データベースを作成します。 この例では、コンテナー インスタンスはパブリック インターネット経由で Azure SQL データベースに到達します。

環境の作成

  1. Azure portal で、上部のメニュー バーから [Cloud Shell] アイコンを選択して、Azure Cloud Shell を開きます。 Cloud Shell で [Bash] オプションが選択されていることを確認します。

    Screenshot of the Azure portal header with the Cloud Shell icon highlighted.

  2. Cloud Shell で次のコードを入力して、このユニットの変数を定義します。 必要に応じて、この location の値をより近い Azure リージョンに置き換えることができます。

    # Variables
    rg=acilab
    location=eastus
    aci_name=learnaci
    aci_dns=${aci_name}${RANDOM}
    vnet_name=acivnet
    vnet_prefix=192.168.0.0/16
    vm_subnet_name=vm
    vm_subnet_prefix=192.168.1.0/24
    aci_subnet_name=aci
    aci_subnet_prefix=192.168.2.0/24
    
  3. 次の Azure CLI コマンドを実行して、テストに使用するリソース グループと Linux VM を作成します。 この例では、VM の作成時に Azure によって仮想ネットワークが作成されます。

    # Create test RG and VM
    az group create -n $rg -l $location
    az vm create -n test-vm -g $rg -l $location --image Ubuntu2204 --generate-ssh-keys \
        --public-ip-address test-vm-pip --public-ip-sku Standard --vnet-name $vnet_name \
        --vnet-address-prefix $vnet_prefix --subnet $vm_subnet_name --subnet-address-prefix $vm_subnet_prefix
    vm_pip=$(az network public-ip show -n test-vm-pip -g $rg --query ipAddress -o tsv) && echo $vm_pip
    
  4. 次のコードを実行して、Secure Shell (SSH) 経由で Azure VM に接続できることを確認します。

    # Test SSH connectivity to virtual machine
    ssh $vm_pip
    [...]
    exit
    

    重要

    リモート VM に Azure CLI をインストールする必要があります。 これを行うには、接続後に VM で次のコマンドを実行します。

    curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
    
  5. 次の Azure CLI コマンドを実行して、アプリケーションが接続するデータベースを作成します。 この例では、最小の Azure SQL Database SKU (Basic) を使用してコストを削減します。 このサイズは運用環境での使用はお勧めしません。

    # Create database
    sql_server_name=sqlserver$RANDOM
    sql_db_name=mydb
    sql_username=azure
    sql_password=$(tr -dc A-Za-z0-9 </dev/urandom 2>/dev/null | head -c 15)
    az sql server create -n $sql_server_name -g $rg -l $location --admin-user $sql_username --admin-password $sql_password
    sql_server_fqdn=$(az sql server show -n $sql_server_name -g $rg -o tsv --query fullyQualifiedDomainName)
    az sql db create -n $sql_db_name -s $sql_server_name -g $rg -e Basic -c 5 --no-wait
    

仮想ネットワークにコンテナー インスタンスを作成する

これで、必要なコンポーネントがすべて作成されたので、Azure コンテナー インスタンスをデプロイできます。 Azure SQL データベースの完全修飾ドメイン名 (FQDN) と資格情報を環境変数で指定して、コンテナー インスタンスがデータベースに接続できるようにします。

  1. 次の Azure CLI コマンドを実行して、Azure コンテナー インスタンスをデプロイします。 最初の試行でエラーが発生した場合は、コマンドを再試行してください。

    # Create container instance in a new subnet
    az network vnet subnet create -g $rg --vnet-name $vnet_name -n $aci_subnet_name --address-prefix $aci_subnet_prefix
    vnet_id=$(az network vnet show -n $vnet_name -g $rg --query id -o tsv)
    aci_subnet_id=$(az network vnet subnet show -n $aci_subnet_name --vnet-name $vnet_name -g $rg --query id -o tsv)
    az container create -n $aci_name -g $rg -e "SQL_SERVER_USERNAME=$sql_username" \
      "SQL_SERVER_PASSWORD=$sql_password" \
      "SQL_SERVER_FQDN=${sql_server_fqdn}" \
      --image erjosito/yadaapi:1.0 \
      --ip-address private --ports 8080 --vnet $vnet_id --subnet $aci_subnet_id
    
  2. az container show コマンドを使用してコンテナー インスタンスの IP アドレスを取得し、テスト VM に接続して接続を確認します。 プライベート IP アドレスにアクセスするには、テスト VM で作業している必要があります。 デプロイされた API には、エンドポイント /api/healthcheck があり、これにより、コンテナーが稼働している場合に、値 OK が返されます。

    # Test container reachability
    aci_ip=$(az container show -n $aci_name -g $rg --query 'ipAddress.ip' -o tsv) && echo $aci_ip
    ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -s http://$aci_ip:8080/api/healthcheck"
    

    Note

    このコマンドの -n -o BatchMode=yes -o StrictHostKeyChecking=no オプションは、このユニットでは重要ではありませんが、SSH 経由でリモート VM にバッチ コマンドを送信する場合には役立ちます。

Azure SQL ファイアウォール規則を更新する

アプリケーションからバックエンド データベースに接続できるようにするには、API のアクセスが許可されるように Azure SQL ファイアウォール規則を更新する必要があります。 接続にはパブリック IP アドレスが使用されるため、アプリケーションがインターネットへのアクセスに使用するソース IP アドレスを把握することが重要です。

Azure コンテナー インスタンスのエグレス IP アドレスを取得するのは簡単ではありません。 アプリケーション エンドポイント api/ip は、パブリック エグレス IP アドレスを含む、ネットワーク属性の一部を示しています。 この場合、API コード自体がエグレス IP を検出し、それを使用して Azure SQL データベースのファイアウォール規則を更新します。

そこで、アプリケーションから Azure SQL データベースにアクセスできるようになっているはずです。 アプリケーションがデータベースにアクセスできることは、アプリケーション エンドポイント api/sqlversion を使用してデータベースのバージョンを表示することで確認できます。

次のコードを実行して、ファイアウォール規則を更新し、API アクセスをテストします。

# Update Azure SQL firewall rules and test API
aci_pip=$(ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -s http://$aci_ip:8080/api/ip" | jq -r .my_public_ip) && echo $aci_pip
az sql server firewall-rule create -g $rg -s $sql_server_name -n public_sqlapi_aci-source --start-ip-address $aci_pip --end-ip-address $aci_pip
ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -s http://$aci_ip:8080/api/sqlversion"
ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -s http://$aci_ip:8080/api/sqlsrcip"

上記のコード ブロックの最後のコマンドは、アプリケーションのエンドポイント api/sqlsrcip を呼び出します。このエンドポイントは、バックエンド データベースに SQL クエリを送信して、データベースが参照するソース IP アドレスを要求します。 データベースからアプリケーションのパブリック IP アドレスが見えていることを確認できます。