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は、Builders、Provisioners、Post-Processorなどのさまざまなコンポーネントで構成されています。 Packerは、Hashicorp構成言語 (HCL) またはJSON形式のテンプレートを使用して、カスタムイメージを作成するプロセスを簡素化します。 さらに、Packerはイメージ作成プロセスを標準化および自動化し、クラウド移行を容易にするコードとしてイメージを定義できます。 Packerの詳細については、Packerの公式ドキュメントをご参照ください。
手順
ステップ1: Packerのインストール
Linuxインスタンスに接続します。
詳細については、「ユーザー名とパスワードを使用したLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、
/usr/local/bin
ディレクトリに移動します。cd /usr/local/bin
説明/usr/local/binディレクトリは環境変数に含まれます。 このディレクトリまたは環境変数に追加された別のディレクトリにPackerをインストールできます。
次のコマンドを実行して、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
次のコマンドを実行して、Packerインストールパッケージを解凍します。
unzip packer_1.8.5_linux_amd64.zip
次のコマンドを実行して、Packerがインストールされているかどうかを確認し、Packerのバージョンを確認します。
packer -v
Packerが正しくインストールされている場合は、Packerバージョン番号が返されます。
Packetがインストールされていない場合、
command not found
メッセージが返されます。 Packerが存在するディレクトリが環境変数に追加されているかどうかを確認します。
手順2: Packerテンプレートの定義
Packerを使用してカスタムイメージを作成するには、HCLまたはJSON形式のテンプレートを作成します。 テンプレートで、ビルダーとプロビジョニングを指定します。 詳細については、「Builders」および「Provisioners」をご参照ください。 Packerは、カスタムイメージの作成に使用できるさまざまなプロビジョニングを提供します。 この例では、Shell provisionerが使用されます。
次のコマンドを実行して、AccessKey IDをインポートします。
export ALICLOUD_ACCESS_KEY=<AccessKey ID>
上記のコマンドで、
<AccessKey ID>
をAccessKey IDに置き換えます。 RAM (Resource Access Management) ユーザーのAccessKey IDを照会する方法については、「RAMユーザーのAccessKeyペアに関する情報の表示」をご参照ください。次のコマンドを実行して、AccessKeyシークレットをインポートします。
export ALICLOUD_SECRET_KEY=<AccessKey Secret>
上記のコマンドで、
<AccessKey Secret>
をAccessKey secretに置き換えます。 RAMユーザーのAccessKeyシークレットは、RAMユーザーのAccessKeyペアを作成した場合にのみ表示されます。 AccessKeyペアの作成後、AccessKeyシークレットを照会することはできません。 詳細については、「AccessKeyペアの取得」をご参照ください。次のコマンドを実行して、
alicloud
という名前のファイルを作成します。説明alicloud
ファイルはHCLまたはJSON形式で作成できます。 HCL形式でファイルを作成する場合は、HCL形式のテンプレートに適した後続の操作を実行します。HCLファイル
vi alicloud.pkr.hcl
JSONファイル
vi alicloud.json
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
Esc
キーを押して:wq
と入力し、enterキーを押してalicloudファイルを保存して閉じます。
ステップ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****
作成したカスタムイメージを表示します。
左側のナビゲーションウィンドウで、 .
上部のナビゲーションバーの左上隅で、
alicloud
ファイルで指定されているリージョンを選択します。 例: 中国 (青島) 。[カスタムイメージ] タブで、packer_basicという名前のカスタムイメージを表示します。