EC2インスタンスのメモリ使用量がとれない!ってときは

AWSでサーバーを運用しているとデフォルトでCPU使用量などが把握できるので、細かい監視まで必要としないサービスを運用しているときは非常に助かりますよね。 ただなぜかこのデフォルトのCloudWatchではメモリ使用量が取れない…

AWSのドキュメントにはこれこれこういうふうにやるととれますよーってのが書いてあります。

docs.aws.amazon.com

上記リンクを参考にすればそんなには難しくありません。 ほとんどコピペでやっていけば問題ないはずです。

ただ、「値の取得」ってのが目標だとある日突然値が取れなくなることがあります(ちゃんとやってる人は取れます…)

特にAutoScalingを利用して運用して、インスタンスのLunch、Terminateが頻繁に起こっているのであればこの現象が起こるかもしれません。 これも実は上記ドキュメントの最下部に記載があるのですが

CloudWatchClient.pm モジュールは、インスタンスメタデータをローカルでキャッシュします。モニタリングスクリプトを実行しているインスタンスから AMI を作成すると、キャッシュ TTL (デフォルト: 6 時間、Auto Scaling グループでは 24 時間) 以内にこの AMI から起動したすべてのインスタンスは、元のインスタンスインスタンス ID を使用してメトリクスを出力します。キャッシュ TTL 期間が経過した後は、スクリプトは新しいデータを取得し、モニタリングスクリプトは現在のインスタンスインスタンス ID を使用します。これをすぐに修正するには、次のコマンドを使用してキャッシュされたデータを削除します。

ということだそうです。つまりインスタンスIDをキャッシュしていて、キャッシュの値と現在のインスタンスIDが違うと値が取れなくなってしまうみたいです。 それでそういう場合はどうしたらいいのかってのまで記載があります。下記のコマンドを実行すればそれで終わりです。 キャッシュのinstance-idファイルを削除で完了です。

とまあここまではドキュメント通りの内容です。 それで私が困ったのは

「せっかくAutoScaling使ってるのに起動する度にこのコマンド実行するんかいな…」

ということでまあサーバー・AWSに詳しい人ならそんなアホな…ということですが私は思ってしまいました…それでサポートに問い合わせたところ

常にメモリ使用量を取得するための運用ですが、「ユーザーデータ」を使用してインスタンス起動時にキャッシュファイルを削除していただくのが有効かと存じます。「ユーザーデータ」は AutoScaling の起動設定を登録する際に、起動設定に紐づけることのできるシェルスクリプトで、インスタンス起動時に自動的にこのスクリプトが実行されます。

ということでこの「ユーザーデータ」ってところで上記コマンドを実行すればOK。ドキュメントはここ。 docs.aws.amazon.com

EC2インスタンス起動時でも起動設定作成時でも「3.詳細設定」というところがあって、ここに「高度な設定」を選択すると「ユーザーデータ」があります。 そこでテキストを選択して、シェルとかわかんないよって人は下記のスクリプトを突っ込んでおきましょう

まあさっきのコマンドを実行しているだけですね笑 これだけでインスタンス作成時に上記コマンドを発行してくれて、インスタンスIDのキャッシュファイルを削除してくれます。 正直キャッシュファイルとかそういうのはうまくやってくれないかなぁとは思うものの、それではイメージというものではなくなってしまうということなのでしょうか。

AWSの知識とかまるでないまま最近はいろいろ触っているのですが、ドキュメントの充実(しかも日本語で!)に加えて、サポートの対応の速さ・的確さは素晴らしいなと感じています。 しかしながら今は色々聞いてしまっていますが、なるべくドキュメントを読み込んで、自分で解決できるようなりたいなと思っております。