Amazon Linux 2 LTSの綺麗なVagrant boxを作ってみた

## はじめに

Amazon Linux 2 LTSのVagrant box作る方法、2018/1/16時点の各種情報ではそのままではいくつかハマってうまくいかなかった。
でもちゃんと公式読んだら出来た。公式読まなかった俺が悪い。

備忘録としてAmazon Linux 2 LTSの綺麗なVagrant boxを作成する方法を残しておく。
環境はmacOS Sierraでやってる。

大まかな手順
1. Amazon Linux 2のダウンロード
2. cloud init用データの作成
3. VMの作成とAmazon Linux 2の起動
4. Guest Additionsのインストール
5. クリーンアップとboxの作成

Amazon Linux 2の公式は次のURL

https://aws.amazon.com/jp/amazon-linux-2/

2018年1月16日時点のVirtualBoxイメージは次のものが最新

https://cdn.amazonlinux.com/os-images/2017.12.0.20171212.2/virtualbox/amzn2-virtualbox-2017.12.0.20171212.2-x86_64.xfs.gpt.vdi

さぁ、はじめよう。

## 準備

VirtualBoxイメージのダウンロード

```
curl -LO https://cdn.amazonlinux.com/os-images/2017.12.0.20171212.2/virtualbox/amzn2-virtualbox-2017.12.0.20171212.2-x86_64.xfs.gpt.vdi
```

## cloud init用データの作成

ここが一つ目のハマリポイントだった。ボリュームラベルを```cidata```にしないとAmazon Linux 2 LTSイメージの初回起動時に認識できなかった。

```
mkdir seed
echo "local-hostname: localhost.localdomain" > seed/meta-data

cat << __EOF__ > seed/user-data
#cloud-config
# vim:syntax=yaml
users:
# A user by the name ec2-user is created in the image by default.
  - default
  - name: vagrant
    groups: wheel
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    plain_text_passwd: vagrant
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key
    lock_passwd: false

chpasswd:
  list:
    root:vagrant
  expire: False
__EOF__

# ISOイメージの作成
hdiutil makehybrid -iso -joliet -o seed.iso seed -joliet-volume-name cidata
```

## VMの起動

コマンドラインで実行する。

```
# VMの作成とAmazon Linux 2の起動
VM=vagrant-amznlinux2
VDI=amzn2-virtualbox-2017.12.0.20171212.2-x86_64.xfs.gpt.vdi
VGA=/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso
VBoxManage createvm --name "$VM" --ostype "RedHat_64" --register
VBoxManage storagectl "$VM" --name "SATA Controller" --add "sata" --controller "IntelAHCI"
VBoxManage storagectl "$VM" --name "IDE Controller" --add "ide"
VBoxManage storageattach "$VM" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium $VDI
VBoxManage storageattach "$VM" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium seed.iso
VBoxManage modifyvm "$VM" --natpf1 "ssh,tcp,127.0.0.1,2222,,22" --memory 1024 --vram 8 --audio none --usb off
VBoxManage startvm "$VM" --type headless
```

## VMにログイン

```
# Vagrant insecure private keyのダウンロード
curl -sL https://raw.githubusercontent.com/hashicorp/vagrant/master/keys/vagrant -o vagrant.pem
chmod 600 vagrant.pem

# ログイン
ssh -p 2222 vagrant@localhost -i vagrant.pem
```

## VBoxGuestAdditionsのインストール準備

kernelを入れない手順が多くアップされているが、kernelを入れないとVBoxGuestAdditionsで失敗する。ここが二つ目のハマリポイント。kernelも指定しておけば取り敢えずOK。

```
# VBoxGuestAdditions依存パッケージのダウンロード
sudo yum install -y kernel kernel-devel perl gcc

# 再起動
sudo shutdown -r now
```

## VBoxGuestAdditionsのインストール

```
# VBoxGuestAdditionsイメージをアタッチ
VBoxManage storageattach "$VM" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium $VGA --forceunmount

# ログイン
ssh -p 2222 vagrant@localhost -i vagrant.pem

# VagrantにRHELと認識させるおまじない
sudo ln -s /etc/system-release /etc/redhat-release

# OSからマウント
sudo mount -r /dev/cdrom /media

# VBoxGuestAdditionsのインストール
sudo /media/VBoxLinuxAdditions.run --nox11

# アンマウント
sudo umount /media
```

## クリーンアップ

ボックス化した時にサイズを小さくするための作業

```
# クリーンアップ
rm $HOME/.bash_history
sudo rm -rf /var/cache/yum
sudo dd if=/dev/zero of=/0 bs=4k
sudo rm -f /0
history -c

# シャットダウン
sudo shutdown -h now
```

## Vagrant boxの作成と登録

```
vagrant package --base "$VM"
vagrant box add --name "amzn2-2017.12.0.20171212.2-x86_64" package.box
```

## お試し起動

```
mkdir amznlinux2
cd amznlinux2
vagrant init amzn2-2017.12.0.20171212.2-x86_64
vagrant up
```

## お試しログイン

```
$ vagrant ssh
Last login: Tue Jan 16 08:24:53 2018 from gateway

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 5 packages available
Run "sudo yum update" to apply all updates.
```