すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:Packer を使用したカスタムイメージの作成

最終更新日:Dec 03, 2024

Packerは、画像の作成に使用できる軽量のオープンソースツールです。 Packerは、Windows、Linux、macOSなどの主流のオペレーティングシステムで動作し、並列かつ効率的な方法で複数のプラットフォーム用の仮想マシンイメージを作成できます。 このトピックでは、ECS (Elastic Compute Service) インスタンスにPackerをインストールし、Packerテンプレートを定義し、Packerを使用してカスタムイメージを作成する方法について説明します。

前提条件

AccessKey ペアが作成されていること。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 詳細については、「AccessKeyペアの取得」をご参照ください。

説明
  • Alibaba CloudアカウントのAccessKeyペアの漏洩を防ぐため、RAM (Resource Access Management) ユーザーを作成し、RAMユーザーの資格情報を使用してAccessKeyペアを作成することを推奨します。 RAMユーザーの作成方法については、「RAMユーザーの作成」をご参照ください。

  • RAMユーザーのAccessKeyシークレットは、RAMユーザーのAccessKeyペアを作成した場合にのみ表示されます。 AccessKeyペアの作成後、AccessKeyシークレットを照会することはできません。 AccessKeyシークレットを記録して機密保持します。

背景情報

Packerは、BuildersProvisionersPost-Processorなどのさまざまなコンポーネントで構成されています。 Packerは、Hashicorp構成言語 (HCL) またはJSON形式のテンプレートを使用して、カスタムイメージを作成するプロセスを簡素化します。 さらに、Packerはイメージ作成プロセスを標準化および自動化し、クラウド移行を容易にするコードとしてイメージを定義できます。 Packerの詳細については、Packerの公式ドキュメントをご参照ください。

手順

ステップ1: Packerのインストール

  1. Linuxインスタンスに接続します。

    詳細については、「ユーザー名とパスワードを使用したLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、/usr/local/binディレクトリに移動します。

    cd /usr/local/bin
    説明

    /usr/local/binディレクトリは環境変数に含まれます。 このディレクトリまたは環境変数に追加された別のディレクトリにPackerをインストールできます。

  3. 次のコマンドを実行して、Packerインストールパッケージを取得します。

    [Packerのインストール] ページに移動して、Linuxインスタンスのオペレーティングシステムとアーキテクチャに適したPackerインストールパッケージを取得することもできます。 この例では、packer_1.8.5_linux_amd64.zipインストールパッケージが取得されます。

    wget https://releases.hashicorp.com/packer/1.8.5/packer_1.8.5_linux_amd64.zip
  4. 次のコマンドを実行して、Packerインストールパッケージを解凍します。

    unzip packer_1.8.5_linux_amd64.zip
  5. 次のコマンドを実行して、Packerがインストールされているかどうかを確認し、Packerのバージョンを確認します。

    packer -v
    • Packerが正しくインストールされている場合は、Packerバージョン番号が返されます。

    • Packetがインストールされていない場合、command not foundメッセージが返されます。 Packerが存在するディレクトリが環境変数に追加されているかどうかを確認します。

手順2: Packerテンプレートの定義

