はじめに
CloudFormationなどで自動的にリソースを払い出しても、中身のOS設定などが手動ではそれは自動化ではなく単に「自動化っぽい」ものだなぁ…と感じますよね。
サーバ中身の設定で特に重要なのはディスクボリュームの割り当て(フォーマット)だと思います。(他にもいろいろありますが。)
なのでそこを何とか自動化しようと調べてみました。
やりたいこと
Windowsサーバ(EC2)構築時にデータボリューム用として割り当てたEBSのフォーマットを自動化したい。
自動化するためのコマンド(ユーザデータ)
以下の一行をユーザデータに追加するだけです。(思ったより簡単でした。)
echo 'select disk 1' 'attributes disk clear readonly' 'online disk' 'clean' 'convert gpt' 'create partition primary' 'format quick fs=ntfs' 'assign letter=D' | diskpart
解説
色々サイトを調べていると、diskpartコマンドを一度別ファイルにリダイレクトして、「diskpart /s ファイル名」で実行する方法が多く見つかりました。
例:
# ファイル生成
echo 'select disk 1' > sample.txt
echo 'clean' >> sample.txt
echo 'convert gpt' >> sample.txt
# 実行
diskpart /s sample.txt
んー、だったらパイプを使ってdiskpartコマンドにそのまま処理を渡せるのではないか。
という感じで、このやり方を考えました。
それぞれのコマンドの説明は以下に記載します。
'select disk 1'
フォーマット対象のボリュームを選択します。
今回はルートボリュームが「0」で、後付けのデータボリュームが「1」なので、ディスク1を選択します。
'attributes disk clear readonly'
ディスクのReadOnly権限を無効にします。
'online disk'
ディスクをオンラインにします。
'clean'
ディスクをリセットします。
'convert gpt'
パーティション形式を選択します。今回はGPTを選択します。
'create partition primary'
プライマリパーティションを作成します。今回は全ての容量を割り当てています。
割り当てる容量を制限したいときは「size」オプションを使います。
例:'create partition primary size=500'(500MBをプライマリパーティションとして割り当てている。)
'format quick fs=ntfs'
NTFS形式のファイルシステムにフォーマットします。
'assign letter=D'
ドライブレターを「D」に指定します。
実践
①ユーザデータにコマンド入力してEC2起動
②リモートデスクトップで接続

③[Windowsスタートボタン]→[ディスクの管理]を確認
最後に
今回はWindowsサーバを取り上げましたが、Linuxサーバでも同じようにユーザデータを使ってディスクのマウント・フォーマットもできます。
環境自動構築する際にEC2を払い出すタイミングでデータボリュームをアタッチするような設計の場合などは今回のやり方を参考にしてみてください。
また、AMIへ反映できないような設定はたくさんあります。特にWindowsサーバの場合はSysprepをかけてAMI取得をすると初期化されてしまう設定などが多々あります。
そんな時にユーザデータを使うことで、便利にサーバ構築ができます。
参考サイト