問題

EC2が、あるタイミングで大量のNetwork In / Network Packet Inがありサーバが落ちてしまった。

サーバが落ちた時間帯で/var/log/messageを確認したところ、以下のメッセージが

crond[16600]: PAM unable to dlopen(/lib64/security/pam_unix.so): /lib64/security/pam_unix.so: failed to map segment from shared object: Cannot allocate memory

ただ、Nginxのログを確認しても、F5アタックのような大量のアクセスによるものではなく、何か特定の重い処理(ファイルアップロードなど)によるものと推察した。が、それが具体的になんなのかが、現時点では情報不足で判断がつかない。

解決策

VPC Flow Logを作成し、入力時のパケットのボリュームを含め監視することとした。

CloudWatchにロググループ作成

ClodWatchで監視を行うので、先にロググループを適当な名称で ここからつくっておく。(後でフローログの作成時に使う)

権限を持ったIAMロール作成

IAMロールの作り方はこちらを参照。https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs-cwl.html#flow-logs-iam-role

ざっくりいうと

  1. ポリシーの作成
  2. ポリシーが付与されたロールの作成
フローログ作成

IAMロールを作成したら、VPCのコンソールに移動して、お使いのVPC から 当該VPCをチェック => 右クリックでフローログを作成

名前・フィルタ(私はすべてを選択)・最大集約間隔(10分間を選択)・送信先(CloudWatch Logsを選択)を順次入力し、あらかじめ作成しておいたロググループあらかじめ作成しておいたIAMロールを選択。

ログレコードは「AWSのデフォルト形式」を選択。

CloudWatchのロググループに移動して、確認すると無事ログが取得できていた。

flow-log.png

これで、メモリ不足の原因を追いたいと思う。