BillingやらIAMやらは最初から調べる機会が多かったので、タグ設計の重要性について早いところまとめておきたいと思っていた。ちょうど素晴らしい記事があったので、自分なんかが下手に書くよりよっぽど良いと思い、翻訳に挑戦してみた。
元ネタはこれ↓。本当によくまとまっていて素晴らしい。誤った解釈があってもご容赦願いたい。(以下は元ネタを翻訳しようとしただけ)
Managing Resources across Multiple Environments in AWS
スタートアップビジネスにおいて素晴らしいアプリケーションを構築するには、本番、開発、 QA 、およびステージング環境など複数の環境が必要である。とりわけビジネスが時間の経過とともに成長した場合、複数環境上のリソースを追跡、管理することには困難を伴う。
スタートアップの成長に伴い、開発者達が予想以上にリソースを追加した場合、どのリソースがどの環境に属するものか判別する必要に迫られる。
QA環境に何台のインスタンスが利用されているのか?誰が本番環境を起動する権限を持っているのか?開発環境の利用料金はいくらか?スタートアップの成長に伴い、この種の質問に対する答えが必要となるだろう。
複数環境をセットアップするだけでなく、追跡、管理、および環境間リソースのアクセスを制御しながら、AWSを利用することが可能である。活用可能ないくつかのAWS機能を見ていくことにしよう。
Tags
複数の環境間で(さらに複数のAWSアカウント間でも)AWSリソースを識別、追跡、管理するためにタグを利用することができる。タグは、KeyとValueで構成されたラベルである。多くのAWSリソースにタグを付与することができ、リソースごとに10のタグを追加可能である。
タグを使用することには様々な利点があるので、付与可能なリソースには全てタグを付けることが望ましい。例えば、以下の目的でタグを利用することができる。
- リソースを判別、整理する
- リソースへのアクセスを制御する
- 詳細請求レポートを参照する
リソースにタグ付けすることにより活用可能なAWSの機能を以下に紹介していく。
Resource Groups
リソースグループは、共通のタグを持つリソースのコレクションを作成、表示、および管理することができるAWS Management Consoleの素晴らしい新機能である。また、異なるタグが付与された環境の独自ビューを作成することも可能だ。例えば、タグ設定をサポートするすべてのサービスを横断して、Environment=Prodのタグを持ったすべてのリソースを参照することもできる。また、次のスクリーンショットに示すように、複数のタグを共有する全てのリソースを表示することも可能だ。
(画像は元ネタを参照してください)
詳細については、Working with Resource Groupsを参照のこと。
IAMでのタグ利用
特定のユーザーにProdタグを付与したサービスやリソースを触らせたくなかったとしたら?ユーザーまたはグループのアクセスを制御するために、IAMサービスでタグを利用することができる。例えば、あるIAMユーザーまたはグループが、特定のEC2インスタンスを、start、stop、reboot、terminateできるかを制御することが可能だ。このようにして、開発者達にEnvironment=Devでタグ付けされたインスタンスのみにアクセス権を与えることができる。
IAMリソースへのタグ付けをサポートするサービスの完全なリストについては、IAMをサポートするAWSサービスを参照のこと。
課金レポートでのタグ利用
ある環境にどれ程の費用が計上されているかを把握することはできないのか?AWSのコストを分類し、追跡するためにコスト割り当てタグを使用することができる。EC2やS3バケットなどのAWSリソースにタグを適用すると、 使用状況や利用料をタグで集計したCSVファイルとして、コスト割り当てレポートが生成される。複数のサービスに渡って費用を整理するために、コストセンター、アプリケーション名、または所有者などのビジネスカテゴリを表すタグを適用することが可能だ。
コスト割り当てレポートには、各請求期間のAWS費用がすべて含まれる。レポートにはタグ付きおよびタグなしの両方のリソースが含まれているので、はっきりとリソースの料金を整理することができる。例えば、あるアプリケーション名をタグ付けすれば、リソース上で動作する特定アプリケーションの総コストを追跡することが可能となる。
詳細については、毎月のコスト配分レポートの設定を参照のこと。
Tagのメンテナンス
リソースのタグ付けの利点を理解できたところで、タグ付け可能なリソース全てにタグが付けられていることを一体どのように確認すれば良いのだろうか?これを行うには、インスタンスに一括でタグを追加する等、AWS Management Consoleのいくつかの機能を利用することができる。次のスクリーンショットは、この種のタグ管理方法の1つである。
(画像は元ネタを参照してください)
しかし、新しいリソースが追加される度に、手動で更新をかけるのは少々手がかかる。以下に、これ以外の方法でリソースをタグ付けする方法を紹介する。
独自の起動スクリプトの作成
チームメンバーに彼らが必要とする環境を作成するためのスクリプトを提供することは、リソースに正しくタグ付けする為の素晴らしい方法だ。メンバー達は、素早く適切な方法で必要な環境を手にすることが可能となる。
すべてのAWSサービスはAPIを有している為、数多くの手法でスクリプトを作成することができる。AWSコマンドラインインタフェース( AWS CLI)を使用してシェルスクリプトを用意しても良いし、多種のSDKからプラットフォームで利用可能なものを選んでも良い。SDKの詳細については、Start Developing with Amazon Web Services を参照のこと。
GitHubのようなサイト上で利用可能な無数のスクリプトからコピーして利用してみることから始めてみるのも良いだろう。
CloudFormationテンプレートの利用
スクリプトと同様、テンプレートにより容易で再利用可能なAWSリソースの作成ツールをチームに提供する方法もある。Amazon EC2インスタンスやAmazon RDS DBインスタンス等の必要なすべてのAWSリソースを記述したテンプレートを作成し、 AWS CloudFormationによってそれらを準備、構成することができる。
タグ付け可能なほぼ全てのリソースに、CloudFormationテンプレートでタグ付けすることができる。複数環境用にテンプレートを用意しても良いし、条件文を用いて複数環境を構成可能な単一のテンプレートを用意しても良い。
Auto Scalingの利用
Auto Scalingサービスは、素晴らしいサービスだ。アプリケーションの需要増加に合わせてEC2インスタンスをスケールアウトし、不要となればスケールダウンし、応答不能となったインスタンスを置き換えることができる。
Auto Scalingされたインスタンスにもタグを使用することが可能だ。独自の実装をすることなく、Auto Scalingからスケールされたインスタンスは起動時に自動でタグ付けされる。
構成管理ツールの利用
chef、puppet、 SaltStack 、Ansible等の多くの構成管理ツールの多くは、リソース作成時のタグ付けをサポートしている。また、通常それらのツールは複数環境の為の条件による環境分離の機能を有している。これらのツールを利用すれば、簡単に作成されたリソースにタグ付けする手法を実装できる。
Tag付けされていないリソースの検索
タグの設定されていないリソースは無いか、リソースが正しくタグ付けされているか、定期的に検査した方が良い。適切な設定を維持する為、以下を確認して欲しい。
AWS Management Consoleの利用
AWS Management Consoleから、EC2インスタンス等のタグ付けされたリソースを表示することができる。ほとんどのリソースビューには、設定したタグを表示する列が用意されている。次のスクリーンショットに示すように、適切にタグ付けされていないリソースや、タグ付けされていないリソースを見つけることが可能だ。
(画像は元ネタを参照してください)
独自スクリプトの作成
前述の通り、AWSにはAPIが用意されている。APIを使用すれば、リソースの一覧を照会することができる。作成した一覧から、タグ付けされていない、または、適切にタグ付けされていないリソースを探すことができるだろう。
まとめ
タグを利用することにより、複数環境に渡ってリソースを追跡・管理し、それらのリソースへのアクセスを制御することができる。タグ設定をするには、いくつかの方法が用意されている。AWS Management Console、 CloudFormationテンプレート、または、独自のカスタムスクリプト等を使用することができる。いずれの方法を利用するにせよ、AWSリソースを管理するにはタグ設定を施すことが非常に重要であると言える。
同じような言い回しが多かったかも。少しでも読み易く工夫したつもりなのだけど…。慣れないことはするもんじゃないなあ。参考にしてもらえるAWSユーザがいたらとても嬉しい。