インフラ

1行でズバリ取得、EC2でたまに使うかもしれない逆引きシェルスクリプト

投稿日:

男には1行でバッチリ値を取得しなければならない時がある

無いかもしれないけど、あるのだ。

 

Amazon EC2 メタデータ編

自身のインスタンスID

/opt/aws/bin/ec2-metadata | grep 'instance-id: ' | sed -e 's/instance-id: //'

 

メタデータから'instance-id: 'を含む箇所を抜き出し、'instance-id: 'を削除しました。

 

自身のインスタンスタイプ

/opt/aws/bin/ec2-metadata | grep 'instance-type: ' | sed -e 's/instance-type: //'

 

メタデータから'instance-type: 'を含む箇所を抜き出し、'instance-type: 'を削除しました。

 

自身のパブリックIPアドレス

/opt/aws/bin/ec2-metadata | grep 'public-ipv4: ' | sed -e 's/public-ipv4: //'

 

メタデータから'public-ipv4: 'を含む箇所を抜き出し、'public-ipv4: 'を削除しました。

 

リソース関連

現在発行しているLet's EncryptのSSL証明書の数

ls -l /etc/letsencrypt/live 2>/dev/null | grep ^d | wc -l

 

Let'sEncryptの証明書は、通常/etc/letencrypt/live下にディレクトリを作成して発行されます。
なので、/etc/letencrypt/live下のディレクトリ数 イコール 証明書の発行数が分かると踏みました。
その為、/etc/letencrypt/live下のディレクトリ数のカウント数を返します。

なお、Let'sEncryptがインストールされていない場合はエラー出力は破棄して「0」とのみ表示します。

 

インストールされているPHPバージョン

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

 

phpinfoから'PHP Version =>'を含む箇所を抜き出し、'PHP Version =>'を削除して出力します。
また、'PHP Version =>'で抜き出すと2行くらい出てくるので、headコマンドで1行目のみ出力するようにします。

 

インストールされているMySQLバージョン

mysql -V 2>/dev/null

 

これはシンプルですね。せいぜい、インストールされてなくてもエラー出力が出ないように破棄してるくらいの工夫しかないです。

 

サービス関連

httpdなど、Webサービスの稼働状態確認

curl -LI localhost/health_check.html -o /dev/null -w '%{http_code}\n' -s

 

curlで自分自身の「health_check.html」というダミーファイルを確認し、ステータスコードを返します。
ダミーファイルの名前は任意で良くて、中身も空でいいです。ステータスコードを返すので、200でなければ何らかの障害が発生していると判断できます。

 

MySQLの生死確認

/usr/bin/mysqladmin -uusername -ppassword ping 2>/dev/null | grep alive|wc -l

 

MySQLが生きている(ログインと疎通が出来る)場合は1を返し、生きていない場合は0を返します。

 

現在接続しているMySQLクライアント数の取得

/usr/bin/mysqladmin -uusername -ppassword extended-status | grep 'Threads_connected'| awk '{print $4;}'

 

MySQLにログインし、Threads_connectedを取得します。awkスクリプトで取得したい値のみを抜き出しています。

 

現在設定しているMySQL最大同時接続数の取得

/usr/bin/mysqladmin -uusername -ppassword Variables | grep 'max_connections' | awk '{print $4;}'

 

MySQLにログインし、max_connectionsを取得します。awsスクリプトで取得したい値のみを抜き出しています。
接続しているクライアント数と組み合わせることで、Too Many Connectionになりそうかどうかが判断できます。

 

有効ドメイン数取得

ls -F /var/www/html | grep '/$' | sed -e 's/\///' | xargs dig +short | grep -cx $(/opt/aws/bin/ec2-metadata | grep 'public-ipv4: ' | sed -e 's/public-ipv4: //')

 

前提として、複数ドメインのサイトを1サーバで稼働させているとします。
ドキュメントルートは/var/ww/html下にあり、各サイトごとのディレクトリにはドメイン名を命名しているとします。

そうしたとき、上記コマンドで現在有効なドメインかどうかを判断させることが出来ます。

/var/www/html下のディレクトリ・ファイルを -F オプションをつけて表示、最後が「/」で終わる値(つまりディレクトリ)のみをsedで抜き出します。
次にそれらをdigで正引きし、IPアドレスを取得します。

正引き結果のうち、メタデータから取得した自分自身のパブリックIPと一致するディレクトリがいくつあるかをカウントします。
コマンドは$()で入れ子にすることが出来ますので、それを利用しています。

弱点としては、X-Forwarded-Forに対応していないので、CloudFrontなどがEC2の前段に配置されていた場合はカウントできない、ということです……。

 

終わりに

シェルスクリプトって、考えながら書いていると時間を忘れてしまいますね。
もっといろいろスクリプトで出来るように、勉強を続けて参りたいと思います。

それでは、お疲れさまでした。

 

-インフラ
-, ,

Copyright© すじこネット , 2019 - 2021 All Rights Reserved Powered by STINGER.