AWSリソースのタグ管理が便利すぎた

こんにちは!開発Sec.リーダーの竹村です。

AWS使ってますか?!当社は使っています!

カンタンにインフラ環境を作ることができて便利なサービスですよね。

入社してから使い始めたAWS、最初の頃は恐る恐る触っていたものです。

最近はすっかり気軽に試すようになってきました。

さくっとWEBページを公開できた時などに、いやー便利便利。

と思っていた初夏の昼下がり、そこで事件は起きたのでした・・・

この記事の対象読者

  • AWSを少し触ったことのある方
  • リソースが散らかってそろそろ気になってきた方
  • Amazon ECSのサービスを少しご存知の方

突然跳ね上がったAWS料金

以下はリソースコストのグラフです。

たくさんリソースを使うと、ときどきグラフが高くなります。

それは分かっているのですが、ある日平均値よりも大きな山の繋がりを発見しました。

詳細を追うと、緑のカタマリに付随するリソースコストが上がっている事がわかりました。

緑色と紫色のやつ🤔

ネットオンで発生した課題

お金がかかっているリソースを特定したから、あとはそのリソースを対処するだけだね。

と思ったのですが、残念ながら犯人特定は簡単ではありませんでした。

グラフより「EC2その他」と「Elastic Container Service」(ECSといいます)がコスト増大の原因だということは分かったのですが、「ECSの中の誰だ!」というところまで深追いできなかったのです。

ECSをざっくりいうと、勝手に複数台の仮想コンピューター(コンテナといいます)がいい感じに動いてくれて、それをまとめて管理ができるサービスです。

当社はECSを使って、複数のテスト環境を構築していたため、どのテスト環境のコストが上がっているというところまで特定できず、露頭に迷ってしまったのでした。

コスト配分タグとは

AWSにはリソースごとに「タグ」を任意で付けることができます。ラベルみたいなものです。

そのタグを分類して、「どのタグにこれだけの費用がかかっているよ」

そんな事を分析出来るようになる機能「コスト配分タグ」が存在します。

今回はECSの環境ごとに”env”というタグをつけて、どの環境のコストが上がっているのかを確認できるようにしたいと思います。

リソースにタグを付ける

ECS配下で動くコンテナに対して、envタグを付けなければなりません。

これは少し厄介で、ECSの親側(サービス側)でタグを伝播させる設定をONにします。

伝播元はサービスかタスク定義を選択することができます。

今回はタスク定義より伝播させたいと思います。

こうすることで、実行されるコンテナのタグに、タスク定義に指定しているタグが実行されるコンテナ(タスク)に伝播されるようになります。

例として、タスク定義側のタグに「env:XXXX」とつけます。

すると、タスク定義から作るタスク(コンテナ)にも「env:XXXX」が付与される。そんな感じです。

タスク定義
タスク

このように「タスク定義」>「タスク」と、envが伝播されるようになりました。

コスト分配タグを有効化

タグを作ったら、コスト分配タグを有効化します。

この作業は支払いアカウントでのみ有効化できるのでご注意ください。

「env」というタグをアクティブにします。

コスト分配タグ

これで費用内訳をタグで内訳ができるようになりました。

ちなみに、ECSだけの費用を考える場合、envタグを無理に付けるのではなくAWS管理タグである「aws:ecs:serviceName」「aws:ecs:clusterName」をコスト分配タグとして有効化すれば、クラスターごとの費用分析ができます。

タグが付いていないリソースを検出できるようにする

これで環境ごとにECSのコストが分かるようになりました。

しかし人は過ちを犯すもの。タグを設定し忘れると、せっかくのコスト分配タグが意味をなしません。

そこで役に立つのがAWS Configというサービスになります。

このサービスはAWSリソースに対するルールを決め、そのルールに違反しているリソースを見つけると、アラートを出してくれるサービスです。

またルールに従ってリソースの修正も自動的に行ってくれたりもしてくれます。

さまざまなルールが提供されており、自身でルールを作ることもできます。

 ※利用には僅かですが費用がかかります。

今回は指定のタグが付いているかどうかをチェックするマネージドルールrequired-tagsを使います。

早速ルールを作ってみましょう。

ECS関連のサービス群に特定のタグ「env」が付与されていることをルールにしました。

これで、このルールに反しているリソースが検出されるようになります。

便利ですね。

とはいえサポートされているリソースタイプが限られていることや、NatGatewayのように置いておくだけでお金がかかるリソースに対し、複数のリソースがそれを利用している時など、タグだけでは分析しずらいのかなという悩みもあります。

これらの対応方法はまたいつか考えたいと思っています。

タグ付の一括管理で野良リソースを見つける

次に野良リソースです。野良リソースとは、目的もなくお金を消費しているAWSのリソースです。

よくわからないままGUIをポチポチしているといつの間にか生まれ、お金を消費していく厄介なやつです。

envタグを検出するルールができ、ルールに違反しているリソースを検出できるようになりました。

ご覧の通り、たくさんのアラートが出ています・・・タグ付けをサボりすぎました・・・

これらは本当に必要な環境、プロジェクトに属して動いているのでしょうか・・・不明です。

これら一つ一つに対して用途を確認して、地道にタグ付けするのはかなり骨が折れます。

そこで登場するのが、タグエディタです。

以下の画面のようにリソース検索を行って、リソースに対して一気にタグの管理ができます。

タグエディタを使って、タグが不足しているリソースに対してタグ付けを行っていきます。

この時、目的が分からない、タグに適切な環境の印がついていないリソースがいたら・・・

それはきっと野良リソースです。適切に措置していきましょう。

タグポリシー

envに値を入れる時、大文字小文字のブレだったり、タイポが心配ですよね。

そんなときはAWS Organizationsのタグポリシー機能を有効化すると幸せです。

大文字と小文字のブレを強制的に修正したりできます。

AWS Configと組み合わせて使うことでより効果的ですね。

当社ではまだ有効化していませんが、タイミングを見計らって採用したいなと思います。

まとめ

いかがでしたでしょうか。

タグポリシーでも触れましたが、AWS Organizationsを使えば費用をアカウントごとに分類することもできますので、タグ付けによる分配戦略が唯一の正解というわけではありません。

ですがタグをうまく活用することで、プロジェクト単位やチーム単位で費用を分配したり、リソース管理が楽になったりしそうだなと、そんな印象を持っていただけたなら嬉しいです。

最後に

ネットオンでは一緒に働くメンバーを絶賛募集中です!

この記事に少しでも興味をもっていただけたら、他の記事も読んでみて当社の雰囲気を感じ取っていただけると幸いです。

それでは