sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

PowerShell でディスクの初期化をすると楽ですよ

似たような内容を繰り返す手作業は苦手です、那須です。

Windows Server を構築した際にディスクの初期化作業を皆さんしますよね? いつもはサーバーマネージャーを開いて、この 50GB は D ドライブ、この 100GB は…あ、100GB ディスクが 3 つもある、どれがどのドライブになるんや?とか、多少悩みながらやってたんですが、この作業を悩まずに CLI でやりたいなと思いました。

Server Core で運用してるところもあるくらいやから、ほとんどのことは PowerShell でできるやろと思って調べてみたらやっぱりできそうだったのでやってみました。 というか、今まさに構築案件で実際に使ってます。

 

まずは EBS ボリュームを作成

とりあえず EBS ボリュームを作成して EC2 インスタンスにアタッチします。 今回作成した EBS ボリュームは↓この画像の通り。

f:id:nasrinjp1:20190304210301p:plain
作成した EBS ボリューム一覧

 

PowerShell でディスクの初期化とドライブレター設定

対象の EC2 インスタンスに RDP でログインして、PowerShell を開きます。 ちなみに、PowerShell は管理者として開いてください。ディスクの初期化は管理者として PowerShell を実行していないとできません。 Get-Disk コマンドで実際にディスクが見えていることを確認しましょう。

PS C:\Users\Administrator> get-disk

Number Friendly Name Serial Number                    HealthStatus         OperationalStatus      Total Size Partition
                                                                                                             Style
------ ------------- -------------                    ------------         -----------------      ---------- ----------
2      NVMe Amazo... vol094aa450e33c77e0e_00000001.   Healthy              Online                     100 GB RAW
1      NVMe Amazo... vol0f97e22654bd0299b_00000001.   Healthy              Online                     100 GB RAW
0      NVMe Amazo... vol0a2321b8acd7e61d5_00000001.   Healthy              Online                      30 GB MBR
3      NVMe Amazo... vol01f876d6509237413_00000001.   Healthy              Online                     100 GB RAW

どの EBS ボリュームを何ドライブに、ラベルは何にするかを配列で指定しましょう。 ↓この例では、3 つの EBS ボリュームをそれぞれX、Y、Zドライブに割り当てるように設定しています。 これをそのまま PowerShell ウィンドウに貼り付けてもいいですし、スクリプトとして ps1 ファイルにしてそれを実行するでも、どちらでも OK です。 とにかく実行すればディスクの初期化が完了しているはずです。

@(
    @(
        "vol-0f97e22654bd0299b",
        "XXX",
        "X"
    ),
    @(
        "vol-094aa450e33c77e0e",
        "YYY",
        "Y"
    ),
    @(
        "vol-01f876d6509237413",
        "ZZZ",
        "Z"
    )
) | foreach {
    Get-Disk | Where SerialNumber -match ($_[0] -replace "-") | Set-Disk -IsReadonly $False | Set-Disk -IsOffline $False
    Get-Disk | Where SerialNumber -match ($_[0] -replace "-") | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel $_[1] -Force | Get-Partition | Add-PartitionAccessPath -AccessPath ($_[2] + ":")
}

ちなみに、↑この配列部分を 1 つだけにして実行するとエラーになります。 なので、2 つ以上のディスクを初期化する場合に限定して使うようにしてください。 そのうちディスクが 1 つでも実行できるように改修しようと思います。

できました。 1 つだけディスクを初期化する場合は、2 つ目の@の前に , を追加するだけでした。 ↓このブログを社内の PowerShell マスターに教えてもらいました。

tech.guitarrapc.com

↓こういう感じです。

@(
    ,@(
        "vol-0f97e22654bd0299b",
        "XXX",
        "X"
    )
) | foreach {
    Get-Disk | Where SerialNumber -match ($_[0] -replace "-") | Set-Disk -IsReadonly $False | Set-Disk -IsOffline $False
    Get-Disk | Where SerialNumber -match ($_[0] -replace "-") | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel $_[1] -Force | Get-Partition | Add-PartitionAccessPath -AccessPath ($_[2] + ":")
}

さすがに 1 からスクリプト書く余裕もなかったんで、↓このページを参考にさせていただきました。 本当に誰かが書いてくれたブログって助かりますね。

blog.yottun8.com

最初に試したスクリプトは実行するとポップアップが出て全自動でできなかったんですが、↓このページに助けてもらいました。

teratail.com

 

確認してみよう

↓このリンク先にあるスクリプトを実行しましょう。 そしてドキュメントは英語で確認しましょう。 日本語だと情報が古い場合があって、記述が古いだけならいいんですがスクリプトが変わってる場合もあるので、英語でドキュメントを確認するのは本当に大事です。 ちなみに私は日本語ドキュメントを信頼して何回かハマったことがあります。

docs.aws.amazon.com

実行すると↓こんな感じの結果が表示されるはずです。

PS C:\Users\Administrator> C:\vol-check.ps1

Disk Partitions DriveLetter EbsVolumeId           Device    VirtualDevice VolumeName
---- ---------- ----------- -----------           ------    ------------- ----------
   0          1           C vol-0a2321b8acd7e61d5 /dev/sda1 N/A
   1          2           X vol-0f97e22654bd0299b xvdf      N/A           XXX
   2          2           Y vol-094aa450e33c77e0e xvdg      N/A           YYY
   3          2           Z vol-01f876d6509237413 xvdh      N/A           ZZZ

この結果を見れば、どの EBS ボリュームが何ドライブになっているか一目瞭然ですね。

 

まとめ

PowerShell でディスクの初期化をする流れをご紹介しました。 これの何がいいかというと、わざわざ RDP でログインしなくても Systems Manager の Session Manager 経由で作業できるんですね。 ということは、AWS コンソールでディスクの初期化が完了するということですよ!
もちろん、対象の EC2 インスタンスに Session Manager が使えるように IAM ロールを付与したり必要な VPC エンドポイントにアクセスできるようにしたりといくつか事前準備は必要ですが、そんなに難しい準備でもないので、大量の Windows Server と大量の EBS ボリュームの初期設定を前に途方に暮れてる方は試してみてはどうでしょうか?

ディスク初期化以外にも Windows Server の初期構築に必要な作業はあるので、今後はそれらも全部 PowerShell スクリプト化して他でも使い回せるようにしておきたいと思います。

 

2019.03.07追記

続編書きました。

nasrinjp1.hatenablog.com