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はイメージ作成プロセスを標準化および自動化し、クラウド移行を容易にするコードとしてイメージを定義できます。
手順
ステップ1: Packerのインストール
Linuxインスタンスに接続します。
詳細については、「パスワードを使用したLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、
/usr/local/bin
ディレクトリに移動します。cd /usr /ローカル /ビン
説明/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のバージョンを確認します。
パッカー-v
Packerが正しくインストールされている場合は、Packerバージョン番号が返されます。
Packetがインストールされていない場合、
command not found
メッセージが返されます。 Packerが存在するディレクトリが環境変数に追加されているかどうかを確認します。
手順2: Packerテンプレートの定義
Packerを使用してカスタムイメージを作成するには、HCLまたはJSON形式のテンプレートを作成します。 テンプレートで、ビルダーとプロビジョニングを指定します。 詳細については、「Builders」および「Provisioners」をご参照ください。 Packerは、カスタムイメージの作成に使用できるさまざまなプロビジョニングを提供します。 この例では、Shell provisionerが使用されます。
次のコマンドを実行して、AccessKey IDをインポートします。
ALICLOUD_ACCESS_KEY=<AccessKey ID> のエクスポート
上記のコマンドで、
<AccessKey ID>
をAccessKey IDに置き換えます。 RAMユーザーのAccessKey IDを照会する方法については、「RAMユーザーのAccessKeyペアに関する情報の表示」をご参照ください。次のコマンドを実行して、AccessKeyシークレットをインポートします。
エクスポート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モードに入り、ビジネス要件に基づいて次のコンテンツのパラメーターを設定し、そのコンテンツをalicloud
ファイルに貼り付けます。HCLファイル
変数 "access_key" { type = string default = "${env(" ALICLOUD_ACCESS_KEY ")}" } 変数 "secret_key" { type = string default = "${env(" ALICLOUD_SECRET_KEY ")}" } ソース "alicloud-ecs" "autogeneated_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" ] }] }
下表に、各パラメーターを説明します。
メタデータアイテム
クラスターの説明
region
カスタムイメージの作成に使用される一時インスタンスが存在するリージョン。 例:
cn-qingdao
image_name
カスタムイメージの名前 例:
packer_basic
。source_image
一時インスタンスの作成に使用されるベースイメージの名前。 ECSコンソールのパブリックイメージリストから、またはDescribeImages操作を呼び出して、ベースイメージの名前を取得できます。
重要選択したベースイメージが、一時インスタンスを作成するために指定したインスタンスタイプをサポートしていることを確認してください。 たとえば、ベースイメージがIDに_arm64_が含まれるArmイメージの場合、Armベースのインスタンスを指定する必要があります。 それ以外の場合、カスタムイメージは作成できません。
instance_type
カスタムイメージの作成に使用される一時インスタンスのインスタンスタイプ。 例:
ecs.g6.large
カスタムイメージが作成されると、一時インスタンスは自動的にリリースされます。説明Packerがカスタムイメージを作成すると、CreateInstance操作が呼び出されて一時インスタンスが作成されます。 インスタンスには、カスタムイメージの作成に必要なオペレーティングシステムとソフトウェアが含まれています。 一時インスタンスは従量課金インスタンスです。 インスタンスに対して課金されます。
internet_charge_type
カスタムイメージの作成に使用される一時インスタンスのネットワーク使用の課金方法。 有効な値:
PayByBandwidth: 帯域幅による支払い。
トラフィック課金
provisioners
カスタムイメージの作成に使用されるプロビジョニングの種類。 有効な値:
ファイル
PowerShell
シェル
ローカルシェル
Windowsシェル
詳細については、「Provisioners」をご参照ください。
Esc
キーを押して:wq
と入力し、enterキーを押して変更を保存し、挿入モードを終了します。
ステップ3: Packerを使用してカスタムイメージを作成する
作成したPackerテンプレートを使用してカスタムイメージを作成するには、次の操作を実行します。
次のコマンドを実行して、カスタムイメージを作成します。
HCLファイル
パッカービルドalicloud.pkr.hcl
次のサンプルコマンド出力は、IDが
m-m5e3f0gu2dxs4z0s ****
であるカスタムイメージが中国 (青島) リージョンに作成されていることを示しています。alicloud-ecs.autogenerated_1: 出力はこの色になります。 ==> alicloud-ecs.autogenerated_1: ソースリージョンとコピーされたリージョンの事前検証... ==> alicloud-ecs.autogenerated_1: イメージ名の事前検証... alicloud-ecs.autogenerated_1: 画像ID: aliyun_3_x64_20G_alibase_20220907.vhd ==> alicloud-ecs.autogenerated_1: 一時的なキーペアの作成: packer_64bf3d40-2fe7-8251-276d-df59a0bb **** --------------------------- ==> alicloud-ecs.autogenerated_1: シェルスクリプトによるプロビジョニング: /tmp/packer-shell3356722207 alicloud-ecs.autogenerated_1: 最後のメタデータ有効期限チェック: 0:00:11 ago on Tue 25 July 2023 11:12:18 AM CST。 --------------------------- alicloud-ecs.autogenerated_1: Complete! ==> alicloud-ecs.autogenerated_1: インスタンスの停止: i-m5e87pt498pr8zv0 **** ==> alicloud-ecs.autogenerated_1: 待機中のインスタンス停止: i-m5e87pt498pr8zv0 **** ==> alicloud-ecs.autogenerated_1: イメージの作成: packer_basic alicloud-ecs.autogenerated_1: インスタンスから **** packer_64bf3d40-2fe7-8251-276d-df59a0bbキーペアを取り外す: i-m5e87pt498pr8zv0 **** ==> alicloud-ecs.autogenerated_1: 「EIP」のクリーンアップ ==> alicloud-ecs.autogenerated_1: 「インスタンス」のクリーンアップ ==> alicloud-ecs.autogenerated_1: 「セキュリティグループ」のクリーンアップ ==> alicloud-ecs.autogenerated_1: 「vSwitch」のクリーンアップ ==> alicloud-ecs.autogenerated_1: 「VPC」のクリーンアップ ==> alicloud-ecs.autogenerated_1: 一時的なキーペアの削除... 'alicloud-ecs. autogeneated_1 'の構築は、4分32秒後に終了しました。 ==> 4分32秒後に完了した待機 ==> 完成したビルド。 成功したビルドの成果物は次のとおりです。-> alicloud-ecs.autogenerated_1: Alicloud画像が作成されました: cn-qingdao: m-m5e3f0gu2dxs4z0s ****
JSONファイル
パッカービルドalicloud.json
次のサンプルコマンド出力は、IDが
m-m5e3f0gu2dxs4z0s ****
であるカスタムイメージが中国 (青島) リージョンに作成されていることを示しています。alicloud-ecs出力はこの色になります。 ==> alicloud-ecs: Prevalidating image name... alicloud-ecs: 見つかったイメージID: aliyun_3_x64_20G_alibase_20220907.vhd ==> alicloud-ecs: 一時的なキーペアの作成: packer_6345090e-ec1f-8ea0-348c-f85ba047 **** ==> alicloud-ecs: vpcの作成 --------------------------- ==> alicloud-ecs: シェルスクリプトを使用したプロビジョニング: /tmp/packer-shell090019677 alicloud-ecs: 最後のメタデータの有効期限チェック: 0:00:15 ago 10月11日火曜日2022 02:12:51 PM CST。 --------------------------- alicloud-ecs: Complete! ==> alicloud-ecs: イメージスナップショットを削除します。 ==> alicloud-ecs: Creating image: packer_basic alicloud-ecs: デタッチキーペアpacker_6345090e-ec1f-8ea0-348c-f85ba047 **** インスタンスから: i-m5e7it5p4dpwetfr **** ==> alicloud-ecs: 「EIP」のクリーンアップ ==> alicloud-ecs: 「インスタンス」のクリーンアップ ==> alicloud-ecs: 「セキュリティグループ」のクリーンアップ ==> alicloud-ecs: 「vSwitch」のクリーンアップ ==> alicloud-ecs: 'VPC' のクリーンアップ ==> alicloud-ecs: 一時的なキーペアの削除... Build 'alicloud-ecs' finished. ==> Builds finished. 成功したビルドの成果物は次のとおりです。-> alicloud-ecs: Alicloudイメージが作成されました: cn-qingdao: m-m5e3f0gu2dxs4z0s ****
作成したカスタムイメージを表示します。
にログインします。ECSコンソール.
左側のナビゲーションウィンドウで、 .
上部のナビゲーションバーの左上隅で、
alicloud
ファイルで指定されているリージョンを選択します。 例: 中国 (青島) 。[カスタムイメージ] タブで、packer_basicという名前のカスタムイメージを表示します。