lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

EBSボリュームタイプをgp2からgp3に移行するにあたって色々調べた

  • きっかけ
  • 前提
  • 結論
  • 性能比較
  • 移行方法
  • 雑感

きっかけ

先日のStorage JAWSの中でgp2からgp3への移行に関するLTがあったので。

内心、安くなるっぽいから性能比較して移行方法考えてやらなきゃな~とか思ってたんですがずっと後回しになっちゃって...
鉄は熱いうちに打てと言うことで興味が向いてるうちに色々調べた。

前提

移行を考えるシチュエーションは以下の通り。

  • EC2インスタンスにアタッチされたEBSボリューム。
  • ボリュームタイプはgp2、ボリュームサイズは50GiB。
  • インスタンスの使用用途はWebサーバ。

結論

  • 想定するシチュエーションであれば移行したほうが得。
  • 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をインポートしたんですがエラーが発生しました。
それのトラブルシュートです。

kitigai.hatenablog.com

前提

  • 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再インストールしたので...

前提

想定するシチュエーション

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日以前のファイル」と指定する。
詳細は以下を参照のこと。

find(1) - Linux manual page

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.

find(1) - Linux manual page

ローカルでの実験が以下の通り。当日分1世代+前日からの7世代を保持って感じになる。

実験ログ

$ date
20221010日 月曜日 230148秒 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

続きを読む