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

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

最終更新日:Feb 12, 2026

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

前提条件

AccessKey ID と AccessKey Secret で構成される AccessKey ペアを所有している必要があります。詳細については、「AccessKey ペアの取得」をご参照ください。

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

  • RAM ユーザーの AccessKey Secret は、RAM ユーザーの AccessKey ペアを作成するときにのみ表示されます。AccessKey ペアの作成後に AccessKey Secret を照会することはできません。AccessKey Secret を記録し、機密に保管してください。

背景情報

Packer は、BuildersProvisioners、および Post-Processors などのさまざまなコンポーネントで構成されています。Packer は、Hashicorp Configuration Language (HCL) または JSON 形式のテンプレートを使用して、カスタムイメージの作成を簡素化します。これにより、手動でアドホックなイメージ作成プロセスが、管理しやすいコードとしての構成に変換され、アプリケーションをクラウドに移行するための障壁が低くなります。Packer の詳細については、公式 Packer ドキュメントをご参照ください。

操作手順

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

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

  2. /usr/local/bin ディレクトリに移動します:

    cd /usr/local/bin
    説明

    /usr/local/bin ディレクトリは、システムの PATH に含まれています。このディレクトリ、または既に PATH に含まれている他の任意のディレクトリに Packer をインストールできます。

  3. Packer インストールパッケージをダウンロードします。

    または、Install Packer ページにアクセスして、ご利用のインスタンスの OS とアーキテクチャに対応するパッケージをダウンロードします。この例では、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 -v
    • コマンドが Packer のバージョン番号を返した場合、Packer はインストールされています。

    • コマンドが command not found メッセージを返した場合、Packer は正しくインストールされていません。Packer が配置されているディレクトリがシステムの PATH に含まれていることを確認してください。

ステップ 2: Packer テンプレートの定義