Packerを使用してカスタムイメージを作成するには、HCLまたはJSON形式のテンプレートを作成します。 テンプレートで、ビルダーとプロビジョニングを指定します。 詳細については、「Builders」および「Provisioners」をご参照ください。 Packerは、カスタムイメージの作成に使用できるさまざまなプロビジョニングを提供します。 この例では、Shell provisionerが使用されます。

  1. 次のコマンドを実行して、AccessKey IDをインポートします。

    export ALICLOUD_ACCESS_KEY=<AccessKey ID>

    上記のコマンドで、<AccessKey ID> をAccessKey IDに置き換えます。 RAM (Resource Access Management) ユーザーのAccessKey IDを照会する方法については、「RAMユーザーのAccessKeyペアに関する情報の表示」をご参照ください。

  2. 次のコマンドを実行して、AccessKeyシークレットをインポートします。

    export ALICLOUD_SECRET_KEY=<AccessKey Secret>

    上記のコマンドで、<AccessKey Secret> をAccessKey secretに置き換えます。 RAMユーザーのAccessKeyシークレットは、RAMユーザーのAccessKeyペアを作成した場合にのみ表示されます。 AccessKeyペアの作成後、AccessKeyシークレットを照会することはできません。 詳細については、「AccessKeyペアの取得」をご参照ください。

  3. 次のコマンドを実行して、alicloudという名前のファイルを作成します。

    説明

    alicloudファイルはHCLまたはJSON形式で作成できます。 HCL形式でファイルを作成する場合は、HCL形式のテンプレートに適した後続の操作を実行します。

    HCLファイル

    vi alicloud.pkr.hcl

    JSONファイル

    vi alicloud.json
  4. Iキーを押してInsertモードに入り、次のサンプルPackerテンプレートのコンテンツをalicloudファイルにコピーし、ビジネス要件に基づいてコンテンツのパラメーターを変更します。

    HCLファイル

    variable "access_key" {
      type    = string
      default = "${env("ALICLOUD_ACCESS_KEY")}"
    }
    
    variable "secret_key" {
      type    = string
      default = "${env("ALICLOUD_SECRET_KEY")}"
    }
    
    source "alicloud-ecs" "autogenerated_1" {
      associate_public_ip_address = true
      image_name                  = "packer_basic"
      instance_type               = "ecs.g6.large"
      internet_charge_type        = "PayByTraffic"
      io_optimized                = true
      region                      = "cn-qingdao"
      skip_image_validation       = true
      source_image                = "aliyun_3_x64_20G_alibase_20220907.vhd"
      ssh_username                = "root"
    }
    
    build {
      sources = ["source.alicloud-ecs.autogenerated_1"]
      provisioner "shell" {
        inline = ["sleep 30", "yum install redis.x86_64 -y"]
      }
    }

    JSONファイル

    {
         "variables": {
           "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
           "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
         },
         "builders": [{
           "type":"alicloud-ecs",
           "region":"cn-qingdao",
           "image_name":"packer_basic",
           "source_image":"aliyun_3_x64_20G_alibase_20220907.vhd",
           "associate_public_ip_address":true,
           "ssh_username":"root",
           "instance_type":"ecs.g6.large",
           "internet_charge_type":"PayByTraffic",
           "io_optimized":true,
           "skip_image_validation":true
         }],
         "provisioners": [{
           "type": "shell",
           "inline": [
             "sleep 30",
             "yum install redis.x86_64 -y"
           ]
         }]
       }

    次の表に、Packerテンプレートでサポートされているパラメーターを示します。 詳細については、Packerの公式ドキュメントをご参照ください。

    パラメーター

    必須 / 任意

    説明

    region

    String

    カスタムイメージの作成に使用される一時ECSインスタンスが存在するリージョン。 例: cn-qingdao

    image_name

    String

    カスタムイメージの名前 例: packer_basic

    instance_type

    String

    カスタムイメージの作成に使用される一時ECSインスタンスのインスタンスタイプ。 例: ecs.g6.large カスタムイメージが作成されると、一時ECSインスタンスは自動的にリリースされます。

    説明

    Packerがカスタムイメージを作成すると、CreateInstance操作が呼び出され、一時的なECSインスタンスが作成されます。 インスタンスには、カスタムイメージの作成に必要なオペレーティングシステムとソフトウェアが含まれています。 一時ECSインスタンスは従量課金インスタンスです。 インスタンスに対して課金されます。

    ssh_username

    String

    SSH経由で一時ECSインスタンスに接続するために使用されるユーザー名。

    internet_charge_type

    String

    不可

    カスタムイメージの作成に使用される一時ECSインスタンスのネットワーク使用の課金方法。 有効な値:

    • PayByBandwidth: 帯域幅による支払い。

    • PayByTraffic: トラフィックごとに支払う。

    source_image

    String

    いずれかのパラメーターを指定する必要があります。

    一時ECSインスタンスの作成に使用されるベースイメージのID。 ECSコンソールのパブリックイメージリストから、またはDescribeImages操作を呼び出して、ベースイメージのIDを取得できます。

    重要

    選択したベースイメージが、一時ECSインスタンスを作成するために指定したインスタンスタイプをサポートしていることを確認してください。 たとえば、ベースイメージがIDに_arm64_が含まれるArmイメージの場合、Armベースのインスタンスタイプを指定する必要があります。 それ以外の場合、カスタムイメージは作成できません。

    image_family

    String

    一時ECSインスタンスの作成に使用されるイメージのイメージファミリー名。 このパラメーターを指定すると、指定されたイメージファミリーから最新の使用可能なイメージを取得して、一時ECSインスタンスを作成できます。

    説明

    名前の長さは 2 ~ 128 文字である必要があります。 名前は数字、特殊文字、http:// 、またはhttps:// で始めることはできません。 名前には、英数字、ピリオド (.) 、アンダースコア (_) 、ハイフン (-) 、およびコロン (:) を使用できます。

    target_image_family

    String

    不可

    カスタムイメージのイメージファミリ。

    説明

    名前の長さは 2 ~ 128 文字である必要があります。 名前は数字、特殊文字、http:// 、またはhttps:// で始めることはできません。 名前には、英数字、ピリオド (.) 、アンダースコア (_) 、ハイフン (-) 、およびコロン (:) を使用できます。

    ssh_private_ip

    Boolean

    いずれかのパラメーターを指定する必要があります。

    SSH経由でインスタンスのプライベートIPアドレスを使用して、一時ECSインスタンスに接続するかどうかを指定します。 デフォルト値:false 有効な値:

    • false: パブリックIPアドレスをインスタンスに割り当て、パブリックIPアドレスを使用してSSH経由でインスタンスに接続します。

    • true: elastic IPアドレス (EIP) をインスタンスに関連付けたり、パブリックIPアドレスを割り当てたりせず、インスタンスのプライベートIPアドレスを使用してSSH経由でインスタンスに接続します。

    説明

    Packerが一時ECSインスタンスのプライベートIPアドレスを使用してインスタンスに接続する場合、Packerが実行されているECSインスタンスは一時ECSインスタンスと同じvSwitchに接続する必要があります。

    associate_public_ip_adress

    Boolean

    一時ECSインスタンスにパブリックIPアドレスを割り当てるかどうかを指定します。

    eip_id

    String

    一時ECSインスタンスに関連付けられているEIPのID。

    skip_image_validation

    Boolean

    不可

    画像チェックをスキップするかどうかを指定します。 デフォルト値:false

    system_disk_mapping

    object

    不可

    システムディスクの構成。 例:

    "system_disk_mapping": {
     "disk_name": "sysdisk",
     "disk_category": "cloud_essd",
     "disk_size": 40
    }

    詳細については、このトピックの「クラウドディスク設定」セクションをご参照ください。

    image_disk_マッピング

    list

    不可

    カスタムイメージ内のデータディスク設定。 例:

    "image_disk_mappings": {
     "disk_name": "datadisk",
     "disk_snapshot_id": "s-bp1xxxxxx",
     "disk_device": "dev/xvdb"
    }

    詳細については、このトピックの「クラウドディスク設定」セクションをご参照ください。

    image_ignore_data_disk

    Boolean

    不可

    カスタムイメージにデータディスクスナップショットを含めるかどうかを指定します。 デフォルト値:false 有効な値:

    • false: カスタムイメージにデータディスクのスナップショットが含まれます。

    • true: カスタムイメージにデータディスクスナップショットは含まれません。 この場合、イメージはシステムディスクのみに基づいて作成されます。

    プロフィール

    String

    不可

    Packerの設定ファイル。 このパラメーターを指定すると、Packerは指定された構成ファイルから優先的に構成を取得します。

    ram_role_name

    String

    不可

    Packerが実行されている現在のECSインスタンスにアタッチされているインスタンスRAMロールの名前。 このパラメーターは、現在のECSインスタンスにアタッチされているインスタンスRAMロールに基づいてPackerテンプレートを実行するための一時的なAccessKeyペアを取得するために使用されます。

    説明

    このパラメーターは、インスタンスRAMロールがアタッチされているECSインスタンスでPackerが実行されるシナリオに適しています。

    ram_role_arn

    String

    不可

    RAM ロールの Alibaba Cloud Resource Name (ARN) です。 このパラメーターは、ram_session_nameパラメーターと組み合わせて使用し、アカウントAがアカウントBのIDを引き受けてカスタムイメージを作成することを指定します。

    ram_session_name

    String

    不可

    RAM ロールの名前です。 このパラメーターは、ram_role_arnパラメーターと組み合わせて使用し、アカウントAがアカウントBのIDを引き受けてカスタムイメージを作成することを指定します。

    ecs_ram_role_name

    String

    不可

    一時ECSインスタンスにアタッチされたインスタンスRAMロールの名前。 RAMが提供するListRoles操作を呼び出して、使用可能なインスタンスRAMロールのリストを照会できます。

    ssh_keypair_name

    String

    不可

    一時ECSインスタンスへの接続に使用されるSSHキーペアの名前。

    ssh_private_key_ファイル

    String

    不可

    一時ECSインスタンスへの接続に使用されるSSHキーペアの秘密鍵ファイルパス。

    custom_endpoint_ecs

    String

    不可

    一時ECSインスタンスのカスタムエンドポイント。

    security_group_id

    String

    不可

    一時ECSインスタンスを割り当てるセキュリティグループのID。

    security_group_name

    String

    不可

    一時ECSインスタンスを割り当てるセキュリティグループの名前。 セキュリティグループIDを指定しない場合、Packerは指定された名前を使用するセキュリティグループを作成します。

    vpc_id

    String

    不可

    一時ECSインスタンスを作成する仮想プライベートクラウド (VPC) のID。

    vpc_name

    String

    不可

    一時ECSインスタンスを作成するVPCの名前。 vpc_idパラメーターを指定しない場合、Packerは指定された名前を使用するVPCを作成します。

    vswitch_id

    String

    不可

    一時ECSインスタンスを接続するvSwitchのID。

    vswitch_name

    String

    不可

    一時ECSインスタンスを接続するvSwitchの名前。 vswitch_idパラメーターを指定しない場合、Packerは指定された名前を使用するvswitchを作成します。

    user_data

    String

    不可

    一時ECSインスタンスのユーザーデータ。 Base64-encodedデータを指定する必要があります。 instanceユーザーデータは、Base64エンコーディング前のサイズが32 KBを超えることはできません。 インスタンスユーザーデータの制限、形式、および実行頻度については、「インスタンスの初期化設定のカスタマイズ」をご参照ください。

    説明

    セキュリティを確保するために、パスワードや秘密鍵などの機密情報をインスタンスのユーザーデータの一部として渡すために平文を使用しないことを推奨します。 インスタンスのユーザーデータの一部として機密情報を渡す必要がある場合は、Base64で情報を暗号化およびエンコードし、インスタンスで同じ方法で情報をデコードおよび復号化することを推奨します。

    user_data_ファイル

    String

    不可

    一時ECSインスタンスのユーザーデータファイル。

    boot_mode

    String

    不可

    カスタムイメージのブートモード。 有効な値: BIOS、UEFI、およびUEFI-Preferred。

    wait_snapshot_ready_timeout

    Integer

    不可

    スナップショットのタイムアウト期間。 デフォルト値は 3600 です。 単位は秒です。

    instance_name

    String

    不可

    一時ECSインスタンスの名前。 デフォルト値は、インスタンスのInstanceId値です。

    説明

    名前は2 ~ 128文字で、英数字、コロン (:) 、アンダースコア (_) 、ピリオド (.) 、ハイフン (-) を使用できます。

    image_force_削除

    Boolean

    不可

    作成するカスタムイメージと同じ名前の既存のイメージを削除するかどうかを指定します。 デフォルト値:false 有効な値:

    • true: 作成するカスタムイメージと同じ名前の既存のイメージを削除し、カスタムイメージを作成します。

    • false: 作成するカスタムイメージと同じ名前の既存のイメージは削除されません。 この場合、イメージの作成に失敗します。

    image_force_delete_スナップショット

    Boolean

    不可

    作成するカスタムイメージと同じ名前の既存のイメージに関連付けられているスナップショットを削除するかどうかを指定します。 デフォルト値:false 有効な値:

    • true: 作成するカスタムイメージと同じ名前の既存のイメージと、既存のイメージに関連付けられているスナップショットを削除し、カスタムイメージを作成します。

    • false: 作成するカスタムイメージと同じ名前の既存のイメージ、または既存のイメージに関連付けられているスナップショットは削除されません。 この場合、イメージの作成に失敗します。

    image_version

    String

    不可

    カスタムイメージのバージョン。

    resource_group_id

    String

    不可

    カスタムイメージを割り当てるリソースグループのID。

    force_stop_instance

    Boolean

    不可

    一時ECSインスタンスを強制停止するかどうかを指定します。 デフォルト値:false

    disable_stop_instance

    Boolean

    不可

    デフォルトでは、Packerがプロビジョニングを実行した後、Packerは一時的なECSインスタンスを停止し、インスタンスからカスタムイメージを作成します。 ただし、WindowsインスタンスでSysprepを実行する場合など、特定のシナリオでは、インスタンスが [実行中] 状態である必要があります。 デフォルト値:false

    run_tags

    object

    不可

    カスタムイメージのタグ。 例: {"key":"value"}

    image_description

    String

    不可

    カスタムイメージの説明。

    image_share_アカウント

    [] 文字列

    不可

    カスタムイメージを共有するユーザー。 例: ["123456"]

    image_copy_リージョン

    [] 文字列

    不可

    カスタムイメージをコピーするリージョン。 例: ["cn-beijing"]

    provisioners

    String

    不可

    カスタムイメージの作成に使用されるプロビジョニングの種類。 有効な値:

    • ファイル

    • PowerShell

    • シェル

    • ローカルシェル

    • Windowsシェル

    詳細については、「Provisioners」をご参照ください。

    クラウドディスクの設定

    パラメーター

    必須 / 任意

    説明

    disk_name

    String

    不可

    クラウドディスクの名前。

    説明

    名前は2 ~ 128文字で、英数字、コロン (:) 、アンダースコア (_) 、ピリオド (.) 、ハイフン (-) を使用できます。

    dise_category

    String

    不可

    クラウドディスクのカテゴリ。 有効な値:

    • cloud_efficiency:Ultra ディスク

    • cloud_ssd:標準 SSD

    • cloud_essd:エンタープライズ SSD (ESSD)

    • cloud:基本ディスク

    disk_size

    int

    不可

    クラウドディスクのサイズ。 単位:GiB このパラメーターの値は、少なくとも20で、画像サイズ以上である必要があります。 デフォルト値: 40または画像のサイズのいずれか大きい方。

    disk_description

    String

    不可

    クラウドディスクの説明です。 このパラメーターはデフォルトでは何も指定されていません。

    説明

    説明の長さは 2 ~ 256 文字である必要があります。文頭に http:// または https:// を使用することはできません。

    disk_snapshot_id

    String

    不可

    データディスクの作成に使用するスナップショットのID。

    disk_delete_with_instance

    Boolean

    不可

    関連付けられたインスタンスがリリースされたときにデータディスクをリリースするかどうかを指定します。 有効な値:

    • true

    • false

    デフォルト値:true

    disk_device

    String

    不可

    データディスクのマウントポイント。

    disk_encrypted

    Boolean

    不可

    データディスクを暗号化するかどうかを指定します。 有効な値:

    • true

    • false

    デフォルト値:false

  5. Escキーを押して :wqと入力し、enterキーを押してalicloudファイルを保存して閉じます。

