読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

PackerでAMIを作るチュートリアルをしてみた

や、なんか、脊髄反射で! 某所で話題に上がったけど、やったことなかったのでやってみた。

いじっただけなので、ほぼチュートリアルメモみたいなもんです。

今回やってみること

自作のAMIをPackerで作ってみる。 手元ですぐできそうで、自分の理解に落とし込めそうな構成がこれだったので。

事前準備

必要な物を用意する

  • AWSAccess 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がどういうもんかは少しわかったかなー。