azureでVMイメージを管理して、硬化させる6つの簡単な方法



VMイメージの管理は悪夢かもしれない.ここでは、シームレスに構築、共有、テスト、およびAzureで画像をコピーする方法に関する6つの簡単なアプローチです.そして、ボーナスとして、また、イベント駆動アーキテクチャに基づいてイメージ通知を構築する方法を取得します.

問題


あなたが100の仮想マシンまたは1000 +を構築して、VMイメージを硬化させるかどうかにかかわらず、あなたは手動であなたのイメージを管理しますか?あなたがそうするならば、あなたはそれが全く高価であるということを知っていて、エラーと潜在的なセキュリティ脆弱性を見つけるのを難しくします.
ここでは、私は私の顧客のためにこの問題にアプローチする方法です.Azureのための画像管理の作成手順

Azureイメージビルダーを使用してイメージをビルドする


Azureイメージビルダーは、Azure CLIでカスタムイメージを作成するサービスです.JSONテンプレートに基づいたイメージの作成、下の例.
{
    "type": "Microsoft.VirtualMachineImages/imageTemplates",
    "apiVersion": "2019-05-01-preview",
    "location": "<region>",
    "dependsOn": [],
    "tags": {
        "imagebuilderTemplate": "ubuntu1804",
        "userIdentity": "enabled"
            },
        "identity": {
            "type": "UserAssigned",
                    "userAssignedIdentities": {
                    "<imgBuilderId>": {}

                }
                },
    "properties": {

        "buildTimeoutInMinutes" : 80,

        "vmProfile": 
            {
            "vmSize": "Standard_D1_v2",
            "osDiskSizeGB": 30
            },

        "source": {
            "type": "PlatformImage",
                "publisher": "Canonical",
                "offer": "UbuntuServer",
                "sku": "18.04-LTS",
                "version": "latest"

        },
        "customize": [
            {
                "type": "Shell",
                "name": "RunScriptFromSource",
                "scriptUri": "https://raw.githubusercontent.com/danielsollondon/azvmimagebuilder/master/quickquickstarts/customizeScript.sh"
            }          

        ],
        "distribute": 
            [

            ]
        }
    }
