全国のPacker愛好家の皆様こんにちは。
技術四課 岩本です。
早速ではござますが、Packerを使って、AMIの構築自動化をやってみました&作ってみました。
Packerとは?
Packerとは、HashiCorp社が提供するマシンイメージの自動生成・管理を行うコマンドライン・ツールです。
Template
と呼ばれるテンプレートファイルから、マシンイメージの作成が行えます。
AWS以外にも、HyperV、GCP、DigitalOceanやVMwareなどにも対応しています。
詳しくは、こちらをご覧ください。
出来上がったものがこちら。
これは何?
- Packerを使ったEC2(RHRL7)の構築テンプレートです。
何ができるの?
- Cloudinitの設定ファイルを置き換えます。
- ロケールの変更
- タイムゾーンの変更
- 詳細は
cloud-init_cfg/jp.cfg
を参照
- 指定した設定ファイルを含めた、AMIのカスタムイメージが作成されます。
- 実行AWSアカウント内にAMIが作成され、作成された指定した別AWSアカウントに(プライベートイメージとして)共有されます
- EBSは、20GBのルートデバイスと、20GBの追加デバイスが作成されます。
"launch_block_device_mappings": [
{
"volume_type": "gp2",
"device_name": "/dev/sda1",
"volume_size": 20,
"delete_on_termination": "true"
}
],
"ami_block_device_mappings": [
{
"volume_type": "gp2",
"device_name": "/dev/sdb",
"volume_size": 20,
"delete_on_termination": "true"
}
]
Packerの仕組み(概要)
Template
と呼ばれるテンプレートファイルをJSON形式で定義します。
AWSの場合、Template
を元に、EC2インスタンスが立ち上がり、定義されたコマンド・操作が実行されます。
EC2インスタンスを元にAMIが作成され、起動されたEC2は削除されます。
EC2起動時に利用されるキーペアも自動的に作成され、AMI削除後には自動的に削除されます。
Packerを利用する事で、上記の一連の流れを自動化できます。
使い方
事前準備
- Packerのインストール
- こちらを参照
- Homebrewの場合
$ brew install packer
パラメータの指定
- 利用環境に合わせて
setup.json
のvariables
セクションの各値を書き換えます。
"variables": {
"name": "rhel_no_ami_dayo",
"region": "ap-northeast-1",
"ami-id": "ami-XXXXX",
"sg-id": "sg-XXXXX",
"vpc-id":"vpc-XXXXX",
"subnet-id":"subnet-XXXXX",
"cloud-init_cfg": "jp.cfg",
"shared-aws-account": "XXXXXXXXXXX"
}
- name
- 作成されるAMI名です。
- region
- 作成するAWSリージョン
- ami-id
- 元となるAMI-ID
- sg-id
- AMIの元となるEC2が起動時に利用するセキュリティグループ
- vac-id
- AMIの元となるEC2が起動時に配置されるVPC
- subnet-id
- AMIの元となるEC2が起動時に配置されるサブネット
- cloud-init_cfg
cloud-init_cfg/
以下にあるCloudinit用ファイル
- shared-aws-account
- AMI作成後に共有するAWSアカウント
実行
- バリデーションチェック
$ packer validate setup.json
Template validated successfully.
- 実行
- AWS CLIにて、アクセスキー/シークレットキーが設定されている事を想定
$ AWS_PROFILE=XXXXXX packer build setup.json
amazon-ebs output will be in this color.
==> amazon-ebs: Prevalidating AMI Name: rhel_no_ami_dayo-20180603-0953
amazon-ebs: Found Image ID: ami-XXXXXXXXXX
==> amazon-ebs: Creating temporary keypair: packer_5b13ba82-be94-4a97-f629-934d758eae62
==> amazon-ebs: Launching a source AWS instance...
==> amazon-ebs: Adding tags to source instance
amazon-ebs: Adding tag: "Name": "Packer Builder"
amazon-ebs: Instance ID: i-XXXXXXXXXX
==> amazon-ebs: Waiting for instance (i-XXXXXXXXXX) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Uploading ./cloud-init_cfg/jp.cfg => /tmp/00_local.cfg
==> amazon-ebs: Provisioning with shell script: /var/folders/z9/bdh0bp_j2fbgvq9d8lplld5m0000gn/T/packer-shell985180930
==> amazon-ebs: Stopping the source instance...
amazon-ebs: Stopping instance, attempt 1
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: rhel_no_ami_dayo-20180603-0953
amazon-ebs: AMI: ami-df498da0
==> amazon-ebs: Waiting for AMI to become ready...
==> amazon-ebs: Modifying attributes on AMI (ami-XXXXXXXXXX)...
amazon-ebs: Modifying: users
==> amazon-ebs: Modifying attributes on snapshot (snap-XXXXXXXXXX)...
==> amazon-ebs: Adding tags to AMI (ami-XXXXXXXXXX)...
==> amazon-ebs: Tagging snapshot: snap-XXXXXXXXXX
==> amazon-ebs: Creating AMI tags
amazon-ebs: Adding tag: "Name": "rhel_no_ami_dayo"
==> amazon-ebs: Creating snapshot tags
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: Cleaning up any extra volumes...
==> amazon-ebs: No volumes to clean up, skipping
==> amazon-ebs: Deleting temporary keypair...
Build 'amazon-ebs' finished.
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
ap-northeast-1: ami-XXXXX
- 上記の様にコマンドを実行すると、順にタスクが実行され出来上がったAMIのIDが表示されます。
まとめ
EC2内(OS以上)の構成を行う場合、Ansible、Chefなど様々なプロビジョニングツールがあります。
弊社の様に様々なお客様環境を作成する場合、お客様要件によっては完全クローズドのAWS環境など、OSへの外部からの接続が行えない場合や、
インターネットへの接続は別途Proxyの設定が必要となる場合があります。
Packerの機能を用いれば、別AWSアカウント上でAMIを作成し、Packer内で別AWSアカウントへの共有まで行えます。
事前に必要なパッケージやアップデートを適用したEC2を、クローズドな環境でも構築できます。