sorta kinda...

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

Japan APN Ambassadors 2019 に選出されました!

AWS Summit Tokyo 2019 に全日参加( BeeX ブースでの対応)してます、那須です。

大変嬉しいことに、Japan APN Ambassadors 2019 の 1 人に選ばれました!!

f:id:nasrinjp1:20190614090929j:plain
アイレット(cloudpack)の栄野川さん(写真右)と記念写真

 

APN Ambassadors が何かと言うと、

APN Ambassadors は、世界中の APN Consulting Partner から卓越した技術力を持ち、社外への情報発信(セミナーでの発信、Blog や書籍での発信)をしているメンバーが選出されます。AWSに関する深い専門知識を持ち、AWS Solutions Architectと協力し、お客様の成功をサポートします。

とのことで、いくつかの条件をクリアしないと選出されないようです。 何も考えずにブログを書いたりイベントで登壇したりしていたので特に何かを狙っていたわけではありませんが、実際に自分以外の方からこういう形で認められるとやはり嬉しいですね。

また、 カルチャー | AWS Japan Recruitment にもあるように、AWS 相澤様から Insist on the Highest Standards についてもお話がありました。

Insist on the Highest Standards

リーダーは常に高い水準を追求します。この水準は高すぎると感じられるかもしれません。リーダーは継続的に求める水準を引き上げていき、チームがより品質の高い商品やサービス、プロセスを実現できるように推進します。

世界で勝負できる Japan APN Ambassadors にしていきます! Go to Global!

ということで、今年こそは英語を真剣に勉強しようと思いました(8 年ぶり 2 度目

今後も AWS に関する技術情報や自分なりに考えたことなどをまとめてブログに書いていきます。 イベントにも積極的に登壇したり LT したりしていきます。 よろしくお願いします!

EBS ボリューム初期化を最小の手間で実行するスクリプトを作った

全然関係ないけど最近懸垂にハマってます、那須です。

AMI やスナップショットから EBS ボリュームを作成した場合、ストレージブロックはまだ S3 にあります。 なので何もせずに使うと「あれ?なんか遅いな…」と思うことになりますよね。 それを解消するために EBS ボリュームの初期化を行うわけです。 EBS ボリューム初期化って何よ?って方は↓このドキュメントを読んでください。

docs.aws.amazon.com

で、このドキュメントの手順を見てみると、

  1. wmic でデバイス ID を確認する
  2. 出てきたデバイス ID に対して dd や fio を実行する

という流れですが、wmic で出てきたデバイス ID をコピペして dd や fio の引数として指定するのはなんか面倒ですね。 それが数デバイスだったらまだいいんですが、10個近くなるとだいぶテンション下がります。

私の周りの方に聞く限り、EC2 インスタンスのバックアップは AMI 作成で対応されている方がほとんどだったので、EBS ボリューム初期化も全デバイスに行うことになるはずです。 それなら、手順って 1 つにできるんじゃない?

 

スクリプト実行するだけにしよう

全デバイス ID を取ってきてそれを引数に使ってコマンド実行するスクリプトを作りました。 wmic の代わりに (Get-WmiObject Win32_DiskDrive).deviceid でデバイス ID を取ってます。 dd 実行スクリプトはこんな感じ。

$dd_path = "'C:\dd.exe'"

[System.Collections.ArrayList]$processes = @()
foreach ($deviceid in (Get-WmiObject Win32_DiskDrive).deviceid) {
    $command1 = "$dd_path if=$deviceid of=/dev/null bs=1M --progress --size"
    $command2 = "Write-Host $command1"
    $dd_process = Start-Process -FilePath powershell.exe -ArgumentList "& $command2; & $command1" -PassThru
    $processes.Add($dd_process)
}
foreach ($dd_process in $processes) {
    Wait-Process -InputObject $dd_process
    Get-Process -InputObject $dd_process
}
Write-Host "Initializing Amazon EBS Volumes finished!"

fio 実行スクリプトはこんな感じ。

$fio_path = "'C:\Program Files\fio\fio.exe'"

[System.Collections.ArrayList]$processes = @()
foreach ($deviceid in (Get-WmiObject Win32_DiskDrive).deviceid) {
    $command1 = "$fio_path --filename=$deviceid --rw=read --bs=128k --iodepth=32 --direct=1 --name=volume-initialize"
    $command2 = "Write-Host $command1"
    $dd_process = Start-Process -FilePath powershell.exe -ArgumentList "& $command2; & $command1" -PassThru
    $processes.Add($dd_process)
}
foreach ($dd_process in $processes) {
    Wait-Process -InputObject $dd_process
    Get-Process -InputObject $dd_process
}
Write-Host "Initializing Amazon EBS Volumes finished!"

よく見るとわかりますが、コマンド部分が違うだけなので function でいい感じにしようと思えばできますが、そんなに頻繁に使わないのでこれでいいかなーと…

このスクリプトを対象インスタンスに置いといて、リストアした時に上記のスクリプトを実行するだけで EBS ボリューム初期化ができます。 EC2 インスタンス作成時であれば、ユーザデータにこのスクリプトを実行するように書けばさらに手間を減らせますね。

実際に実行すると、各デバイスごとに PowerShell ウィンドウが開いてコマンド実行するようになってます。

f:id:nasrinjp1:20190605083957p:plain
dd 実行の様子

f:id:nasrinjp1:20190605083930p:plain
fio 実行の様子

スクリプト実行したウィンドウでは、↓こんな感じの出力になります。 特に意識してログ等は出してないですが、必要に応じてログを出したりすることもできますよ。

PS C:\Users\Administrator> C:\exec_dd.ps1
0
1
2

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
              0        0          0       5.66   1448
              0        0          0       5.97   1816
              0        0          0       5.89   1068
Initializing Amazon EBS Volumes finished!
PS C:\Users\Administrator> C:\exec_fio.ps1
0
1
2

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
              0        0          0       5.67   3612
              0        0          0       5.92   3628
              0        0          0       6.00    380
Initializing Amazon EBS Volumes finished!

 

感想

あんまりしない作業なので毎回ドキュメントを見て思い出してやってましたが、これでドキュメントを見ずにすみます。 でも本当にあまりやらない作業なのでここまでする必要があったのかどうかは疑問が残りますが、PowerShell のお勉強をしたと思って積極的に使っていこうと思いました。