PackerでAMIを作るチュートリアルをしてみた
や、なんか、脊髄反射で! 某所で話題に上がったけど、やったことなかったのでやってみた。
いじっただけなので、ほぼチュートリアルメモみたいなもんです。
今回やってみること
自作のAMIをPackerで作ってみる。 手元ですぐできそうで、自分の理解に落とし込めそうな構成がこれだったので。
事前準備
必要な物を用意する
- AWSのAccess Key / Secret Key
- ベースにするAMI ID
- debianを使うので、公式が用意してるAMIから、Jessieのものを選択。
ap-northeast-1 / ami-13eac312 / ssh-username: admin
- ebsは好みじゃないけど、まだebsのみっぽい。さすがにpre-release
- ところで、JessieのimageがHVM / SR-IOV 有効でだいぶアグレッシブでいい感じ
Packerのinstall
Homebrewをつかってるので、こんな感じ
brew tap homebrew/binary
brew install packer
templateを作る
とりあえず、作業場所確保
mkdir -p ~/works/packer
cd ~/works/packer
テンプレートjessie.json
を作る
{
"variables": {
"aws_access_key": "<access_key>",
"aws_secret_key": "<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-13eac312",
"instance_type": "m3.medium",
"ssh_username": "admin",
"ami_name": "packer-jessie-example {{timestamp}}",
"ami_virtualization_type": "hvm"
}]
}
公式jessieがhvm限定担っていたので、対応するようにexmapleから修正。このあたりを参考に。
自分のAMIアカウントにVPC設定がなかったせいで、t2シリーズが使えなくてm3.medium
を選択せざるを得なかったのは痛恨。。。
出来上がったら一応、
packer validate jessie.json
Template validated successfully.
でチェック、OK。
余談だけど、テンプレートの書式、いかにもHashiCorpらしいというか、terraformやSerf / Consulいじった時と同じ雰囲気のjsonだったので違和感なくいいすね。 とはいえ、やっぱり変数の扱いとか、terraformとかのほうが洗練されてきてるなって感じ。そのうちこのへんもHCLになるのかな。
imageを作ってみる
ここまで来たら実行
% packer build jessie.json
amazon-ebs output will be in this color.
==> amazon-ebs: Inspecting the source AMI...
==> amazon-ebs: Creating temporary keypair: packer xxxxxxxxxxxxxxxxx
==> amazon-ebs: Creating temporary security group for this instance...
==> amazon-ebs: Authorizing SSH access on the temporary security group...
==> amazon-ebs: Launching a source AWS instance...
amazon-ebs: Instance ID: i-xxxxxxx
==> amazon-ebs: Waiting for instance (i-xxxxxxx) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Stopping the source instance...
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: packer-jessie-example 1413732326
amazon-ebs: AMI: ami-xxxxxxxx
==> amazon-ebs: Waiting for AMI to become ready...
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: Deleting temporary security group...
==> 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-xxxxxxxx
できたー!
なぜかtag:Name
ではなくtag:AMI Name
が新設されてそこに名前ついててワロタが、まぁよし。
あと、Packer Builder
っていうEC2 instanceの残骸がterminateされてるのがコンソールから分かった。
Security Groupも、こいつ勝手にPacker用を開けてた。終わったあと全部消すから、痕跡残らないけど。CloudTrailのこと考えると、本番で使うときは気をつけるべきかもね。
provisionしてみる
サンプルよろしく、redisを入れてみる
..."builder"のつづき
}],
"provisioners": [{
"type": "shell",
"inline": [
"sudo apt-get update",
"sudo apt-get install -y redis-server"
]
}]
}
これでbuild
% packer build jessie.json
amazon-ebs output will be in this color.
==> amazon-ebs: Inspecting the source AMI...
==> amazon-ebs: Creating temporary keypair: packer xxxxxxxxxxxxxxxxx
==> amazon-ebs: Creating temporary security group for this instance...
==> amazon-ebs: Authorizing SSH access on the temporary security group...
==> amazon-ebs: Launching a source AWS instance...
amazon-ebs: Instance ID: i-xxxxxxx
==> amazon-ebs: Waiting for instance (i-xxxxxxx) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Provisioning with shell script: /var/folders/r8/gnn5k3_j4qq1rjmd3k3x1b4r0000gn/T/packer-shell875904791
amazon-ebs: Get:1 http://cloudfront.debian.net jessie InRelease [191 kB]
<...snip...>
amazon-ebs: Reading package lists... Done
amazon-ebs: Building dependency tree
amazon-ebs: Reading state information... Done
amazon-ebs: The following extra packages will be installed:
amazon-ebs: libjemalloc1 redis-tools
amazon-ebs: The following NEW packages will be installed:
amazon-ebs: libjemalloc1 redis-server
amazon-ebs: redis-tools
amazon-ebs: 0 upgraded, 3 newly installed, 0 to remove and 88 not upgraded.
amazon-ebs: Need to get 566 kB of archives.
<...snip...>
amazon-ebs: Setting up libjemalloc1 (3.6.0-3) ...
amazon-ebs: Setting up redis-tools (2:2.8.14-1) ...
amazon-ebs: Setting up redis-server (2:2.8.14-1) ...
amazon-ebs: adduser: Warning: The home directory `/var/lib/redis' does not belong to the user you are currently creating.
amazon-ebs: Processing triggers for libc-bin (2.19-11) ...
amazon-ebs:
amazon-ebs:
amazon-ebs:
amazon-ebs:
==> amazon-ebs: Stopping the source instance...
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: packer-jessie-example 1413733708
amazon-ebs: AMI: ami-xxxxxxxx
==> amazon-ebs: Waiting for AMI to become ready...
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: Deleting temporary security group...
==> 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-xxxxxxxx
やったー、でーきたー!\\٩( 'ω' )و /// さっき作ったAMIに加えて、新しいAMIもできてた。
という感じ。
まとめ
packer、すげー簡単にAMI作れるなー。まぁ公式AMIがあるお陰ではあるけど。。。 キモになりそうなのは、provisionerですかね。
細かい連携方法は模索の必要ありだけど、ひとまずpackerがどういうもんかは少しわかったかなー。