ステップ3: Packerを使用してカスタムイメージを作成する

作成したPackerテンプレートを使用してカスタムイメージを作成するには、次の手順を実行します。

  1. 次のコマンドを実行して、カスタムイメージを作成します。

    HCLファイル

    packer build alicloud.pkr.hcl

    次のサンプルコマンド出力は、IDがm-m5e3f0gu2dxs4z0s **** であるカスタムイメージが中国 (青島) リージョンに作成されていることを示しています。

    alicloud-ecs.autogenerated_1: output will be in this color.
    
    ==> alicloud-ecs.autogenerated_1: Prevalidating source region and copied regions...
    ==> alicloud-ecs.autogenerated_1: Prevalidating image name...
        alicloud-ecs.autogenerated_1: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd
    ==> alicloud-ecs.autogenerated_1: Creating temporary keypair: packer_64bf3d40-2fe7-8251-276d-df59a0bb****
    ---------------------------
    ==> alicloud-ecs.autogenerated_1: Provisioning with shell script: /tmp/packer-shell3356722207
        alicloud-ecs.autogenerated_1: Last metadata expiration check: 0:00:11 ago on Tue 25 Jul 2023 11:12:18 AM CST.
    ---------------------------
        alicloud-ecs.autogenerated_1: Complete!
    ==> alicloud-ecs.autogenerated_1: Stopping instance: i-m5e87pt498pr8zv0****
    ==> alicloud-ecs.autogenerated_1: Waiting instance stopped: i-m5e87pt498pr8zv0****
    ==> alicloud-ecs.autogenerated_1: Creating image: packer_basic
        alicloud-ecs.autogenerated_1: Detach keypair packer_64bf3d40-2fe7-8251-276d-df59a0bb**** from instance: i-m5e87pt498pr8zv0****
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'EIP'
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'instance'
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'security group'
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'vSwitch'
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'VPC'
    ==> alicloud-ecs.autogenerated_1: Deleting temporary keypair...
    Build 'alicloud-ecs.autogenerated_1' finished after 4 minutes 32 seconds.
    
    ==> Wait completed after 4 minutes 32 seconds
    
    ==> Builds finished. The artifacts of successful builds are:
    --> alicloud-ecs.autogenerated_1: Alicloud images were created:
    
    cn-qingdao: m-m5e3f0gu2dxs4z0s****

    JSONファイル

    packer build alicloud.json

    次のサンプルコマンド出力は、IDがm-m5e3f0gu2dxs4z0s **** であるカスタムイメージが中国 (青島) リージョンに作成されていることを示しています。

    alicloud-ecs output will be in this color.
    
    ==> alicloud-ecs: Prevalidating image name...
        alicloud-ecs: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd
    ==> alicloud-ecs: Creating temporary keypair: packer_6345090e-ec1f-8ea0-348c-f85ba047****
    ==> alicloud-ecs: Creating vpc
    ---------------------------
    ==> alicloud-ecs: Provisioning with shell script: /tmp/packer-shell090019677
        alicloud-ecs: Last metadata expiration check: 0:00:15 ago on Tue 11 Oct 2022 02:12:51 PM CST.
    ---------------------------
        alicloud-ecs: Complete!
    ==> alicloud-ecs: Deleting image snapshots.
    ==> alicloud-ecs: Creating image: packer_basic
        alicloud-ecs: Detach keypair packer_6345090e-ec1f-8ea0-348c-f85ba047**** from instance: i-m5e7it5p4dpwetfr****
    ==> alicloud-ecs: Cleaning up 'EIP'
    ==> alicloud-ecs: Cleaning up 'instance'
    ==> alicloud-ecs: Cleaning up 'security group'
    ==> alicloud-ecs: Cleaning up 'vSwitch'
    ==> alicloud-ecs: Cleaning up 'VPC'
    ==> alicloud-ecs: Deleting temporary keypair...
    Build 'alicloud-ecs' finished.
    
    ==> Builds finished. The artifacts of successful builds are:
    --> alicloud-ecs: Alicloud images were created:
    
    cn-qingdao: m-m5e3f0gu2dxs4z0s****
  2. 作成したカスタムイメージを表示します。

    1. ECSコンソール

    2. 左側のナビゲーションウィンドウで、インスタンス&画像 > イメージ.

    3. 上部のナビゲーションバーの左上隅で、alicloudファイルで指定されているリージョンを選択します。 例: 中国 (青島) 。

    4. [カスタムイメージ] タブで、packer_basicという名前のカスタムイメージを表示します。