Packer でカスタムイメージを作成するには、HCL または JSON フォーマットでテンプレートファイルを作成します。このテンプレートには、カスタムイメージを作成するための BuildersProvisioners を指定する必要があります。Packer は、イメージのコンテンツを設定するためのさまざまなタイプのプロビジョナーを提供しています。このトピックでは、Shell プロビジョナーを例に Packer テンプレートを定義します。

  1. AccessKey ID をインポートします。

    export ALICLOUD_ACCESS_KEY=<AccessKey ID>

    <AccessKey ID>」を実際の AccessKey ID に置き換えます。RAM ユーザーの AccessKey ID を確認するには、「RAM ユーザーの AccessKey ペアに関する情報を表示する」をご参照ください。

  2. AccessKey Secret をインポートします。

    export ALICLOUD_SECRET_KEY=<AccessKey Secret>

    <AccessKey Secret> を実際の AccessKey シークレットに置き換えてください。RAM ユーザーの AccessKey シークレットは、作成時のみ表示され、後から取得することはできません。詳細については、「AccessKey ペアの取得」をご参照ください。

  3. alicloud という名前のファイルを作成します。

    説明

    以下のいずれかのファイル形式を使用して、alicloud ファイルを作成できます。HCL ファイルを作成する場合は、以降の手順で HCL のサンプルとコマンドを使用することを確認してください。

    HCL ファイル

    vi alicloud.pkr.hcl

    JSON ファイル

    vi alicloud.json
  4. I」キーを押して挿入モードに入ります。以下のテンプレートのいずれかを 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

    Yes

    カスタムイメージの作成に使用される一時的な ECS インスタンスが配置されているリージョン。例: cn-qingdao

    image_name

    string

    Yes

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

    instance_type

    string

    Yes

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

    説明

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

    ssh_username

    string

    Yes

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

    internet_charge_type

    string

    No

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

    • PayByBandwidth: 帯域幅課金。

    • PayByTraffic: トラフィック課金。

    source_image

    string

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

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

    重要

    このパラメーターを構成するときは、選択したイメージタイプが指定されたインスタンスタイプと互換性があることを確認してください。たとえば、Arm イメージ (イメージ ID に _arm64_ が含まれる) は、Arm ベースのインスタンスタイプで使用する必要があります。そうしないと、イメージビルドは失敗します。

    image_family

    string

    イメージファミリーの名前。Packer は、このファミリーから利用可能な最新のイメージを使用してインスタンスを作成します。

    説明

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

    target_image_family

    string

    No

    作成するカスタムイメージのイメージファミリー。

    説明

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

    ssh_private_ip

    boolean

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

    プライベート SSH 接続経由でインスタンスに接続するかどうかを指定します。デフォルト値: false。有効な値:

    • false: インターネット経由の接続用に IP アドレスが割り当てられます。

    • true: Elastic IP アドレス (EIP) またはパブリック IP アドレスは割り当てられません。インスタンスはプライベート IP アドレス経由で接続されます。

    説明

    プライベート接続を使用するには、Packer が実行されているマシンと Packer によって作成されたマシンが同じネットワーク環境にある必要があります。つまり、同じ vSwitch 内にある必要があります。

    associate_public_ip_address

    boolean

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

    eip_id

    string

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

    skip_image_validation

    boolean

    No

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

    system_disk_mapping

    object

    No

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

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

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

    image_disk_mappings

    list

    No

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

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

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

    image_ignore_data_disks

    boolean

    No

    作成されたイメージにデータディスクのスナップショットが含まれるかどうかを指定します。デフォルト値: false。有効な値:

    • false: 作成されたイメージにはデータディスクが含まれます。

    • true: 作成されたイメージはシステムディスクのみに基づいており、データディスクは含まれません。

    profile

    string

    No

    Packer を実行するための構成ファイル。このパラメーターが指定されている場合、構成はこのファイルから優先的に取得されます。

    ram_role_name

    string

    No

    RAM ロールの名前。これは、ローカル RAM ロールが Packer テンプレートを実行するための一時的な AccessKey を取得するために使用されます。

    説明

    このパラメーターは、RAM ロールがアタッチされた ECS インスタンスで Packer が実行される場合にのみ適用されます。

    ram_role_arn

    string

    No

    RAM ロールの Alibaba Cloud リソースネーム (ARN) です。ram_session_name と共に使用することで、アカウント A はアカウント B のロールを偽装してイメージを作成できます。

    ram_session_name

    string

    No

    RAM ロールセッションの名前です。ram_role_arn と併用して、アカウント A がアカウント B のロールを偽装してイメージを作成できるようにします。

    ecs_ram_role_name

    string

    No

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

    ssh_keypair_name

    string

    No

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

    ssh_private_key_file

    string

    No

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

    custom_endpoint_ecs

    string

    No

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

    security_group_id

    string

    No

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

    security_group_name

    string

    No

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

    vpc_id

    string

    No

    一時的な ECS インスタンスを作成する Virtual Private Cloud (VPC) の ID。

    vpc_name

    string

    No

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

    vswitch_id

    string

    No

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

    vswitch_name

    string

    No

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

    user_data

    string

    No

    インスタンスのユーザーデータ。データは Base64 エンコードされている必要があり、生データのサイズは 32 KB を超えることはできません。ユーザーデータの制限、形式、および実行頻度の詳細については、「インスタンスの初期化構成のカスタマイズ」をご参照ください。

    説明

    転送中にパスワードや秘密鍵などの機密データを保護するには、Base64 エンコードする前にそれらを暗号化し、インスタンス内でデータを復号化します。

    user_data_file

    string

    No

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

    boot_mode

    string

    No

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

    wait_snapshot_ready_timeout

    Integer

    No

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

    instance_name

    string

    No

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

    説明

    名前は 2 ~ 128 文字の長さで、文字、数字、コロン (:)、アンダースコア (_)、ピリオド (.)、およびハイフン (-) を含めることができます。

    image_force_delete

    boolean

    No

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

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

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

    image_force_delete_snapshots

    boolean

    No

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

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

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

    image_version

    string

    No

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

    resource_group_id

    string

    No

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

    force_stop_instance

    boolean

    No

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

    disable_stop_instance

    boolean

    No

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

    run_tags

    object

    No

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

    image_description

    string

    No

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

    image_share_account

    []string

    No

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

    image_copy_regions

    []string

    No

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

    provisioners

    string

    No

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

    • File

    • PowerShell

    • Shell

    • Local Shell

    • Windows Shell

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

    クラウドディスク構成

    パラメーター

    タイプ

    必須

    説明

    disk_name

    string

    No

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

    説明

    名前は 2 ~ 128 文字の長さで、文字、数字、コロン (:)、アンダースコア (_)、ピリオド (.)、およびハイフン (-) を含めることができます。

    disk_category

    string

    No

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

    • cloud_efficiency: Ultra ディスク

    • cloud_ssd: 標準 SSD

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

    • cloud: 基本ディスク

    disk_size

    int

    No

    クラウドディスクのサイズ。単位: GiB。このパラメーターの値は 20 以上で、イメージサイズ以上である必要があります。デフォルト値: 40 またはイメージサイズのうち大きい方。

    disk_description

    string

    No

    クラウドディスクの説明。このパラメーターはデフォルトで空のままです。

    説明

    説明は 2 文字以上 256 文字以下である必要があります。また、http:// または https:// で始めてはいけません。

    disk_snapshot_id

    string

    No

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

    disk_delete_with_instance

    boolean

    No

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

    • true

    • false

    デフォルト値: true。

    disk_device

    string

    No

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

    disk_encrypted

    boolean

    No

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

    • true

    • false

    デフォルト値: false。

  5. Esc を押し、:wq と入力し、その後 Enter を押して、ファイルを保存して終了します。

ステップ 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. 上部のナビゲーションバーで、テンプレートファイルで指定したリージョン (中国 (青島) など) を選択します。

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