はじめに
Packerとは?
- VagrantやConsulで有名なHashiCorpから提供されている仮想イメージを作るためのツール。
- オフィシャルサイト:https://www.packer.io/
前提条件
- AWSアカウント作成済
- Chef導入済
- chef-rbenvインストール済
ゴール
- Rubyビルド済みのAMI作成
カスタムAMIを作ることの狙い
- EC2インスタンス作成時におけるプロビジョニングの実行時間の短縮
実施
ベースとするAMIを決める
- マネージドコンソールを開きEC2 -> AMIs -> Public imagesから探す
- 今回は
amzn-ami-hvm-2014.09.1.x86_64-ebs (AMI ID:ami-4985b048)
を選択
Packerをインストールする(For Mac)
$ brew tap homebrew/binary
$ brew install packer
参考: https://www.packer.io/docs/installation.html
設定ファイルを用意する
template.json
{
"variables": {
"chef_version": "11.16.4",
"ruby_version": "2.1.5",
"source_ami_id": "ami-4985b048",
"access_key": "ACCESS_KEY",
"secret_key": "SECRET_KEY"
},
"builders": [
{
"type": "amazon-ebs",
"access_key": "{{user `access_key`}}",
"secret_key": "{{user `secret_key`}}",
"region": "ap-northeast-1",
"source_ami": "{{user `source_ami_id`}}",
"instance_type": "t2.micro",
"ssh_username": "ec2-user",
"ami_name": "amzn-ami-hvm-ruby-{{user `ruby_version`}}-{{timestamp}}",
"ami_description": "This AMI, ruby version {{user `ruby_version`}} are build to AmazonLinux. Base AMI is {{user `source_ami_id`}}"
}
],
"provisioners": [
{
"type": "chef-solo",
"install_command": "curl -L https://www.opscode.com/chef/install.sh | {{if .Sudo}}sudo{{end}} bash -s -- -v {{user `chef_version`}}",
"cookbook_paths": ["/path/to/chef-repo/cookbooks/"],
"run_list": ["ruby_build", "rbenv::system"],
"json": {
"rbenv" : {
"global": "{{user `ruby_version`}}",
"rubies": [
"{{user `ruby_version`}}"
]
}
},
"prevent_sudo": false
},
{
"type": "shell",
"inline": [
"sudo chmod -R 775 /usr/local/rbenv/"
]
}
]
}
設定ファイルに構文ミスがないかチェックする
$ packer validate --only=amazon-ebs template.json
実行する
$ packer build --only=amazon-ebs template.json
また、 variables で定義している変数は、実行時に引数として渡すことが可能です。例えばRubyのバージョンとChefのバージョンを変えたい時は以下のように実行するとよいです
$ packer build --only=amazon-ebs \
-var 'chef_version=12.0.3' \
-var 'ruby_version=2.2.0' \
template.json
これで、AMIが出力されたはずですので、マネージドコンソールから確認してみましょう。
ちなみに、私の環境では743.13 real 6.04 user 1.08 sys ≒ 13min
でビルドが完了しました
注意点
chef-rbenvがChef12系で実行するとエラーとなる
- issueは挙がっていてPRも出ているのでPRが取り込まれるまでは、 11.16.4 を使っておくのが吉かと思います。
Packer実行時にエラーとなることがある
- 私の環境で起きている同様のエラーがbugとしてissueに挙がっています。ただ、必ず起きるわけではないので、失敗したら何度か実行してみるとそのうち成功すると思います。
さいごに
Rubyビルド済みのカスタムAMIをベースAMIとすることで、プロビジョニングの実行時間が10分程短縮できた