Deploy Cloud Shell into an Azure virtual network(preview)をお試しする

2020年8月21日

はじめに

Azure Cloud Shellはとても便利ですが、ストレージアカウントのリージョンが微妙にここだ!って決められなかったり(アジア太平洋地域はインド中部、東南アジア)、インスタンスがPublicな場所にあったりとで、ユーザの用途によっては採用できないケースもあるのかな。。とか。

現時点ではPublic previewですが、Cloud ShellのインスタンスをVirtual Network内に立ち上げて、ストレージも専用のものをサービスエンドポイントで安全につなげる機能が出てきました。

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

上のURLにある画像の引用ですが、以下の構成となっておりCloud Shellのコンテナを仮想ネットワーク内にAzure Container InstanceでCloud Shellを起動します。

インターネット側からのアクセスはAzure Relay経由となります。

Cloud Shell 分離 VNET アーキテクチャを示す図。

今はWestUSとWestCentralUSのみでの利用となりますが、試してみました。

基本的には上のリンクに書かれている手順どおりなのですが、つまづきポイントもあるので補足しながら手順を説明します。

前準備

とりあえずリソースグループを作成します。リージョンは米国西部を選びました。

あ、後この機能を使う際には、Azure Container Instanceを利用する為、リソースプロバイダの登録が済んでいない方は、登録しておきます。

リソース プロバイダーの登録

仮想ネットワークの作成

この後実行するデプロイ用のARM Templateでは、仮想ネットワークに3つのサブネットを追加します。なので、ここでは10.255.0.0/24のアドレス空間で仮想ネットワークを作成していますが、自由に使えるdefaultサブネットは10.255.0.0/26の範囲で作成しました。

デプロイテンプレートの取得と修正

Githubからデプロイテンプレート(azuredeploy.json)と、パラメータファイル(azuredeploy.parameters.json)を取得してきます。

Deploy Azure Cloud Shell resources to a virtual network

azuredeploy.parameters.jsonですが、私は以下のように修正しています。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "existingVNETName": {
            "value": "cloudshell-vnet"
        },
        "relayNamespaceName": {
            "value": "ktkrclshell"
        },
        "azureContainerInstanceOID": {
            "value": "c85f3586-1ba8-4aeb-a6ea-dc2c048e29c8"
        },
        "containerSubnetAddressPrefix": {
            "value": "10.255.0.64/26"
        },
        "relaySubnetAddressPrefix": {
            "value": "10.255.0.128/26"
        },
        "storageSubnetAddressPrefix": {
            "value": "10.255.0.192/26"
        }
    }
  }

自身の環境に合わせて、valueを変更します。3つ追加するサブネットのCIDR値が被らないように注意。
azureContainerInstanceOIDはこちらに書かれている値のままで大丈夫だと思います。

ARM templateのデプロイ

Azure PowerShellからデプロイします。Login-AzAccountで認証後に以下のコマンド例を参考に実行します。もちろん既存の今利用しているCloud Shellからの実行でもOKです。

PS C:> New-AzResourceGroupDeployment -ResourceGroupName cloudshell-rg -TemplateFile .\azuredeploy.json -TemplateParameterFile .\azuredeploy.parameters.json

デプロイが完了すると、仮想ネットワークにサブネットが3つほど追加されています。

他にもリソースグループの中には色々リソースが追加されますね。

Cloud Shellへのアクセス許可を追加

インターネット側からCloud Shellのインスタンスにアクセスするために、Azure Relayが使われます。

Relayリソースの「ネットワーク」メニューからファイアウォールの設定を行います。「選択されたネットワーク」を選択後、ファイアウォールルールとしては「クライアントIPアドレスを追加する」にチェックを入れて、保存します。

無論、アドレス範囲をCIDRで広い範囲で指定するのもOKです。

ストレージアカウントの作成

Cloud ShellはAzure Filesを使ってユーザファイルの保存を行うため、事前にストレージアカウントも作成します。

リージョンは米国西部で、パフォーマンスとかレプリケーションは一番安価な構成で設定します。

ストレージアカウントの作成時、「ネットワーク」タブでは、接続方法「パブリックエンドポイント」を指定後、先程作成した仮想ネットワークを選択します。

サブネットは「cloudshellsubnet」「storagesubnet」の両方にチェックを入れて、作成を行います。

ちゃんと米国西部で作成できました。

既存のCloud Shell環境の削除

たぶん皆さん、既に利用しているAzureサブスクリプションでCloud Shellを利用していると思いますので、その環境を一度削除します。大事なファイルが残っている場合には適宜他の場所に退避しておきます。

Cloud Shell(https://shell.azure.com/)を開いてPowerShellから「clouddrive unmount」コマンドを実行します。その後2度程continueの確認が出ますが、両方とも「y」を入力すると、削除完了です。

Cloud Shellがタイムアウトした旨のメッセージが表示されるので、「再接続」をクリックします。

Cloud Shellの新規設定(VNET分割設定)

ようこそ画面ではPowerShellを選択します。

ストレージアカウントのマウントでは、「詳細設定の表示」を選択します。

以下の順番で項目を選択・設定します。

  • VNET分離設定→チェック
  • Cloud Shellリージョン→米国西部
  • リソースグループ→cloudshell-rg(今回作成したリソースグループ)

すると、仮想ネットワーク、ネットワークプロファイル、リレー名前空間、ストレージアカウト欄が自動で入力されます。

共有ファイルについてはFiles Storageに作成される共有名になりますので、とりあえず「shared」と入力しました。

最後に「ストレージの作成」を選択します。

しばらく待ちます。結構利用開始までに時間がかかります。

特にエラーが出ずにコマンドプロンプトが出来たら準備OKです。

Cloud Shellの動作確認

PowerShellで適当なAzコマンドを実行して動作確認します。Get-AzVMで仮想マシンの一覧を取得しました。

Bashに切り替えても大丈夫。

Azureのリソース一覧からRelayを選び、「ハイブリッド接続」の一覧を出します。

一覧をクリックすると、メトリック情報なども確認できますね。

仮想ネットワーク内の仮想マシンへアクセス

先に作成した仮想ネットワークのdefaultサブネットに適当な仮想マシンを作成します。今回はUbuntu 18.04をPublic IP無しで作成しました。

割り当てられたプライベートIPアドレスは「10.255.0.4」です。

Cloud Shell(bash)からpingやsshをしましたが、ちゃんと仮想ネットワーク内で通信ができていますね。

気づいた点

Cloud Shellの初回起動でも、翌日になっての起動でも、Cloud Shellのコンテナ起動に失敗するのか、以下のエラーがでる場合があります。

この場合は、以下の電源アイコンをクリックしてCloud Shellの再起動を行うと上手くつながるようになりました。

現在はPreviewであるため、動作の安定性についても暖かく受け入れて試用しましょう。

おわりに

とりあえず今回は公式ドキュメントに書かれている内容をベースに構築して試用しましたが、内容としてはARM Templateで全て記述可能なので、自動デプロイも簡単にできると思います。

面識は無いのですが、Microsoft Cloud AdvocateのThomas Maurerさんの以下の記事も参考になるかと思います(勝手にリンク)

https://www.thomasmaurer.ch/2020/08/connect-azure-cloud-shell-to-virtual-network-vnet/

ちなみに料金ですが、ドキュメント上からはRelayの利用用金がかかるようです。ハイブリッド接続の場合なので、1リスナーあたり\1,100円/月/5GBってとこですか。同時接続数が増えるとその分課金も増えるのかと思います。

https://azure.microsoft.com/ja-jp/pricing/details/service-bus/