EBSボリュームタイプをgp2からgp3に移行するにあたって色々調べた
- きっかけ
- 前提
- 結論
- 性能比較
- 確認するポイント
- ボリュームサイズ
- IOPS
- スループット
- 費用
- 移行方法
- 雑感
きっかけ
先日のStorage JAWSの中でgp2からgp3への移行に関するLTがあったので。
内心、安くなるっぽいから性能比較して移行方法考えてやらなきゃな~とか思ってたんですがずっと後回しになっちゃって...
鉄は熱いうちに打てと言うことで興味が向いてるうちに色々調べた。
前提
移行を考えるシチュエーションは以下の通り。
結論
- 想定するシチュエーションであれば移行したほうが得。
- IOPSはスペックアップとなる。追加費用を払うことでさらなるスペックアップも可能。
- gp2: ベースライン 150 IOPS(バーストで最大3,000 IOPS)
- gp3: ベースライン 3,000 IOPS(最大16,000 IOPSまで追加可能)
- スループットはスペックダウンとなるが誤差の範囲。また追加費用を払うことでスペックアップも可能。
- gp2: ベースライン128MiB/s(固定)
- gp3: ベースライン125MiB/s(最大1,000MiB/sまで追加可能)
- 費用は$1.2の削減となる。(-20%)
- gp2: $6.0(50GB * $0.12)/ month
- gp3: $4.8(50GB * $0.096)/ month
OS再インストールした環境でインポートしたWSL2のdistroを起動すると[プロセスはコード 4294967295 (0xffffffff) で終了しました]エラーが発生する
概要
表題の通りです。
前回の記事でファイルを直接指定してdistroをインポートしたんですがエラーが発生しました。
それのトラブルシュートです。
前提
- OSを再インストールした環境。
- WSL2のdistro(
.vhdx
ファイル?)をDドライブに配置して運用している。
事象
Dドライブに配置されたdistroを起動すると下記エラーが発生する。
[プロセスはコード 4294967295 (0xffffffff) で終了しました]
原因
OSを再インストールしたためDドライブに配置された.vhdx
ファイルの権限が不足しておりエラーになりました。
ログを取り忘れましたが、ターミナルのタブを開いてdistroを起動せずにwslコマンドでdistroを起動すると権限が不足してる旨のメッセージとともにエラーログが出力されました。
解決方法
.vhdx
ファイルにフルコントロールを追加して再度distroを起動。
補足
エラーコードだけを見て下記の方法を先に実行しました。
WSL2 distro failing to startup with code 4294967295 · Issue #5092 · microsoft/WSL
参考
雑感
使ってたWindowsターミナルを管理者権限で起動しておけばなんとかなった気がしないでもない。
WSL2でexportしてないdistroを直接importする
概要
OSを入れ直したPCで以前使っていたWSL2のdistroをインポートします。
tarで固めたファイルをインポートするやり方はいろんな人がやってるんですが、今回はtarで固めるのを忘れてOS再インストールしたので...
前提
- 元々、exportしたWSL2のdistroをDドライブに配置して運用していました。
- WSL2はセットアップ済み。
想定するシチュエーション
PCを組み直してSSDも変更したのでOSをクリーンインストールしました(書きづらいのでここでは再インストールとします)。
しかし、再インストール前にWSL2のdistroをexportするのを忘れていました。
前提にも記載しましたが、Dドライブにdistroを配置して運用していたので、.vhdx
ファイルはDドライブに存在します。
exportでtarに固めたファイルのインポート方法はいくらでも書いてあるけど、tarで固めてないパターンの手順がわからない...と言うシチュエーションです。
import-in-placeでdistroをインポート
--import-in-place
オプションを使って.vhdx
ファイルを直接指定してインポートします。
以下の通りです。
PS C:\Users\> wsl --list --verbose Linux 用 Windows サブシステムにディストリビューションがインストールされていません。 'wsl.exe --list --online' を使用して利用可能なディストリビューション を一覧表示し、'wsl.exe --install <Distro>' を使用してインストールします。 また、Microsoft Store にアクセスしてディストリビューションをインストールすることもできます: https://aka.ms/wslstore Error code: Wsl/WSL_E_DEFAULT_DISTRO_NOT_FOUND PS C:\Users\> wsl --import-in-place workspace D:\wsl\Ubuntu\ext4.vhdx この操作を正しく終了しました。 PS C:\Users\lyche> wsl --list --verbose NAME STATE VERSION * workspace Stopped 2
詳細は公式の下記ドキュメントを参照。
WSL の基本的なコマンド | Microsoft Learn
参考
雑感
実践されている方が居て助かりました。久しぶりにWSL触ったのでヘルプを読んでもなかなかピンと来なくて...
N日より前のファイルを削除するコマンド
概要
N日より前の特定のファイルを削除したいってシュチュエーションで使うコマンドです。
具体的には以下のシチュエーションです。
- logrotateが使えない
- ファイルはログファイル
- 出力元アプリが
application.log-YYYYMMDD
の様な形式で、YYYYMMDDの日付suffixが付く
アプリが自動でログローテートしてるのでサーバ側でlogrotateの設定は入れれません。
が、当該ログファイルの削除処理はどこにもないのでたまり続けます。といった具合。
コマンド
find /var/www/app/logs -name "application.log-*" -mtime +7 -exec rm -f {}\;
詳細
find -mtime
-mtime
で「最終更新日が7日以前のファイル」と指定する。
詳細は以下を参照のこと。
mtimeの時間範囲の計算がいまいち分かりづらかったので整理。
コマンド実行時点を0日目として、24時間前を1日目...Nという風に考える。
時間の端数は無視されるとのことなので、実行時点から24時間未満(1未満)は無視される。なので24時間前が1日前と言うカウント。
詳細は以下。
File was last accessed less than, more than or exactly n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.
ローカルでの実験が以下の通り。当日分1世代+前日からの7世代を保持って感じになる。
$ date 2022年 10月10日 月曜日 23時01分48秒 JST $ ls -l total 0 -rw-r--r-- 1 z staff 0 9 27 21:00 application.log-20220927 -rw-r--r-- 1 z staff 0 9 28 21:00 application.log-20220928 -rw-r--r-- 1 z staff 0 9 29 21:00 application.log-20220929 -rw-r--r-- 1 z staff 0 9 30 21:00 application.log-20220930 -rw-r--r-- 1 z staff 0 10 1 21:00 application.log-20221001 -rw-r--r-- 1 z staff 0 10 2 21:00 application.log-20221002 -rw-r--r-- 1 z staff 0 10 3 21:00 application.log-20221003 -rw-r--r-- 1 z staff 0 10 4 21:00 application.log-20221004 -rw-r--r-- 1 z staff 0 10 5 21:00 application.log-20221005 -rw-r--r-- 1 z staff 0 10 6 21:00 application.log-20221006 -rw-r--r-- 1 z staff 0 10 7 21:00 application.log-20221007 -rw-r--r-- 1 z staff 0 10 8 21:00 application.log-20221008 -rw-r--r-- 1 z staff 0 10 9 21:00 application.log-20221009 -rw-r--r-- 1 z staff 0 10 10 21:00 application.log-20221010 $ find . -mtime +0 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 ./application.log-20221002 ./application.log-20221003 ./application.log-20221004 ./application.log-20221005 ./application.log-20221006 ./application.log-20221007 ./application.log-20221008 ./application.log-20221009 $ find . -mtime +1 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 ./application.log-20221002 ./application.log-20221003 ./application.log-20221004 ./application.log-20221005 ./application.log-20221006 ./application.log-20221007 ./application.log-20221008 $ find . -mtime +2 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 ./application.log-20221002 ./application.log-20221003 ./application.log-20221004 ./application.log-20221005 ./application.log-20221006 ./application.log-20221007 $ find . -mtime +3 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 ./application.log-20221002 ./application.log-20221003 ./application.log-20221004 ./application.log-20221005 ./application.log-20221006 $ find . -mtime +4 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 ./application.log-20221002 ./application.log-20221003 ./application.log-20221004 ./application.log-20221005 $ find . -mtime +5 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 ./application.log-20221002 ./application.log-20221003 ./application.log-20221004 $ find . -mtime +6 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 ./application.log-20221002 ./application.log-20221003 $ find . -mtime +7 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 ./application.log-20221002 $ find . -mtime +8 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930 ./application.log-20221001 $ find . -mtime +9 | sort ./application.log-20220927 ./application.log-20220928 ./application.log-20220929 ./application.log-20220930
以下のサイトが大変参考になりました。
【Linux】find コマンド【図解】 | 100%レンタルサーバーを使いこなすサイト
find -exec
-exec
で実行するコマンドを指定しているが、最後のエスケープとセミコロン(\;
)が肝。
execで渡したコマンドの終端を示す。
参考:find -exec の後ろにつく\; と + の違い | 雑廉堂の雑記帳
以上。
AWS CLIとjqでCSVを作るワンライナーレシピ集
概要
EC2インスタンスやEBSの一覧をスプレッドシート(エクセル)で作成しなければいけない...みたいなツラミを味わってるのは自分だけじゃないはず。
練習がてら雑にメモに追記していっていたAWS CLIとjqを使ってCSV出力するワンライナーが結構な量溜まったので、整理も兼ねてブログ記事にしようかと。
基本的にjqの組み立てについての解説はせず、どんな情報が取れるかの補足のみ記載します。
出力はヘッダー付きCSVになります。
※改行して整形してますが、ワンライナーって言っていいよね...?ダメ...?
目次
- 概要
- 目次
- 前提
- ワンライナーレシピ集
- 雑感
前提
実行環境はWSLのUbuntuですが、Macでも動作を確認しています。
紹介するものに関しては、OS依存の動作の違いは特にないかと思います。(たぶん)
$ aws --version aws-cli/2.2.22 Python/3.8.8 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off $ jq --version jq-1.6
ワンライナーレシピ集
EC2インスタンスの一覧を取得する
EC2インスタンスを一覧取得してCSV出力するワンライナーです。
$ aws ec2 describe-instances | \ jq -r '.Reservations[].Instances[] | { TagName: .Tags | from_entries.Name , PrivateIpAddress , PublicIpAddress , InstanceId , InstanceType , AZ: .Placement.AvailabilityZone , State: .State.Name }' | jq -r -s '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' > list.csv
.Tags | from_entries.Name
とすることで、TagにNameが設定されていなくても一覧に出力されるようになります。
よくあるmapとselectの組み合わせだと、Nameが設定されてないと出力されないので。
.Tags | from_entries.{Tagキー}
とすることで任意のTagを出力可能です。
最後のjq -r -s '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'
でCSV用のヘッダーを追加してます。
これはStackOverflowから引っ張ってきました。
How to convert arbitrary simple JSON to CSV using jq? - Stack Overflow
続きを読む