Amazon Web Services ブログ
AWS Resource Explorer と AWS CloudTrail を使用して、AWS リソースへの一貫したタグ付けを行う
組織の目的に応じたリソースタグを一貫して適用することは、簡単ではないケースがあります。例えば、正確な原価配分や細かなアクセス制御などを行いたい時です。また、開発者が開発やテストの初期段階で作成した別環境のリソースをクリーンアップする時に、問題に直面することもあるでしょう。適切なタグ付けがされていないと、組織から離れた開発者が作成したお試しリソースを特定したり、プロジェクトが終了した際にリソースをクリーンアップするのが難しくなります。
AWSリソースへのタグ付けは、ワークロード開発の初期段階で見落とされがちです。開発者にタグ付与ルールを守らせるのに苦労するユーザーもいます。AWS リソースに対して正確で意味のあるタグを一貫して付けることこそが、ベストプラクティスです。
AWS Organizations の全機能を有効にしているユーザーに人気の方法の1つは、すべてのリソースに特定のタグを付けることを要求するサービス制御ポリシー (SCP) を作成し、タグポリシーを使ってリソースに有効なタグが付けられるようにすることです。AWS Organizations は複数の AWS アカウントの管理をポリシーベースで行え、AWS リソースのスケーリングに伴う環境を一元管理できます。
あるいは、企業が現在 AWS Organizations を使用していないか、より柔軟なソリューションが必要な場合は、AWS Resource Explorer と AWS CloudTrail を使って適切なタグが自動的に付けられるようにできます。このブログで説明するソリューションでは、AWS リソースに適切なタグが非同期的に付けられるよう自動化する方法が示されています。これにより、AWS リソースをカテゴリ分けして追跡し、変動するコストを制御・監視できるようになります。
ソリューションの概要
自動タグ付けソリューション(resource-autotagger)は、自動化されたワークフローを使用して、新しく作成されたリソースに必要なタグを適用します。このソリューションでは、AWS Resource Explorer と AWS CloudTrail の 2 つのコアサービスを利用しています。Amazon CloudWatch Events で作成されたルールにより、タグ付けプロセスがスケジュールされます。AWS Lambda 関数と Amazon DynamoDB テーブルは、タグ付けされていないリソースを対応する CloudTrail 作成イベントにマッピングするために動作しています。
前提条件
このソリューションでは、自動タグ付けに AWS Resource Explorer と AWS CloudTrail を利用しています。そのため、これらのサービスをアカウントで有効にする必要があります。ソリューションを展開する前に、次の 2 つのアクションを完了する必要があります。
・Resource Explorer のインデックス作成を有効にする
・CloudTrail を有効にし、証跡がない場合は作成する
図1: 自動タグ付けソリューション(resource-autotagger)のワークフロー
ソリューションフロー
ソリューションの動作フローは次のとおりです。
1 Amazon EventBridge スケジューラルールは、新しいリソースが作成されたかどうかを検出するために30分ごとに実行されるように設定されています。
2 スケジューラルールはLambda関数をトリガーします。
3 Lambda関数は、Amazon S3バケットに保存されたマッピングファイルをスキャンして、リソースタイプのリストとそのマッピングされたCloudTrailのイベント名とイベントソースを取得します。このデモでは、リソースタイプの一覧には、Amazon EC2、S3バケット、Lambda、Amazon ECS が含まれています。
4 マッピングファイルからのすべてのリソースタイプについて、Lambda関数はAWS Resource Explorerを使用して、適切なタグ付けがされていないリソースを検索します。
5 Resource Explorerから返されたリソース識別子ごとに、Lambda関数はステップ4のマッピングファイルを使用して、リソース識別子、CloudTrailイベントソース、CloudTrailイベント名を使用してCloudTrailイベントを参照し、リソースを作成したプリンシパル情報を見つけます。
6 Lambda関数はCloudTrailイベントから作成されたリソースのプリンシパル情報に基づいてタグリストを生成し、リソースグループタグ付けAPIを呼び出してリソースに自動的にタグを付けます。
ソリューションのデプロイ
今回初めて AWS Cloud Development Kit (CDK) を利用する場合は、CDKのインストールを行う必要があります。
アプリケーションをローカルマシンにクローンします。
git clone https://github.com/aws-samples/resource-autotagger.git
プロジェクトディレクトリに移動します。
cd resource-autotagger
AWS Cloud Development Kit (AWS CDK) と Lambda 関数のノード依存関係をインストールします。
npm install
AWS アカウントで AWS CDK がまだセットアップされていない場合は、以下のコマンドを実行してブートストラップします。
cdk bootstrap
AWS CDK でソリューションリソースをデプロイします。
cdk deploy
ソリューションをデプロイした後、数分以内に「Created by」や「IAM Role name」などのユーザー識別タグがリソースに適用されていることがわかります。
他の AWS サービスへのソリューションの拡張
このデモソリューションでは、S3バケット内のマッピングファイルに格納されたマッピング情報に基づいて、Amazon EC2、S3バケット、Lambda、Amazon ECSのリソースに自動的にタグを付けることをカバーしています。このソリューションを他のAWSサービスに拡張するには、マッピングファイルを追加のリソースタイプとそれに対応するCloudTrailのイベント名、イベントソース、およびリソースエクスプローラーのリソースタイプ値で更新する必要があります。
追加のリソースタイプにタグを付けるために必要なAWS IAMの許可は、AWS Lambdaの実行ポリシーに追加する必要があることに注意してください。
例)Amazon API Gatewayリソースの作成タグ付けを追加する手順は次のとおりです。
1. API Gateway REST APIの作成とAPI Gateway REST APIクエリのCloudTrailイベント名、CloudTrailイベントソース、およびリソースエクスプローラーのリソースタイプを特定します。この情報はステップ2とステップ3でマッピングファイルを更新するために必要になります。Amazon API Gatewayの場合、CloudTrailの作成イベント名は “CreateRestApi“、イベントソースは “amazonaws.com”、リソースエクスプローラーのリソースタイプは “apigateway:restapis” です。
2. Amazon S3コンソールに移動し、”resourceautotagcdkstack-resourceautotagbucket” で始まるS3バケット名を開きます。このバケットには “json” という名前のJSONファイルが含まれています。
3. ステップ1で特定した値を使用して、JSONファイルを次のJSONの構造で更新し、バケットにアップロードします。Globalプロパティは、グローバルに一意のリソース(S3バケットなど)にのみ適用されることに注意してください。”CT”で始まるプロパティはCloudTrailのプロパティを指し、”RE”はリソースエクスプローラーのプロパティを指します。
{
"CTEventName": "CreateRestApi",
"CTEventSource": "apigateway.amazonaws.com",
"REResourceType": "apigateway:restapis",
"Global": false
}
4. IAM コンソールに移動します。左側のナビゲーションで [ロール] をクリックし、AWS CDK デプロイメントから作成された Lambda 実行用の IAM ロールを検索します。ロール名は ResourceAutoTagCdkStack- で始まります。
5. 許可ポリシーから[許可を追加] をクリックしてから [インラインポリシーを作成] をクリックします。[ポリシーエディタ] 画面でJSONを選択し、次のコードブロックに示されている IAM ステートメントを追加して、Lambda 関数が REST API にタグを追加できるようにします。<region> は、デプロイ先のリージョンに置き換えてください。
{
"Sid": "ResourceAutoTaggerAPIGatewayTagging",
"Effect": "Allow",
"Action": ["apigateway:POST","apigateway:PUT","apigateway:PATCH"],
"Resource": "arn:aws:apigateway:<region>::/*/*"
}
図2:権限を追加した後のサンプルLambda関数の実行ポリシー
6. 次へをクリックして変更を保存します。
クリーンアップ
自動タグ付け機能をテストした後の課金を避けるために、次のコマンドを実行して、クローンされたリポジトリのルートディレクトリから AWD CDK スタックを削除してください。
cdk destroy
考慮事項
AWS リソースエクスプローラーには、1か月あたり10,000回の検索操作の制限があり、1回のクエリで最大1,000件の結果を返すことができます。これにより、アカウントごとに月間最大10,000,000の AWS リソースにタグを付けることができます。
さらに、AWS リソースには、リソースごとに最大50個のタグを付けることができます。このソリューションでは、既に50個のタグが付いているリソースには指定したタグを追加できません。
現在のソリューションは1つの AWS アカウントに限定されており、複数のアカウントにまたがってタグを付けることはできません。
まとめ
このブログでは、AWS リソースエクスプローラーと Amazon CloudTrail を組み合わせて、リソースのタグ付けを自動化する方法を示しました。このソリューションは、既存のワークロードに影響を与えずに、必要なタグを AWS リソースに適用する柔軟で、カスタマイズ可能な代替方法です。サービスコントロールポリシーを有効にする必要はなく、バックグラウンドで非同期に実行されるため、AWS リソースにタグが付けられます。
関連リソース
AWSリソースタグ付けの準備、方法と有効なAWSサービス
AWS コスト配分タグの使用
属性ベースのアクセス制御 (ABAC) を使用した細かいアクセス制御
AWS リソースのタグ付けのベストプラクティス
翻訳はソリューションアーキテクトの柳 嘉起が担当しました。原文はこちらです。
著者について
Nikhil Enmudi
Nikhilは AWS のシニアソリューションアーキテクトであり、サーバーレスソリューションにスペシャリティを持っています。彼は、グローバルな独立系ソフトウェアベンダー (ISV) 顧客のクラウド移行を支援し、ソフトウェア製品向けのソリューション構築を支援しています。
Yohan Supangat
Yohanは AWS のソリューションアーキテクトであり、サーバーレスソリューションにスペシャリティを持っています。彼は、エンタープライズの新規顧客と協力し、AWS のテクノロジーとサービスの採用を支援し、ビジネス目標の達成を支援しています。