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