Open6
インフラメモ
インフラ関連のメモ書き.
目次
MySQL
AWS
mysqltuner で MySQL の設定を見直す
mysqltuner を使うと mysql の状態をいろいろとチェックして,変更したほうが良い設定などを教えてくれる.
ubuntu では,
apt-get install mysqltuner
でインストール可能.
mysqlhost=hostname
mysqluser=username
mysqlpass=password
mysqltuner_result=/tmp/mysqltuner$(date +%Y%m%d_%H%M%S).txt
mysqltuner_memory=4096
mysqltuner --host ${mysqlhost} --user ${mysqluser} --pass ${mysqlpass} --buffers --dbstat --idxstat --sysstat --pfstat --forcemem ${mysqltuner_memory} --outputfile ${mysqltuner_result}
のようにして実行する.
実行結果はたくさん出力される(私の環境では 300KB ぐらい)ので,気になっているキーワードで grep をかけたり,最後の数十行にまとめて出力される推奨事項を読んだりすると良さそう.
MySQL の connection まわりの設定はデフォルトで使ってはいけない!
開発用に運用していた MySQL インスタンスで,クライアントからのコネクションが張れない(タイムアウトする)現象が多発していた.
原因としては, wait_timeout
をデフォルト(8時間!)のまま運用しており,古いコネクションが残り続けていた.
調査
mysqltuner を実行すると下記のような出力を得た.
[!!] Highest connection usage: 100% (152/151)
[OK] Aborted connections: 1.46% (170/11610)
max_connection はデフォルトの 151 だが,アクティブな開発メンバーが 3 人ぐらいしかいない状況でこの数のコネクションが枯渇するとは考えにくい.
そこで,コネクションのタイムアウトを見直すと,デフォルトの 8 時間になっていた.
my.cnf に
max_connections=512
wait_timeout=60
interactive_timeout=60
を追記して解決.
現在のコネクション数を確認するには,
show status like 'Threads_connected';
show processlist;
などを使う.
ECS の環境変数に Secrets Manager の値をセットする
API Gateway におけるクライアント IP の取り扱い
- IP 制限をかけたい場合は resource policy を書く
- バックエンドの lambda (node) でクライアントの IP を使いたい場合は、
context.requestContext.sourceIp
で IP を取得- この IP は API Gateway エンドポイントへの TCP コネクションから取得される IP
-
X-Forwarded-For
ヘッダによらない
-
- API Gateway mapping template and access logging variable reference
- この IP は API Gateway エンドポイントへの TCP コネクションから取得される IP
lambda 側で sourceIp
を判定するやり方では X-Forwarded-For
ヘッダの偽装により突破されそうだと思っていたけど、TCP コネクションから IP をとっているので大丈夫かも。
CloudFront でビューワの IP を取得
CloudFront でビューワの IP をとりたい場合は、 lambda@edge および CloudFront Functions で取得可能。
- lambda@edge
- ビューワリクエスト・オリジンリクエストの
Records.cf.request.clientIp
でクライアント IP を取得可能- 「ビューワーが HTTP プロキシまたはロードバランサーを使用してリクエストを送った場合、この値はプロキシまたはロードバランサーの IP アドレスです。」とあるので、おそらく X-Forwarded-For ヘッダの影響を受けない TCP コネクションの IP を返しているのだとおもう
- Lambda@Edge イベント構造
- ビューワリクエスト・オリジンリクエストの
- CloudFront Functions
- Lambda@edge と同様に、
viewer.ip
フィールドからクライアント IP を取得可能 - 「ビューワーリクエストが HTTP プロキシまたはロードバランサーを通して来た場合、値はプロキシまたはロードバランサーの IP アドレスです。」とのこと
- CloudFront Functions のイベント構造
- Lambda@edge と同様に、