私はそれがかなり長いので、元のテンプレートをカットする必要があります.ここでは、完全な例を見つけることができます.
ARMテンプレートはとても簡単です.以下のプロパティがあります.
  • Identityセクションが必要です、イメージビルダーのためにマネージアイデンティティを作成しなければならなくて、イメージを作成して、編集
  • にアクセスする必要があります
  • VMProfileはVM設定プランを設定する予定です
  • ソースを使用すると、基本イメージパラメーターを指定できます.私は、標準的なUbuntuサーバーを使用します
  • カスタマイズセクションでは、VM硬化スクリプトを指定できます.
  • Hereイメージビルダーオプションの完全なリストを見ることができます.

    利点


    テンプレートとプロセス自体が理解しやすく、それは簡単にAzure devopsと統合することができます.

    欠点


    イメージビルダーはまだレビューにあるので、それは生産でそれを使用することをお勧めしません.設定は、Hashicorpパッカーと比較して少し難しいことができます.(次の章ではパッカーで動作する方法を説明します).

    2 . Hashicorpパッカーを使用したイメージの構築


    Hashicorpパッカーは、JSONテンプレートに基づいてカスタムイメージを構築できるマルチプラットフォームソリューションです.JSONテンプレートはよく構造化され、オブジェクトモデルを理解しやすいに基づいています.JSONテンプレートには、3つのルートオブジェクトがあります:コミュニケータ、ビルダー、プロビジョーナー、およびポストプロセッサ.
    Here JSONテンプレートを見つけることができます.
    JSONテンプレートは、プレインストールされたNGNXウェブサーバと他のアップデートでUbuntuのVHDイメージをつくります.ここでは、他の多くのテンプレートを見つけることができます.
    Packerを設定するには、ChocoLtieパッケージマネージャーを使用できます.
    choco install packer -y
    
    次のコマンドを使用してJSONテンプレートを実行できます.
    packer build <path/your/template.json>
    
    テンプレートを実行する前に、適切な権限を持つ管理アイデンティティやサービスプリンシパルを作成する必要があります.たとえば、以下のようになります.
    az ad sp create-for-rbac -n "ImageContributor" 
     --role contributor `    
     --scopes /subscriptions/<subscription_id> `     
     --sdk-auth > az-principal.auth
    
    このコマンドは、自動的にClientid、ClientSecret、Tenantid、SubscripIdおよびその他のフィールドを持つJSONファイルを作成します.

    利点


    パッカーとJSONテンプレートを理解しやすい.彼らはすぐに環境を設定し、画像を構築を開始することができます.強いコミュニティもあります.さらに、パッカーは複数のクラウドプロバイダーをサポートします.

    欠点


    私は深刻な不利益を発見していない.しかし、イメージを構築している間、パッカーは常に何らかのイメージで必要とされるディスクをイメージで取り除きます.例えば、画像をコピーする場合.

    3 .共有イメージ


    Azureで画像を共有するには、共有イメージギャラリーを使用します.できます.
    -画像定義を作成する
    -画像のバージョンを保存する
    -画像を共有する
    たとえば、あなたのAzureサブスクリプション、リソースグループ、テナント間で画像を共有することができます.

    現在のシナリオでは、ユーザーグループまたは単一のユーザー/サービスプリンシパルを作成することができます.この共有イメージギャラリーだけに貢献者権限を割り当てます.
    az ad sp create-for-rbac -n "ImageContributor" 
     --role contributor `    
     --scopes /subscriptions/<subscr-id>/resourceGroups/sig-we-rg/providers/Microsoft.Compute/galleries/testsig
    
    その結果、グループからのユーザーは、異なる共有でこの共有イメージギャラリーからUbuntuイメージに基づく仮想マシンをつくることができます.
    az vm create `
      --resource-group myResourceGroup `
      --name UbuntuVM`
      --image "/subscriptions/<subscr-id>/resourceGroups/sig-we-rg/providers/Microsoft.Compute/galleries/testsig/images/ubuntu-server-image-def/versions/1.0.0" \
      --admin-username azureuser \
      --generate-ssh-keys
    

    利点


    Azure共有イメージギャラリーを簡単に構築、共有、管理、および組織内の画像をカスタマイズできます.SIGにはAzure CLIがありますので、簡単に画像配布を自動化できます.

    欠点


    イメージは共有アクセスギャラリーに残ります.したがって、それは物理的にそこにとどまります.だから、サブスクリプション間で共有するときは、各サブスクリプションの独立して変更または削除することはできません.

    画像のコピー


    画像をコピーすることで、別の1つのサブスクリプションから別のまたは1つのリソースグループから別の画像を提供することができます.コピーされた画像はすべて独立している.あなたはAzureイメージのコピーの拡張子を使用して画像をコピーしたり、GOを使用してマニュアルコピーを実装します.以下の例を見てみましょう.

    AZコピー拡張子によるコピーイメージ



    サブスクリプションの間に画像をコピーするには、AZイメージコピー拡張を使用します.これは、リソースグループAに新しいイメージ(ソースイメージから)を作成します.
    拡張モジュールのインストール
    az extension add --name image-copy-extension
    
    コピーコマンド
    az image copy --source-resource-group Azure-Resource-Group-B `
                  --source-object-name image-version-1.0 `
                  --target-resource-group Azure-Resource-Group-A `
                  --target-location westeurope `
                  --target-subscription 111111-2222-2222-0000-0000000 ` # Subscription A
                  --cleanup
    
    重要です.Packerは、管理されたイメージが作成された後に自動的にディスクを削除します.

    利点


    AZのイメージのコピーの拡張子を使用すると自動化されて簡単です.

    欠点


    イメージは管理されたディスクを含んでいなければなりません、さもなければ、コピープロセスは' resource - not - found 'エラーメッセージで失敗します.

    画像を手動でコピー



    AZコピー画像拡張子があなたのために動作しない場合は、ストレージアカウントにVHD画像を作成し、別の宛先ストレージアカウントにコピーすることができます.
    プロセスのワークフロー:
  • は2つの記憶口座、源と目的地
  • をつくります
  • ソースストレージアカウントでVHDイメージを作成します.最初のセクションからパッカースクリプトを使用できます.
  • は、VHDソースイメージのための共有アクセス署名を生成します.ここでは、Azure CLIでそれを行う方法の例を見つけることができます.
  • イメージをコピーします.次のGoスクリプトを使用します.Azcopyツールを使用することもできます.
  • ソースコードhereを見つけることができます.

    ヒア 利点


    現在のイメージ対処ワークフローは完全にカスタムです.したがって、いつでも変更することができます.また、AZイメージのコピーの拡張子が動作しない場合に便利です.たとえば、イメージを作成しながらマネージディスクを削除します.

    欠点


    以下のようなすべてのワークフローステップを実装する必要があります.
    - creating VHD
    - generating and managing SAS token
    - copying an image
    - cleaning up
    - converting an image
    

    イメージとディスク変換


    VHDイメージを管理されたディスクまたは管理されたディスクにVHDイメージに変える操作.これは、イメージコピープロセスでAzure共有イメージギャラリーを使用して組織間で画像を配布する必要があるときに、新しいVMをスピンする必要があるときに便利です.
    また、いくつかのレガシーVHDを持っているときに有用であり、更新をインストールする必要がある、自動バックアップを設定し、可用性セット、および可用性ゾーンを使用します.
    は管理されたイメージの利点のリストです.

    ヒア VHDイメージを管理ディスクに変換する


    # Provide the subscription Id where Managed Disks will be created
    $subscriptionId = '00000-00000-0000-0000-0000000'
    
    # Provide the name of your resource group where Managed Disks will be created. 
    $resourceGroupName ='HBI'
    
    # Provide the name of the Managed Disk
    $diskName = 'image-test-disk'
    
    # The Disk It should be greater than the VHD file size.
    $diskSize = '130'
    
    # Storage LRS. Options: Premium_LRS, Standard_LRS, etc
    $storageType = 'Premium_LRS'
    
    # Set Azure region (e.g. westus, westeurope), Ensure that location of the VHD image (alongside with Storage Account), 
    # and future Managed Disk is the same.
    $location = 'westeurope'
    
    # Set URI of the VHD file (page blob) in a storage account.
    $sourceVHDURI = 'https://imagesstorage.blob.core.windows.net/test-image-disk.vhd'
    
    # Set the Resource Id of the Source storage account where VHD file is stored. You can avoid it if VHD in the same subscription
    $storageAccountId = '/subscriptions/subscription-id/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/imagesstorage'
    
    #Set the context to the subscription Id where Managed Disk will be created
    Select-AzSubscription -SubscriptionId $SubscriptionId
    
    $diskConfig = New-AzDiskConfig -AccountType $storageType -Location $location -CreateOption Import -StorageAccountId $storageAccountId -SourceUri $sourceVHDURI
    
    New-AzDisk -Disk $diskConfig -ResourceGroupName $resourceGroupName -DiskName $diskName
    

    管理されたディスクを管理画像に変換


    $rgName = "HBI"
    $location = "westeurope"
    $imageName = "boriszn-test-imagefromdisk"
    
    
    # Get disk 
    $disk = Get-AzDisk -ResourceGroupName 'HBI' -DiskName 'image-test-disk' 
    $diskId = $disk.Id
    
    # Create Managed Image Config with Managed Disk Info 
    # OS Types (Linux, Windows)
    $imageConfig = New-AzImageConfig -Location $location
    $imageConfig = Set-AzImageOsDisk -Image $imageConfig -OsState Generalized -OsType Linux -ManagedDiskId $diskId
    
    # Create the image.
    $image = New-AzImage -ImageName $imageName -ResourceGroupName $rgName -Image $imageConfig
    

    利点


    両方のCmdletsを使用すると、別のサブスクリプションとリソースグループ間であなたのAzure共有イメージに画像を配信することができます.

    欠点


    いくつかのイメージが時代遅れであることができるので、変換プロセスは複雑でありえます、そして、変換プロセスは失敗するかもしれません.

    テスト画像


    イメージをテストするには、単にイメージギャラリーから新しいVMをスピンして画像定義を使用することができます
    az vm create `
       --resource-group container-image-rg `
       --name vm-test `
       --image "/subscriptions/<subscription-id>/resourceGroups/container-image-rg/providers/Microsoft.Compute/galleries/test-gallery/images/image-test-def" `
       --generate-ssh-keys 
    

    利点


    コマンドとプロセス自体は非常に簡単です.

    欠点


    JSONの設定で、特定のソフトウェアとサービスが正しくインストールされているかどうかをチェックしません.したがって、この論理は別に実装されなければなりません.

    画像パブ/サブサブシステムの概念(ボーナス)


    いくつかのサブスクリプションやリソースグループ全体のイメージを管理することは困難な場合は特に、常に画像の新しいバージョンを生成するとき、または新しい仮想マシンをスピンするいくつかの自動化プロセスを持っている.
    この場合、新しいイメージが作成されたとき、異なるコンポーネントを通知するための通知システムを構築する必要があります.新しいバージョンまたはイメージ定義は、Azure共有イメージギャラリーに表示されます.簡単にフィルタを使用してAzureイベントグリッドを使用して作成することができます.
    ターゲットグリッド にメッセージを配信するために、イベントグリッド、キュー、Webhook、およびAzureサービスバスでどのように行うことができるかを見ることができます.

    ヒア 結論


    それです.これらの方法に基づいて簡単にイメージを硬化させることができますし、パイプラインパイプラインAzure devopsで.