概要
Packerを使用すると、Amazon EC2やVagrant、Docker等で使用できるイメージをJSONで記述可能なコンフィグレーションから作成することができて便利です。
今回は、Packerを用いて、CentOSが提供している公式AMIからカスタマイズしたAMIを手軽に作成する方法を紹介します。
Packerの導入
まず、Packerを導入します。Homebrewであれば、下記で導入可能です。その他の場合はこちらで説明されています。
$ brew tap homebrew/binary
$ brew install packer
コンフィグレーションの作成
下記は、東京リージョン(ap-northeast-1
)にて、CentOS公式AMI(ami-31e86030
)を用いて、カスタマイズした独自AMIを作成する設定です。
PackerのShell Provisionerを用いて、下記を行っています。
- YUMパッケージの更新
- EPELの導入
- タイムゾーンをJSTに変更
{
"builders": [
{
"type": "amazon-ebs",
"access_key": "XXXXXXXXXXXXXXXXXXXX",
"secret_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"region": "ap-northeast-1",
"source_ami": "ami-31e86030",
"instance_type": "t1.micro",
"ssh_username": "root",
"ssh_timeout": "5m",
"ami_name": "CentOS6_x64_ebs_{{isotime | clean_ami_name}}"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"yum -y update",
"rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm",
"ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime",
"rm -f /root/.ssh/authorized_keys"
]
}
]
}
また、CentOSのAMIイメージでは、記事執筆現在では、EC2でインスタンス作成時に指定するKey pairを、起動の際にrootユーザのauthorized_keys
にコピーすることで、指定したKey pairを使ってrootユーザでログインすることを可能にしています。
この処理は、既にauthorized_keys
ファイルがあると行われないため、rm -f /root/.ssh/authorized_keys
として、削除しておく必要があります。
AMIの名称の設定
ami_name
には、テンプレート文字列を指定することができます。{{timestamp}}
と記述するとUNIX timestamp、{{isotime | clean_ami_name}}
のように記述すると、RFC-3339フォーマットの日付(例: 2014-03-08T16-29-43Z)の文字列を挿入することが可能です。また、isotime
の場合、AMIの名称には指定できない文字列が含まれているため、clean_ami_name
を指定する必要があります。
上記では、CentOS6_x64_ebs_{{isotime | clean_ami_name}}
と指定しています。
AMIの作成
それでは、PackerでAMIを作成してみます。下記コマンドでAMIが自動的に生成されます。
% packer build aws-centos6-tokyo.json
amazon-ebs output will be in this color.
==> amazon-ebs: Creating temporary keypair: packer…
==> 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-XXXXXXXX
==> amazon-ebs: Waiting for instance (i-XXXXXXXX) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Provisioning with shell script: …
…
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
ap-northeast-1: ami-XXXXXXXX