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 は、Builders、Provisioners、および Post-Processors などのさまざまなコンポーネントで構成されています。Packer は、Hashicorp Configuration Language (HCL) または JSON 形式のテンプレートを使用して、カスタムイメージの作成を簡素化します。これにより、手動でアドホックなイメージ作成プロセスが、管理しやすいコードとしての構成に変換され、アプリケーションをクラウドに移行するための障壁が低くなります。Packer の詳細については、公式 Packer ドキュメントをご参照ください。
操作手順
ステップ 1: Packer のインストール
Linux インスタンスに接続します。
詳細については、「ユーザー名とパスワードを使用して Linux インスタンスに接続する」をご参照ください。
/usr/local/binディレクトリに移動します:cd /usr/local/bin説明/usr/local/binディレクトリは、システムのPATHに含まれています。このディレクトリ、または既にPATHに含まれている他の任意のディレクトリに Packer をインストールできます。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.zipPacker インストールパッケージを解凍します。
unzip packer_1.8.5_linux_amd64.zipPacker のバージョンを確認して、インストールを検証します。
packer -vコマンドが Packer のバージョン番号を返した場合、Packer はインストールされています。
コマンドが
command not foundメッセージを返した場合、Packer は正しくインストールされていません。Packer が配置されているディレクトリがシステムのPATHに含まれていることを確認してください。
ステップ 2: Packer テンプレートの定義
Packer でカスタムイメージを作成するには、HCL または JSON フォーマットでテンプレートファイルを作成します。このテンプレートには、カスタムイメージを作成するための Builders と Provisioners を指定する必要があります。Packer は、イメージのコンテンツを設定するためのさまざまなタイプのプロビジョナーを提供しています。このトピックでは、Shell プロビジョナーを例に Packer テンプレートを定義します。
AccessKey ID をインポートします。
export ALICLOUD_ACCESS_KEY=<AccessKey ID>「
<AccessKey ID>」を実際の AccessKey ID に置き換えます。RAM ユーザーの AccessKey ID を確認するには、「RAM ユーザーの AccessKey ペアに関する情報を表示する」をご参照ください。AccessKey Secret をインポートします。
export ALICLOUD_SECRET_KEY=<AccessKey Secret><AccessKey Secret>を実際の AccessKey シークレットに置き換えてください。RAM ユーザーの AccessKey シークレットは、作成時のみ表示され、後から取得することはできません。詳細については、「AccessKey ペアの取得」をご参照ください。alicloudという名前のファイルを作成します。説明以下のいずれかのファイル形式を使用して、
alicloudファイルを作成できます。HCL ファイルを作成する場合は、以降の手順で HCL のサンプルとコマンドを使用することを確認してください。HCL ファイル
vi alicloud.pkr.hclJSON ファイル
vi alicloud.json「
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 ドキュメントをご参照ください。
パラメーター
タイプ
必須
説明
regionstring
Yes
カスタムイメージの作成に使用される一時的な ECS インスタンスが配置されているリージョン。例:
cn-qingdao。image_namestring
Yes
カスタムイメージの名前。例:
packer_basic。instance_typestring
Yes
カスタムイメージの作成に使用される一時的な ECS インスタンスのインスタンスタイプ。例:
ecs.g6.large。カスタムイメージが作成されると、一時的な ECS インスタンスは自動的にリリースされます。説明Packer を使用してカスタムイメージを作成すると、CreateInstance 操作が呼び出され、一時的な ECS インスタンスが作成されます。このインスタンスには、イメージ作成に必要なオペレーティングシステムとソフトウェアが含まれています。この従量課金インスタンスには料金が発生します。
ssh_usernamestring
Yes
SSH 経由で一時的な ECS インスタンスに接続するために使用されるユーザー名。
internet_charge_typestring
No
カスタムイメージの作成に使用される一時的な ECS インスタンスのネットワーク使用量に対する課金方法。有効な値:
PayByBandwidth: 帯域幅課金。
PayByTraffic: トラフィック課金。
source_imagestring
いずれかのパラメーターを指定する必要があります。
一時的な ECS インスタンスの作成に使用されるベースイメージの ID。ベースイメージの ID は、ECS コンソールのパブリックイメージリストから、または DescribeImages 操作を呼び出すことで取得できます。
重要このパラメーターを構成するときは、選択したイメージタイプが指定されたインスタンスタイプと互換性があることを確認してください。たとえば、Arm イメージ (イメージ ID に
_arm64_が含まれる) は、Arm ベースのインスタンスタイプで使用する必要があります。そうしないと、イメージビルドは失敗します。image_familystring
イメージファミリーの名前。Packer は、このファミリーから利用可能な最新のイメージを使用してインスタンスを作成します。
説明名前は 2 ~ 128 文字の長さである必要があります。名前は数字、特殊文字、http://、または https:// で始めることはできません。名前には、文字、数字、ピリオド (.)、アンダースコア (_)、ハイフン (-)、およびコロン (:) を含めることができます。
target_image_familystring
No
作成するカスタムイメージのイメージファミリー。
説明名前は 2 ~ 128 文字の長さである必要があります。名前は数字、特殊文字、http://、または https:// で始めることはできません。名前には、文字、数字、ピリオド (.)、アンダースコア (_)、ハイフン (-)、およびコロン (:) を含めることができます。
ssh_private_ipboolean
いずれかのパラメーターを指定する必要があります。
プライベート SSH 接続経由でインスタンスに接続するかどうかを指定します。デフォルト値: false。有効な値:
false: インターネット経由の接続用に IP アドレスが割り当てられます。
true: Elastic IP アドレス (EIP) またはパブリック IP アドレスは割り当てられません。インスタンスはプライベート IP アドレス経由で接続されます。
説明プライベート接続を使用するには、Packer が実行されているマシンと Packer によって作成されたマシンが同じネットワーク環境にある必要があります。つまり、同じ vSwitch 内にある必要があります。
associate_public_ip_addressboolean
一時的な ECS インスタンスにパブリック IP アドレスを割り当てるかどうかを指定します。
eip_idstring
一時的な ECS インスタンスに関連付けられている EIP の ID。
skip_image_validationboolean
No
イメージチェックをスキップするかどうかを指定します。デフォルト値: false。
system_disk_mappingobject
No
システムディスク構成。例:
"system_disk_mapping": { "disk_name": "sysdisk", "disk_category": "cloud_essd", "disk_size": 40 }詳細については、このトピックの「クラウドディスク構成」セクションをご参照ください。
image_disk_mappingslist
No
カスタムイメージ内のデータディスク構成。例:
"image_disk_mappings": { "disk_name": "datadisk", "disk_snapshot_id": "s-bp1xxxxxx", "disk_device": "dev/xvdb" }詳細については、このトピックの「クラウドディスク構成」セクションをご参照ください。
image_ignore_data_disksboolean
No
作成されたイメージにデータディスクのスナップショットが含まれるかどうかを指定します。デフォルト値: false。有効な値:
false: 作成されたイメージにはデータディスクが含まれます。
true: 作成されたイメージはシステムディスクのみに基づいており、データディスクは含まれません。
profilestring
No
Packer を実行するための構成ファイル。このパラメーターが指定されている場合、構成はこのファイルから優先的に取得されます。
ram_role_namestring
No
RAM ロールの名前。これは、ローカル RAM ロールが Packer テンプレートを実行するための一時的な AccessKey を取得するために使用されます。
説明このパラメーターは、RAM ロールがアタッチされた ECS インスタンスで Packer が実行される場合にのみ適用されます。
ram_role_arnstring
No
RAM ロールの Alibaba Cloud リソースネーム (ARN) です。
ram_session_nameと共に使用することで、アカウント A はアカウント B のロールを偽装してイメージを作成できます。ram_session_namestring
No
RAM ロールセッションの名前です。
ram_role_arnと併用して、アカウント A がアカウント B のロールを偽装してイメージを作成できるようにします。ecs_ram_role_namestring
No
一時的な ECS インスタンスにアタッチされたインスタンス RAM ロールの名前。RAM が提供する ListRoles 操作を呼び出すことで、利用可能なインスタンス RAM ロールのリストを照会できます。
ssh_keypair_namestring
No
一時的な ECS インスタンスに接続するために使用される SSH キーペアの名前。
ssh_private_key_filestring
No
一時的な ECS インスタンスに接続するために使用される SSH キーペアの秘密鍵ファイルパス。
custom_endpoint_ecsstring
No
一時的な ECS インスタンスのカスタムエンドポイント。
security_group_idstring
No
一時的な ECS インスタンスを割り当てるセキュリティグループの ID。
security_group_namestring
No
一時的な ECS インスタンスを割り当てるセキュリティグループの名前。セキュリティグループ ID を指定しない場合、Packer は指定された名前を使用するセキュリティグループを作成します。
vpc_idstring
No
一時的な ECS インスタンスを作成する Virtual Private Cloud (VPC) の ID。
vpc_namestring
No
一時的な ECS インスタンスを作成する VPC の名前です。
vpc_idパラメーターを指定しない場合、Packer は指定された名前を使用して VPC を作成します。vswitch_idstring
No
一時的な ECS インスタンスを接続する vSwitch の ID。
vswitch_namestring
No
一時的な ECS インスタンスを接続する vSwitch の名前です。
vswitch_idパラメーターを指定しない場合、Packer は指定された名前を使用して vSwitch を作成します。user_datastring
No
インスタンスのユーザーデータ。データは Base64 エンコードされている必要があり、生データのサイズは 32 KB を超えることはできません。ユーザーデータの制限、形式、および実行頻度の詳細については、「インスタンスの初期化構成のカスタマイズ」をご参照ください。
説明転送中にパスワードや秘密鍵などの機密データを保護するには、Base64 エンコードする前にそれらを暗号化し、インスタンス内でデータを復号化します。
user_data_filestring
No
一時的な ECS インスタンスのユーザーデータファイル。
boot_modestring
No
カスタムイメージの起動モード。有効な値: BIOS、UEFI、および UEFI-Preferred。
wait_snapshot_ready_timeoutInteger
No
スナップショットのタイムアウト期間。デフォルト値: 3600。単位: 秒。
instance_namestring
No
一時的な ECS インスタンスの名前。デフォルト値はインスタンスの
InstanceId値です。説明名前は 2 ~ 128 文字の長さで、文字、数字、コロン (:)、アンダースコア (_)、ピリオド (.)、およびハイフン (-) を含めることができます。
image_force_deleteboolean
No
作成しようとしているカスタムイメージと同じ名前の既存のイメージを削除するかどうかを指定します。デフォルト値: false。有効な値:
true: 作成しようとしているカスタムイメージと同じ名前の既存のイメージを削除し、カスタムイメージを作成します。
false: 作成しようとしているカスタムイメージと同じ名前の既存のイメージを削除しません。この場合、イメージ作成は失敗します。
image_force_delete_snapshotsboolean
No
作成しようとしているカスタムイメージと同じ名前の既存のイメージに関連付けられているスナップショットを削除するかどうかを指定します。デフォルト値: false。有効な値:
true: 作成しようとしているカスタムイメージと同じ名前の既存のイメージと、既存のイメージに関連付けられているスナップショットを削除し、カスタムイメージを作成します。
false: 作成しようとしているカスタムイメージと同じ名前の既存のイメージ、または既存のイメージに関連付けられているスナップショットを削除しません。この場合、イメージ作成は失敗します。
image_versionstring
No
カスタムイメージのバージョン。
resource_group_idstring
No
カスタムイメージを割り当てるリソースグループの ID。
force_stop_instanceboolean
No
一時的な ECS インスタンスを強制停止するかどうかを指定します。デフォルト値: false。
disable_stop_instanceboolean
No
デフォルトでは、Packer はプロビジョナーを実行した後、一時的な ECS インスタンスを停止し、そのインスタンスからカスタムイメージを作成します。ただし、Windows インスタンスで Sysprep を実行する場合など、特定のシナリオではインスタンスが実行中状態である必要があります。デフォルト値: false。
run_tagsobject
No
カスタムイメージのタグ。例:
{"key":"value"}。image_descriptionstring
No
カスタムイメージの説明。
image_share_account[]string
No
カスタムイメージを共有するユーザー。例:
["123456"]。image_copy_regions[]string
No
カスタムイメージをコピーするリージョン。例:
["cn-beijing"]。provisionersstring
No
カスタムイメージの作成に使用されるプロビジョナーのタイプ。有効な値:
File
PowerShell
Shell
Local Shell
Windows Shell
詳細については、「Provisioners」をご参照ください。
クラウドディスク構成
パラメーター
タイプ
必須
説明
disk_namestring
No
クラウドディスクの名前。
説明名前は 2 ~ 128 文字の長さで、文字、数字、コロン (:)、アンダースコア (_)、ピリオド (.)、およびハイフン (-) を含めることができます。
disk_categorystring
No
クラウドディスクのカテゴリ。有効な値:
cloud_efficiency: Ultra ディスク
cloud_ssd: 標準 SSD
cloud_essd: ESSD (エンタープライズ SSD)
cloud: 基本ディスク
disk_sizeint
No
クラウドディスクのサイズ。単位: GiB。このパラメーターの値は 20 以上で、イメージサイズ以上である必要があります。デフォルト値: 40 またはイメージサイズのうち大きい方。
disk_descriptionstring
No
クラウドディスクの説明。このパラメーターはデフォルトで空のままです。
説明説明は 2 文字以上 256 文字以下である必要があります。また、
http://またはhttps://で始めてはいけません。disk_snapshot_idstring
No
データディスクの作成に使用するスナップショットの ID。
disk_delete_with_instanceboolean
No
関連するインスタンスがリリースされたときにデータディスクをリリースするかどうかを指定します。有効な値:
true
false
デフォルト値: true。
disk_devicestring
No
データディスクのマウントポイント。
disk_encryptedboolean
No
データディスクを暗号化するかどうかを指定します。有効な値:
true
false
デフォルト値: false。
Escを押し、:wqと入力し、その後Enterを押して、ファイルを保存して終了します。
ステップ 3: Packer を使用したカスタムイメージの作成
Packer テンプレートファイルからカスタムイメージをビルドするには、次の手順に従います。
カスタムイメージを作成します。
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****作成されたカスタムイメージを検証します。
ECS コンソールにログインしてください。
左側のナビゲーションウィンドウで、を選択します。
上部のナビゲーションバーで、テンプレートファイルで指定したリージョン (中国 (青島) など) を選択します。
[カスタムイメージ] タブで、[packer_basic] という名前のイメージを探します。