Packerは、HashiCorpが提供するオープンソースツールであり、複数のプラットフォームで同じ構成の画像を作成するために使用されます。 DevOpsのプラクティスでは、Packerはビルドと展開のプロセスを自動化します。 Packerでは、定義済みのテンプレートを使用して、ポータブルで再利用可能なベースイメージを作成できます。 これにより、開発、テスト、および本番環境でイメージの一貫性が確保されます。 このトピックでは、Packerを使用してECSでカスタムイメージを作成するときにDevOpsを実装するために使用される、一般的なAlibaba Cloud Elastic Compute Service (ECS) Image Builderパラメーターについて説明します。 たとえば、パラメーターを使用してカスタムイメージにタグを追加したり、システムディスクのみに基づいてイメージを作成したり、スナップショットのタイムアウト期間を指定したりできます。
カスタム画像にタグを追加するために使用されるパラメータ
シナリオ: 複数のカスタムイメージがある場合、イメージにタグを追加して、管理と検索を簡単に行うことができます。 たとえば、画像のバージョン番号や画像に含まれるアプリケーションの種類を記録するタグを追加できます。 Alibaba Cloud ECS Image Builderは、tagsパラメーターを提供します。 Packerを使用してカスタムイメージを作成するときにこのパラメーターを指定すると、パラメーターで指定したタグが作成されたイメージに追加されます。 詳細については、「タグ」をご参照ください。
Packerフィールド: タグ {"key":"value"} 。
使用法: ECSコンソールで、またはDescribeImages操作を呼び出して、タグ付きの画像をクエリすると、タグを表示できます。 タグで画像をフィルタリングすることもできます。 画像に追加されたタグは、Terraformと一緒に使用して、エンタープライズレベルのDevOpsプロセスを標準化できます。
例: 次の設定では、
"version":"v1.0.0"と"app":"web"タグが生成されたイメージと対応するスナップショットに追加されます。{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [{ "type":"alicloud-ecs", "access_key":"{{user `access_key`}}", "secret_key":"{{user `secret_key`}}", "region":"cn-beijing", "image_name":"packer_basic", "source_image":"centos_7_03_64_20G_alibase_20170818.vhd", "ssh_username":"root", "instance_type":"ecs.t5-lc1m1.small", "internet_charge_type":"PayByTraffic", "io_optimized":"true", "tags": { "version": "v1.0.0", "app": "web" } }] }
システムディスクのみに基づいてイメージを作成するかどうかを指定するために使用するパラメーター
シナリオ: デフォルトでは、PackerはECSインスタンスから直接イメージを作成します。 インスタンスにデータディスクがある場合、インスタンスに基づいて生成されるイメージにはデータディスクのスナップショットが含まれます。
説明次のいずれかの方法を使用して、データディスクを持つインスタンスを作成できます。
方法1: image_disk_mappingsパラメーターでデータディスクパラメーターを設定します。 詳細については、「Packerドキュメント」の「Alicloud ECS」をご参照ください。
方法2: データディスクに付属するインスタンスタイプ (ecs.d1ne.2xlargeなど) を選択します。 ほとんどの場合、データディスクはローカルディスクであり、スナップショットの作成には使用できません。 したがって、データディスクに付属のインスタンスタイプを使用してイメージを作成することはできません。
Packerフィールド: image_ignore_data_disks データ型:Boolean
使用法: データディスクを含むECSインスタンスからイメージを作成したいが、イメージにデータディスクスナップショットを含ませたくない場合は、
"image_ignore_data_disks": "true"を設定ファイルに追加できます。 これにより、システムディスクのみに基づいてイメージを作成できます。例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type":"alicloud-ecs", "access_key":"{{user `access_key`}}", "secret_key":"{{user `secret_key`}}", "region":"cn-hangzhou", "image_name":"packer_basic", "source_image":"aliyun_3_9_x64_20G_alibase_20231219.vhd", "associate_public_ip_address":true, "ssh_username":"root", "instance_type":"ecs.s6-c1m2.large", "internet_charge_type":"PayByTraffic", "io_optimized":true, "skip_image_validation":true, "image_disk_mappings": [ { "disk_snapshot_id": "s-bp1xxxxxx", "disk_device": "dev/xvdb" }], "image_ignore_data_disks": "true" } ] }
スナップショットタイムアウト期間の指定に使用するパラメーター
シナリオ: イメージはスナップショットから作成されます。 ディスクのスナップショットの作成に必要な時間は、ディスクサイズによって異なります。 大きなディスクの場合、スナップショットの作成に長時間が必要になり、タイムアウトが発生する可能性があります。 タイムアウトエラーを防ぐには、
wait_snapshot_ready_timeoutフィールドを設定して、タイムアウト期間を延長します。Packerフィールド: wait_snapshot_ready_timeout。 データ型:整数。 デフォルト値は 3600 です。 単位は秒です。
使用方法:
wait_snapshot_ready_timeoutフィールドを7200秒に設定します。例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type":"alicloud-ecs", "access_key":"{{user `access_key`}}", "secret_key":"{{user `secret_key`}}", "region":"cn-hangzhou", "image_name":"packer_basic", "source_image":"aliyun_3_9_x64_20G_alibase_20231219.vhd", "associate_public_ip_address":true, "ssh_username":"root", "instance_type":"ecs.s6-c1m2.large", "internet_charge_type":"PayByTraffic", "io_optimized":true, "skip_image_validation":true, "wait_snapshot_ready_timeout": 7200 } ] }
インスタンスのプライベートIPアドレスを使用してECSインスタンスに接続するために使用されるパラメーター
シナリオ: ECSインスタンスのプライベートIPアドレスを使用してインスタンスに接続できます。パブリックIPアドレスは必要ありません。
Packerフィールド: ssh_private_ip。 データ型:Boolean
使用法:
ssh_private_ipフィールドをtrueに設定します。 その後、PackerはインスタンスのプライベートIPアドレスを使用してインスタンスに接続しますが、elastic IPアドレス (EIP) を関連付けたり、パブリックIPアドレスを割り当てたりしません。重要Packerが作成したECSインスタンスのプライベートIPアドレスを使用してインスタンスに接続する場合、Packerを実行しているECSインスタンスは、Packerが作成したECSインスタンスと同じvSwitchに接続されている必要があります。
例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type":"alicloud-ecs", "access_key":"{{user `access_key`}}", "secret_key":"{{user `secret_key`}}", "region":"cn-hangzhou", "image_name":"packer_basic", "source_image":"aliyun_3_9_x64_20G_alibase_20231219.vhd", "ssh_username":"root", "instance_type":"ecs.s6-c1m2.large", "internet_charge_type":"PayByTraffic", "io_optimized":true, "skip_image_validation":true, "ssh_private_ip": true, "vpc_id":"vpc-xxxx", "vswitch_id":"vsw-xxxx" } ] }
ECSインスタンスを停止するかどうかを指定するために使用されるパラメーター
シナリオ: デフォルトでは、Packerはプロビジョニングを実行した後、ECSインスタンスを停止し、インスタンスからイメージを作成します。 ただし、WindowsインスタンスがSysprepを実行している場合など、特定のシナリオでは、インスタンスは実行中状態である必要があります。
Sysprepの使用方法については、インスタンスが相互のADドメインにアクセスできない場合、またはインスタンスを同時に同じADドメインに追加できない場合はどうすればよいですか。
Packerフィールド: disable_stop_instance。 データ型:Boolean
使用法:
disable_stop_instanceフィールドをtrueに設定します。 その後、Packerはイメージの作成元であるECSインスタンスを停止しません。 インスタンスを停止するか、インスタンスを手動で停止するには、設定 (プロビジョニング) にコマンドを追加する必要があります。例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type":"alicloud-ecs", "access_key":"{{user `access_key`}}", "secret_key":"{{user `secret_key`}}", "region":"cn-hangzhou", "image_name":"packer_basic", "source_image":"aliyun_3_9_x64_20G_alibase_20231219.vhd", "ssh_username":"root", "instance_type":"ecs.s6-c1m2.large", "internet_charge_type":"PayByTraffic", "io_optimized":true, "skip_image_validation":true, "associate_public_ip_address":true, "disable_stop_instance": true } ] }
WinRMを有効にするインスタンスユーザーデータファイルのパスを指定するために使用するパラメーター
シナリオ: セキュリティ上の理由から、WindowsイメージではWindowsリモート管理 (WinRM) 機能がデフォルトで無効になっています。 ただし、PackerはWinRM機能を使用してWindowsインスタンスに接続し、インスタンスでコマンドを実行する必要があります。 Windowsインスタンスを作成するときに、インスタンスユーザーデータファイルを使用してWinRMを有効にできます。
Packerフィールド: user_data_file。
使用法:
"user_data_file":"examples.ps1"設定を使用して、インスタンスユーザーデータファイルのパスを指定します。例: インスタンスユーザーデータファイルは、examples/alicloud/basic/winrm_enable_userdata.ps1の相対パスに格納されます。
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [{ "type":"alicloud-ecs", "access_key":"{{user `access_key`}}", "secret_key":"{{user `secret_key`}}", "region":"cn-beijing", "image_name":"packer_test", "source_image":"win2008r2_64_ent_sp1_zh-cn_40G_alibase_20181220.vhd", "instance_type":"ecs.n1.tiny", "io_optimized":"true", "internet_charge_type":"PayByTraffic", "image_force_delete":"true", "communicator": "winrm", "winrm_port": 5985, "winrm_username": "Administrator", "winrm_password": "Test1234", "user_data_file": "examples/alicloud/basic/winrm_enable_userdata.ps1" }], "provisioners": [{ "type": "powershell", "inline": ["dir c:\\"] }] }説明上記のサンプルコードでは、
"communicator": "winrm"は、WinRMを使用してインスタンスに接続することを示します。「winrm_port」: 5985は、通信ポートがポート5985であることを示す。"winrm_username": "Administrator"は、インスタンスに管理者として接続していることを示します。"winrm_password": "Test1234"は、Password Test1234が使用されていることを示します。
"image_force_delete":"true"は、既存のイメージが作成されるイメージと同じ名前である場合に削除されることを示します。
オンプレミスISOファイルに基づいてイメージを作成し、イメージをAlibaba Cloud ECSにインポートするために使用されるパラメーター
シナリオ: オンプレミスISOファイルが非ECS仮想化環境で実行されている場合、Packerを使用してファイルに基づいてイメージを作成し、イメージをAlibaba Cloud ECSにインポートできます。
Packerフィールド: builder {"type":"qemu"} およびpost-processors{"type":"alicloud-import"} 。
例: オンプレミス環境がQEMUに基づいている場合、Packerを使用してイメージを作成し、そのイメージをAlibaba Cloud ECSにインポートできます。 詳細については、「Packerを使用したオンプレミスイメージの作成とインポート」をご参照ください。
オンプレミス仮想化環境またはQEMU builderなどのビルダーを使用して、オンプレミスイメージを作成します。
Alicloud Import Post-Processorを定義して、生成されたオンプレミスイメージをAlibaba Cloud ECSにインポートします。
ISOファイルをAlibaba Cloud ECSにインポートする前に、オンプレミスの仮想化環境をインストールし、そのファイルに基づいてイメージを作成する必要があります。 イメージは、Alibaba Cloudでサポートされている形式 (QCOW2、VHD、RAWなど) である必要があります。 その後、イメージをAlibaba Cloud ECSにインポートできます。 詳細については、「イメージのインポート」をご参照ください。
SSHキーペアとインスタンスのプライベートIPアドレスを使用してECSインスタンスに接続するために使用されるパラメーター
シナリオ: SSHキーペアとインスタンスのプライベートIPアドレスを使用して、ECSインスタンスに接続できます。
Packerフィールド: ssh_keypair_nameおよびssh_private_key_file。
説明ECSコンソールで名前がssh_keypair_nameフィールドの値に設定されているSSHキーペアを作成し、秘密鍵を安全に保存します。 詳細については、「SSH キーペアの作成」をご参照ください。
使用法:
ssh_private_key_fileフィールドを指定して、Packerが実行されているマシンに秘密鍵ファイルをダウンロードします。 値は秘密鍵ファイルの絶対パスである必要があります。例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type": "alicloud-ecs", "region": "cn-hangzhou", "image_name": "packer_basic", "source_image": "aliyun_3_x64_20G_alibase_20240819.vhd", "ssh_private_ip": true, "ssh_username": "root", "instance_type": "ecs.g6.large", "internet_charge_type": "PayByTraffic", "io_optimized": true, "skip_image_validation": true, "ssh_keypair_name": "{{user `ssh_keypair_name`}}", "ssh_private_key_file": "{{user `ssh_private_key_file`}}", "vpc_id": "{{user `vpc_id`}}", "vswitch_id": "{{user `vswitch_id`}}", "security_group_id": "{{user `security_group_id`}}" } ], "provisioners": [ { "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] } ] }
ECSインスタンスのシステムディスクとデータディスクの設定に使用されるパラメーター
シナリオ: システムディスクのカテゴリとサイズを指定し、特定のスナップショットデータをデータディスクとして、カスタムイメージの作成に使用する一時ECSインスタンスにアタッチします。
Packerフィールド: システムディスク構成の場合はsystem_disk_mapping、データディスク構成の場合はimage_disk_mappings。
使用法:
system_disk_mappingおよびimage_disk_mappingsフィールドを指定して、カスタムイメージを作成します。 カスタムイメージには、システムディスクのカテゴリ、各ディスクのサイズ、ディスクが関連付けられたインスタンスとともにリリースされるかどうか、各データディスクのカテゴリ、各データディスクパーティションの名前などのディスク情報が含まれます。例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type": "alicloud-ecs", "region": "cn-hangzhou", "image_name": "packer_basic", "source_image": "aliyun_3_x64_20G_alibase_20240819.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, "system_disk_mapping":{ "disk_category":"cloud_essd", "disk_size":20, "disk_delete_with_instance":true }, "image_disk_mappings":[{ "disk_snapshot_id":"s-xxxxxxxxxxxxxxx", "disk_device":"dev/xvdb", "disk_category":"cloud_essd" }] } ], "provisioners": [ { "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] } ] }
カスタムイメージを作成するためのベースイメージのイメージファミリと、作成したカスタムイメージのイメージファミリを指定するために使用されるパラメータ
シナリオ: イメージファミリーのイメージが更新されたときに、
source_imageパラメーターの値を変更することなく、イメージファミリーから最新の使用可能なイメージを取得します。Packerフィールド: image_familyとtarget_image_family。
使用法:
image_familyフィールドを指定して、指定したイメージファミリーから最新の使用可能なイメージを取得して一時ECSインスタンスを作成し、target_image_familyフィールドを指定して、イメージファミリーを一時ECSインスタンスから作成されたカスタムイメージに関連付けます。例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type": "alicloud-ecs", "region": "cn-hangzhou", "image_name": "packer_basic", "associate_public_ip_address":true, "ssh_username": "root", "instance_type": "ecs.g6.large", "internet_charge_type": "PayByTraffic", "io_optimized": true, "skip_image_validation": true, "image_family":"acs:centos_7_9_x64", "target_image_family":"test_packer_basic" } ], "provisioners": [ { "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] } ] }
Packer設定ファイルの指定に使用するパラメーター
シナリオ: 複数の環境設定が必要であり、設定は互いに干渉しません。 例えば、構成は、複数の地域における複数のアカウントを含む。
Packerフィールド: プロフィール。
使用法: プロファイルフィールドを使用して、Packer構成ファイルを指定します。 このフィールドを指定すると、Packerは指定された構成ファイルから優先的に構成を取得します。 たとえば、指定された構成ファイルとPackerテンプレートの両方でパラメーターが指定されている場合、構成ファイルの値が優先されます。 設定ファイルのパスは
~/.aliyun/config.jsonである必要があります。例:
{ "builders": [ { "type": "alicloud-ecs", "profile": "packer_sk", "region": "cn-hangzhou", "image_name": "packer_basic", "source_image": "aliyun_3_x64_20G_alibase_20240819.vhd", "ssh_username": "root", "instance_type": "ecs.g6.large", "internet_charge_type": "PayByTraffic", "io_optimized": true, "skip_image_validation": true, "associate_public_ip_address":true } ], "provisioners": [ { "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] } ] }上記のサンプルコードでは、
"profile": "packer_sk"のpacker_skが設定ファイルの名前です。 設定ファイルのパスは~/.aliyun/config.jsonである必要があります。 設定ファイルには次の情報が含まれています。{ "current": "ALI", "profiles": [ { "name": "packer_sk", "mode": "AK", "access_key_id": "xxxxxxxxxxxxxxxxxxxxxxx", "access_key_secret": "xxxxxxxxxxxxxxxxxxxx", "sts_token":"", "sts_region": "", "ram_role_name": "", "ram_role_arn": "", "ram_session_name": "", "source_profile": "", "private_key": "", "key_pair_name": "", "expired_seconds": 0, "verified": "", "output_format": "json", "language": "en", "site": "", "retry_timeout": 0, "connect_timeout": 0, "retry_count": 0, "process_command": "", "credentials_uri": "" } ], "meta_path": "" }
アカウントのAccessKeyペアを提供することなく、インスタンスRAMロールを使用してPackerを実行するために使用されるパラメーター
シナリオ: アカウントのAccessKeyペアをテンプレートまたは環境変数に設定しない場合は、Packerが実行されているECSインスタンスにインスタンスRAMロールをアタッチして、インスタンスRAMロールに基づいて一時的なAccessKeyペアを取得できます。 インスタンスRAMロールをECSインスタンスにアタッチする方法については、「インスタンスRAMロール」をご参照ください。
説明このシナリオでは、オンプレミスサーバーではなくECSインスタンスでイメージ作成操作を実行する必要があります。
次のポリシーをインスタンスRAMロールにアタッチする必要があります。 インスタンスRAMロールに権限を付与する方法については、「RAMロール」をご参照ください。
Packerフィールド: ram_role_name。
使用法: ECSインスタンスにアタッチされたインスタンスRAMロールに基づいて一時的なAccessKeyペアを取得し、アカウントのAccessKeyペアを提供せずにPackerを実行します。
例:
{ "builders": [ { "type": "alicloud-ecs", "region": "cn-hangzhou", "image_name": "packer_basic", "source_image": "aliyun_3_x64_20G_alibase_20240819.vhd", "associate_public_ip_address": true, "ssh_username": "root", "instance_type": "ecs.g6.large", "internet_charge_type": "PayByTraffic", "io_optimized": true, "ram_role_name": "ImageTestAle", "skip_image_validation": true } ], "provisioners": [ { "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] } ] }
インスタンスRAMロールを一時ECSインスタンスにアタッチするために使用されるパラメーター
シナリオ: インスタンスRAMロールを一時的なECSインスタンスにアタッチし、一時的なAccessKeyペアを取得して、シェルスクリプトを使用してビジネス操作を実行します。 インスタンスRAMロールをECSインスタンスにアタッチする方法については、「インスタンスRAMロール」をご参照ください。
説明RAMユーザーを使用する場合は、ramユーザーに
RAM: PassRole権限を付与する必要があります。 詳細については、3をご参照ください。 「RAMユーザー」トピックのRAMユーザーセクションに権限を付与します。 次のサンプルコードは、ポリシーの内容を示します。Packerフィールド: ecs_ram_role_name
使用法: 一時的なAccessKeyペアを取得して、業務を実行します。
例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type": "alicloud-ecs", "region": "cn-hangzhou", "image_name": "packer_basic", "source_image": "aliyun_3_x64_20G_alibase_20240819.vhd", "ssh_username": "root", "instance_type": "ecs.g6.large", "internet_charge_type": "PayByTraffic", "io_optimized": true, "ecs_ram_role_name": "packer-test", "skip_image_validation": true, "associate_public_ip_address": true } ], "provisioners": [ { "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] } ] }
イメージを作成するためにアカウントAのIDを引き受けるためにアカウントBが使用するパラメータ
シナリオ: クロスアカウントアクセスと一時的な権限付与。
説明シナリオの前提条件:
アカウントAは、アカウントBのAlibaba Cloudアカウント信頼エンティティタイプのRAMロールを作成し、必要なリソース操作権限をRAMロールに付与します。 手順の詳細については、「RAMロール」トピックの「手順1: アカウントAがRAMロールを作成して権限を付与する」セクションをご参照ください。 次のサンプルコードは、ポリシーの内容を示します。
アカウントBがRAMユーザーの場合、RAMユーザーに
sts:AssumeRole権限を付与する必要があります。 次のサンプルコードは、ポリシーの内容を示します。ssh_private_ip: trueパラメーターを指定しないでください。 インスタンスのパブリックIPアドレスを使用してECSインスタンスに接続するには、associate_public_ip_address:trueパラメーターを指定する必要があります。このシナリオでは、オンプレミスマシンまたはECSインスタンスでPackerを実行できます。 ECSインスタンスでPackerを実行する場合、インスタンスに0 Mbit/sを超えるパブリック帯域幅を割り当てる必要があります。 それ以外の場合、インスタンスはRAMサービスにアクセスして一時的なAccessKeyペアを取得できません。
Packerフィールド: ram_role_arnとram_session_name。 ram_role_arnフィールドには、RAMロールのAlibaba Cloudリソース名 (ARN) を指定します。 ram_session_nameフィールドは、RAMロールの名前を指定します。
使用法: アカウントBを使用してアカウントAのIDを引き受け、カスタムイメージを作成します。
例:
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type": "alicloud-ecs", "region": "cn-hangzhou", "image_name": "packer_basic", "source_image": "aliyun_3_x64_20G_alibase_20240819.vhd", "associate_public_ip_address":true, "ssh_username": "root", "ram_role_arn": "acs:ram::186xxxxxxxxxx07:role/packer-test", "ram_session_name": "packer-test", "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" ] } ] }
関連ドキュメント
その他のパラメーターと例については、「Alicloud ECS」および「例」をご参照ください。