LoginSignup
10
9

More than 5 years have passed since last update.

Packer + chef-soloでカスタムAMI(AmazonMachineImage)を作る

Posted at

はじめに

Packerとは?

  • VagrantやConsulで有名なHashiCorpから提供されている仮想イメージを作るためのツール。
  • オフィシャルサイト:https://www.packer.io/

前提条件

ゴール

  • 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系で実行するとエラーとなる

Packer実行時にエラーとなることがある

  • 私の環境で起きている同様のエラーがbugとしてissueに挙がっています。ただ、必ず起きるわけではないので、失敗したら何度か実行してみるとそのうち成功すると思います。

さいごに

Rubyビルド済みのカスタムAMIをベースAMIとすることで、プロビジョニングの実行時間が10分程短縮できた

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9