ブルームテクノロジー

テクノロジー

【EC2バージョン確認】AWSで使える簡単シェルワンライナー集

【EC2バージョン確認】AWSで使える簡単シェルワンライナー集

こんにちは!!!!!
システム統括課 ブログ担当です。

突然ですが「ワンライナー」をご存知でしょうか。

ワンライナーとは、パパッと処理させたい時にコピペで使える1行プログラムを指します。用途様々かと思いますが、私は使い捨ての、その場で実行する為のシステムとして利用することが多いです。

one linerと言うくらいですから、とにかく1行に全て詰め込めばOKなのだと認識しています(多分)

ワンライナープログラムにも言語様々あるかと存じますが、本記事でこれからご紹介するのは、私がプライベートや業務でよく使う難易度低めの「簡単1行シェル」です。
Linuxで必要な情報、必要な操作をサクッと手に入れたい場合に実行することが多く、本記事でご紹介するコマンドの実行結果に責任を負うことは致しかねますが、便利ですので気に入ったものがあれば 検証環境などで是非ご利用頂ければ幸いです。

検証環境

今回の検証環境は以下のような構成です。
コマンドのインストールやIAMロールのアタッチは必要に応じて実施してください。

インスタンスタイプt4g.small
OSAmazon Linux 2
カーネルバージョン4.14.252-195.483.amzn2.aarch64

ファイルをnullで上書きする

ファイルをnullで上書きすることで、ファイルの中身をnullにするコマンドです。

rmしてからtouchでも良いですが、ファイル名だけ変更すれば1回のコマンド実行で済むので楽ですね。実行時の注意点は、ファイル名を間違えないことです。

cp /dev/null example.txt

PHPバージョン情報のみ抽出して表示する

php -vでバージョン情報を確認することが出来ますが、余計な文字を含めたくない場合もあるかと存じます。このコマンドでは、PHPバージョンのみを抽出して値を返すことができます。

php -i 2>/dev/null | grep 'PHP Version =>' | sed -e 's/PHP Version => //' | head -n 1

Apacheのバージョン情報のみ抽出して表示する

同様に、Apacheのバージョン情報のみを抽出して表示するコマンドです。sedは結果を加工する際に本当に使い勝手が良く、いつも頭が上がりません。

httpd -v 2>/dev/null | grep 'Server version:' | sed -e 's/Server version://' | sed -e 's/ //g'

HTTPのヘルスチェックを行いステータスコードを返す

特定のファイルに対してのHTTPアクセスが有効かどうかヘルスチェックを行いたいケース、時折あるのではないかと思います。コマンド1行でステータスコードを返してくれるので結構な頻度で使うことが多いです。なおタイムアウト機能付なので、個人的にはそれも便利です。

curl -LI example.com/index.php -o /dev/null -w '%{http_code}\n' -s -m 3

httpdのプロセスを全て強制終了する

特に意味は無いのですが、なにか無性にむしゃくしゃした時とか全てのhttpdプロセスをkillしたくなりますよね。

……というのは冗談ですが、とはいえ確実に全てのプロセスをkillしたいケースはまぁまぁあるかなと思います。まぁまぁ……たまにあるかも知れません。稀に、あります。うーん……ありますかね。

やはり無性にむしゃくしゃした時とかですかね……。

pgrep "httpd" | xargs kill -9

16文字のランダム文字列を出力する

パスワードとかに使う文字列を使いたい、等。headコマンドで文字数を指定することができます。あとはランダム文字列を見ていると少し心が安らぐ方向け。都会の喧騒を忘れて、暫しurandomの海に浸って下さい。

cat /dev/urandom | tr -dc '[:alnum:]' | head -c 16

MySQLの残り接続可能数を表示する

mysqladminにベタでログイン情報与えているので、同じ書き方は本番環境で非推奨です!
実際は適宜セキュアな書き方に変えて頂きたいですが、これは1行で残りの接続可能数を表示することもできますという例です。

expr $(/usr/bin/mysqladmin -u***** -p***** Variables 2>/dev/null | grep ' max_connections ' | awk '{print $4;}') - $(/usr/bin/mysqladmin -u***** -p***** extended-status 2>/dev/null | grep ' Threads_connected '| awk '{print $4;}')

