Packerを使ってCentOS公式AMIから独自のAMIを作成する
こんにちは、@oko_changです。
以前の記事でPackerを使ってAmazon LinuxをカスタマイズしたAMIを作成しました。
同じような感覚でMarket Placeで配布されているCentOS公式のAMIを使ってみたら少しハマってしまったので、今回はその事についてメモを残しておきたいと思います。
環境
- Mac OSX
- Packer 0.3.9
- CentOS 6 (x86_64) - with Updates
ハマったこと
CentOS公式のAMIを使う上で必要な点を修正しつつ、同じようなjsonファイルを作成してPackerからAMIを作成します。
その後AMIからインスタンスを起動したところ、起動時に指定したキーとペアになる秘密鍵でSSH接続が出来ませんでした。
原因
PackerでAMIを作成した場合、作成する時に使用したテンポラリのSSH公開鍵はそのまま/root/.ssh/authorized_keysに保存されます。
さらにCentOS公式のAMIではrc.localに以下のようなスクリプトが記載されています。
# set a random pass on first boot if [ -f /root/firstrun ]; then dd if=/dev/urandom count=50|md5sum|passwd --stdin root passwd -l root rm /root/firstrun fi if [ ! -d /root/.ssh ]; then mkdir -m 0700 -p /root/.ssh restorecon /root/.ssh fi # Get the root ssh key setup ReTry=0 while [ ! -f /root/.ssh/authorized_keys ] && [ $ReTry -lt 5 ]; do sleep 2 curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /root/.ssh/authorized_keys ReTry=$[Retry+1] done chmod 600 /root/.ssh/authorized_keys && restorecon /root/.ssh/authorized_keys
スクリプトでは/root/.sshディレクトリがなかったら作成し、さらに/root/.ssh/authorized_keysファイルのチェックに失敗したら公開鍵を設置します。
しかし最初にPackerでAMIを作成したときにauthorized_keysは生成されているので、公開鍵が登録されなかったというわけです。
というわけで上記スクリプトを修正するか、AMI作成時に以下のようにauthorized_keysを削除すればOKです。
※イシカワさんごめんなさい
{
"builders": [{
"type": "amazon-ebs",
"access_key": "set your access key",
"secret_key": "set your secret key",
"region": "ap-northeast-1",
"source_ami": "ami-31e86030",
"instance_type": "m1.small",
"ssh_username": "root",
"ssh_timeout": "10m",
"ami_name": "okochang-centos6-x86_64-template",
"launch_block_device_mappings": [
{
"device_name": "/dev/sda",
"volume_size": 20,
"delete_on_termination": true
}
],
"ami_block_device_mappings": [
{
"device_name": "/dev/sdb",
"virtual_name": "ephemeral0"
}
],
"tags": {
"OS_Version": "CentOS6",
"Release": "Latest"
}
}],
"provisioners": [{
"type": "shell",
"inline": [
"sudo yum -y update",
"sudo resize2fs /dev/xvde",
"sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime",
"sudo dd if=/dev/zero of=/var/swap.img bs=1M count=1024",
"sudo mkswap /var/swap.img",
"sudo swapon /var/swap.img",
"sudo echo \"/dev/xvdf swap swap defaults 0 0\" >> /etc/fstab",
"sudo sed -i -e \"s/^SELINUX=enforcing/SELINUX=disabled/g\" /etc/selinux/config",
"sudo sed -i -e \"s/^PasswordAuthentication yes/PasswordAuthentication no/g\" /etc/ssh/sshd_config",
"sudo rm -f /root/.ssh/authorized_keys"
]
}]
}