PackerでAMIを作る

(2016-10-18)

https://www.packer.io/

いろんなプラットフォームのイメージを作ることができるツール。 これでfluentdのログサーバーのAMIを作る。

$ brew install packer # mac
$ packer -v
0.10.1

設定ファイルはこんな感じ。variablesの値は{{user ... }}のところで使われる。 buildersに作るイメージの情報を書いて、provisionersで環境を作る。

provisionersにはchefやansibleなども指定できるが、 継ぎ足し継ぎ足しで秘伝のタレ化したAMIも最初は、

「コマンドいくつか実行するだけなのでとりあえず手作業で作った、後でなんとかする」

なんてものもあったりして、 そういうものは無理にchefなどで始めず、手軽にshellでpacker buildするといいと思う。 手作業よりも楽だし、ソースが別にあるので使われていないAMIを消すのも簡単だ。

fileではpermissionがないところに置くことができないので、一旦置いてshellで移動する。

{
  "variables": {
    "aws_access_key": "",
    "aws_secret_key": ""
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "ap-northeast-1",
    "source_ami": "ami-1a15c77b",
    "instance_type": "t2.small",
    "ssh_username": "ec2-user",
    "ami_name": "fluentd-logserver {{timestamp}}"
  }],
  "provisioners": [{
    "type": "file",
    "source": "td-agent.conf",
    "destination": "/home/ec2-user/td-agent.conf"
  },
  {
    "type": "shell",
    "inline": [
      "curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh",
      "sudo mv /home/ec2-user/td-agent.conf /etc/td-agent/td-agent.conf",
      "sudo /etc/init.d/td-agent restart"
    ]
  }]
}
$ packer validate fluentd-logserver.json
Template validated successfully.

buildのとき-varでvariablesを渡すことができる。

$ packer build \
    -var 'aws_access_key=YOUR ACCESS KEY' \
    -var 'aws_secret_key=YOUR SECRET KEY' \
    fluentd-logserver.json

これを実行すると実際にインスタンスを立ち上げ、AMIを作成し始める。