🕌

AWS CDK でリソースタグを効率的に管理する方法

に公開

AWS CDK(Cloud Development Kit)を使ってインフラを構築していると、全てのリソースに統一的なタグを付けたい場面が時々発生します。タグは AWS リソースの管理、コスト配賦、アクセス制御など、様々な用途で重要な役割を果たします。

今回は、CDK の Tags.of() メソッドを使って、効率的にリソースタグを管理する方法を紹介します。

なぜタグが重要なのか

AWS リソースにタグを付けることで、コスト管理が格段に楽になります。タグ別にコストを分析・配賦できるため、どのプロジェクトにどれくらいの費用がかかっているかを調べやすくなります。

さらに、リソース管理の面でも威力を発揮します。環境別、チーム別、プロジェクト別にリソースを整理できるため、大規模なシステムでも混乱することがありません。アクセス制御においても、タグベースで IAM ポリシーを設定すれば、きめ細かな権限管理が実現できます。

従来の方法の課題

CDK を使い始めた頃は、個別のリソースにタグを設定していました。

// 従来の方法:個別にタグを設定
const bucket = new s3.Bucket(this, 'MyBucket', {
  // バケットの設定...
});
bucket.node.addMetadata('tags', { Environment: 'production', Team: 'backend' });

const lambda = new lambda.Function(this, 'MyFunction', {
  // Lambda関数の設定...
});
lambda.node.addMetadata('tags', { Environment: 'production', Team: 'backend' });

この方法には問題がありました。全てのリソースに個別設定が必要で、タグの一貫性を保つのが困難だったのです。しかも、タグの変更時には全箇所を修正する必要があります。

Tags.of() を使った効率的な方法

CDK には Tags.of() という便利なメソッドがあります。これを使うことで、スタック内の全リソースに一括でタグを適用できます。

基本的な使い方

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class MyStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // スタック内の全リソースにタグを適用
    cdk.Tags.of(this).add('Environment', 'production');
    cdk.Tags.of(this).add('Team', 'backend');
    cdk.Tags.of(this).add('Project', 'my-awesome-app');

    // ここで作成される全てのリソースに上記のタグが自動適用される
    const bucket = new s3.Bucket(this, 'MyBucket');
    const lambda = new lambda.Function(this, 'MyFunction', {
      // 設定...
    });
  }
}

アプリケーションレベルでのタグ設定

スタックレベルだけでなく、アプリケーションレベルでもタグを設定できます。

// app.ts
import * as cdk from 'aws-cdk-lib';
import { MyStack } from './my-stack';

const app = new cdk.App();

// 全てのスタックに共通のタグを適用
cdk.Tags.of(app).add('Organization', 'MyCompany');
cdk.Tags.of(app).add('CostCenter', 'Engineering');

const stack = new MyStack(app, 'MyStack');

// 特定のスタックにのみ適用するタグ
cdk.Tags.of(stack).add('Environment', 'production');

環境別の設定

環境ごとに異なるタグを設定したい場合は、以下のようなやり方もできます。

interface EnvironmentConfig {
  environment: string;
  team: string;
  backupRequired: boolean;
}

export class MyStack extends cdk.Stack {
  constructor(scope: Construct, id: string, config: EnvironmentConfig, props?: cdk.StackProps) {
    super(scope, id, props);

    // 環境に応じたタグ設定
    cdk.Tags.of(this).add('Environment', config.environment);
    cdk.Tags.of(this).add('Team', config.team);
    cdk.Tags.of(this).add('BackupRequired', config.backupRequired.toString());
    
    // 環境固有の設定
    if (config.environment === 'production') {
      cdk.Tags.of(this).add('Monitoring', 'enabled');
      cdk.Tags.of(this).add('AlertLevel', 'high');
    }
  }
}

// 使用例
const prodConfig: EnvironmentConfig = {
  environment: 'production',
  team: 'platform',
  backupRequired: true
};

new MyStack(app, 'ProdStack', prodConfig);

タグの優先順位

CDK では、タグの優先順位を設定できます。これは複数の場所で同じキーのタグが定義された場合に重要になります。

// 高い優先度でタグを設定
cdk.Tags.of(this).add('Environment', 'production', { priority: 300 });

// 通常の優先度(デフォルト: 100)
cdk.Tags.of(this).add('Environment', 'development');

// 結果: 'production' が適用される(優先度が高いため)

まとめ

Tags.of() メソッドを使うことで、CDK プロジェクトのタグ管理が劇的に改善されます。一度の設定で全リソースにタグを適用できるため、効率が格段に向上するでしょう。タグの統一性を簡単に保てるのも大きなメリットといえます。

タグの変更も容易になり、保守性が向上します。しかも、スタック、アプリケーション、個別リソースレベルで設定できる柔軟性も備えています。

CDK を使ったインフラ管理において、タグの適切な設定は運用の効率化に大きく貢献するはずです。ぜひ Tags.of() を活用して、効率的なリソース管理を実現してください。

参考記事

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/tagging.html

デジタルキューブ

Discussion