Azure Container Instances を仮想ネットワークにデプロイする
このユニットでは、Azure Container Instances コンテナーに顧客の API を表すサンプル アプリケーションを作成します。 このアプリケーションは、外部データベースにアクセスする API で構成されます。その外部データベースは、Azure SQL Database としてデプロイします。
仮想ネットワーク内にコンテナー化されたアプリケーションを作成し、仮想ネットワーク アクセス権をもつお客様のみがアプリにアクセスできるようにします。 このアプリケーションには、その仮想ネットワーク内からのみ到達可能であるため、テスト用の仮想マシンをジャンプ ホストとして作成して、顧客のアクセスをシミュレートし、アプリケーションが動作していることを確認します。
仮想ネットワークは分離されたネットワーク セグメントであり、ワークロードをデプロイすると。それにはプライベートでのみアクセス可能です。必要であれば、パブリック インターネット経由でアクセスできるようにもできます。 通常、仮想ネットワークでは VM をホストしますが、コンテナー インスタンスなどの他の Azure リソースを仮想ネットワークにデプロイすることもできます。
仮想ネットワークにデプロイされた Azure リソースは、仮想ネットワークの範囲からプライベート IP アドレスを受け取ります。 プライベート IP には、仮想ネットワーク内、ピアリングされた仮想ネットワーク、サイト間 VPN または Azure ExpressRoute 経由で接続されたオンプレミス ネットワークからのみ到達できます。
次の図に、このユニットでデプロイするトポロジを示します。
- Azure 仮想ネットワーク内に顧客 API を含むコンテナー インスタンスをデプロイします。
- API のテストに使用する VM を同じ仮想ネットワーク内にデプロイします。 この VM が必要である理由は、お客様のビジネス要件に従って、この仮想ネットワークにデプロイされたコンテナー インスタンスにはパブリック インターネット経由で到達できないためです。
- 顧客 API が操作する必要がある Azure SQL データベースを作成します。 この例では、コンテナー インスタンスはパブリック インターネット経由で Azure SQL データベースに到達します。
環境の作成
Azure portal で、上部のメニュー バーから [Cloud Shell] アイコンを選択して、Azure Cloud Shell を開きます。 Cloud Shell で [Bash] オプションが選択されていることを確認します。
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
次の 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
次のコードを実行して、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
次の 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) と資格情報を環境変数で指定して、コンテナー インスタンスがデータベースに接続できるようにします。
次の 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
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 アドレスが見えていることを確認できます。