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

okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

Packerを使ってCentOS公式AMIから独自のAMIを作成する

Packer AWS CentOS

こんにちは、@oko_changです。
以前の記事でPackerを使ってAmazon LinuxをカスタマイズしたAMIを作成しました。
同じような感覚でMarket Placeで配布されているCentOS公式のAMIを使ってみたら少しハマってしまったので、今回はその事についてメモを残しておきたいと思います。

環境

ハマったこと

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

感想

CentOSに限らずPackerでAMI作成した場合も、きちんと不要な公開鍵は削除したほうが良いですね。
ちなみにこちらのIssueで同じやりとりがされています。