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" ] }] }