最終ログイン履歴を5件取得する

これはチームメンバーがログインしていた形跡を見て微笑ましくなるためのコマンドです。
勿論、パラメータを変える事で取得件数を増やすことは容易に可能です。

last -an 5 | head -5

EC2のカーネルバージョンを確認する

カーネルバージョンを取得するコマンドです。これはよく使いますよね。

uname -r

EC2のバージョンを確認する

EC2のディストリビューションを確認する場合はこのコマンドを使います。
これAmazonLinuxだっけ?AmazonLinux2だっけ?みたいな疑問がSSHログインした後に発生した時などに、すぐにその不安を取り除くにはこのコマンドがベストだと思います。

cat /etc/system-release

EC2のインスタンスIDを取得する

EC2でメタ値の取得を行う機会もあるかと思います。このコマンドでは、コマンドを実行しているEC2インスタンスのインスタンスIDを取得することが出来ます。

これ単体での使い道はそこまで多く思い浮かばないですが、例えば大量のサーバの管理をひとりで捌きたいケースにおいて、SSHログインした際に出てくるメッセージにインスタンスIDを忍ばせてあげると、SSHコンソール上で「この接続がどのインスタンスか分からなくなってしまった……」と混乱することを防ぐことが出来ます。

ちょっとした小技ですね。シンプルですが、結構重宝します。

curl -s http://169.254.169.254/latest/meta-data/instance-id

EC2に設定されたNameタグ値を取得する

EC2にはデフォルトでNameタグの設定を行うことが可能です。このコマンドでは、1行でNameタグのValueを取得することが出来ます。

上述のようにSSHログイン時のメッセージに表示させても良いですし、例えばZABBIXなどの監視サーバを作り込む際にZABBIX側に送信するパラメータとしてNameタグ情報を持たせるとなかなかスマートなのではないかと思います。

aws ec2 describe-instances --region $(sudo curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | grep [0-9a-zA-Z] | sed 's/^.*"\(.*\)".*$/\1/') --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) | jq '.Reservations[].Instances[] | {Value: (.Tags[] | select(.Key=="Name").Value)}' | grep [0-9a-zA-Z] | sed 's/^.*"\(.*\)".*$/\1/'

EC2にアタッチされているEBSボリュームから作成されたスナップショットIDを取得する

なんか面白くなってきたので、思い付きでEBSボリュームから作成されたスナップショットが存在する場合にそのスナップショットIDを取得するコマンドを1行で書いてみました。

ManagementConsoleでEC2とEBSとsnapshotのページを行き来するのがとっても面倒くさい時に実行すると良い感じかも知れません。楽しいですね~!

aws ec2 describe-snapshots --region $(sudo curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | grep [0-9a-zA-Z] | sed 's/^.*"\(.*\)".*$/\1/') --filters Name=volume-id,Values=$(aws ec2 describe-instances --region $(sudo curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | grep [0-9a-zA-Z] | sed 's/^.*"\(.*\)".*$/\1/') --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --query 'Reservations[].Instances[].BlockDeviceMappings[].Ebs.VolumeId' | grep [0-9a-zA-Z] | sed 's/^.*"\(.*\)".*$/\1/' | sed "s/ //g") | grep snap- | sed 's/^.*"\(.*\)".*$/\1/'

おわりに

以上、1行シェルの紹介でした。
そこまで頻繁に使うというものでもないと思いますが、読みやすさと引き換えに欲しい情報がポチっと手に入るので個人的にはやはり便利を感じます。

過程を1行でキュッとまとめてあげられるとやはり楽しいですね。とはいえ半分くらいは自己満足で出来ているかもしれません。

また機会があれば違うものも……。
小技ではございますが、ひとつでもお役に立てれば幸いでございます。

おまけ:urandomの海に浸ってみた

cat /dev/urandom | tr -dc '[:alnum:]' | head -c 500000

……。

50万文字の海は、100万ドルの夜景のように
きれいだなあ……

……ん?

(スゥ……)

……!?!?



>>エンジニア採用 特設サイト<<

「エンジニア職種 メンバー募集中」です!
(2024年06月25日現在)

予告なく募集を終了することがございます。予めご了承ください
最新の募集状況は上記からご確認頂けます

>>システム統括課の他の記事を読む<<