IT

【aws】Route53のタグを効率的に取得する方法

はじめに

AWSのRoute53でHostZoneにタグを付与しているかを確認することは、リソース管理や課金の観点から重要です。
しかし、AWSコンソールでの確認は手間がかかることがあります。
この記事では、AWS CLIを使用してRoute53のタグを効率的に取得する方法を紹介します。

基本的なコマンドライン

ホストゾーンのタグを取得する場合

aws route53 list-tags-for-resource --resource-type hostedzone --resource-id {hosted-zone-id}

このコマンドは、指定されたホストゾーンIDに関連付けられたすべてのタグを返します。

ドメイン登録のタグを取得する場合

aws route53domains list-tags-for-domain --domain-name {domain-name}

このコマンドは、指定されたドメイン名に関連付けられたすべてのタグを返します。

ヘルスチェックのタグを取得する場合

aws route53 list-tags-for-resource --resource-type healthcheck --resource-id {health-check-id}

このコマンドは、指定されたヘルスチェックIDに関連付けられたすべてのタグを返します。

全てのホストゾーンを対象にする場合

アカウントに存在する全てのホストゾーンのタグを取得する場合、以下のBashスクリプトを使用すると便利です。

#!/bin/bash

# すべてのホストゾーンを取得
hosted_zones=$(aws route53 list-hosted-zones --query 'HostedZones[*].Id' --output text)

# 各ホストゾーンのタグを取得
for zone in $hosted_zones
do
    zone_id=${zone#/hostedzone/}
    echo "Hosted Zone: $zone_id"
    aws route53 list-tags-for-resource --resource-type hostedzone --resource-id $zone_id
    echo "------------------------"
done

このスクリプトを実行すると、以下のような形式で結果が表示されます。

Hosted Zone: HOGEHOGE
{
    "ResourceTagSet": {
        "ResourceType": "hostedzone",
        "ResourceId": "HOGEHOGEHOGE",
        "Tags": [
            {
                "Key": "Project",
                "Value": "service1"
            },
            {
                "Key": "Name",
                "Value": "hogehoge.net"
            }
        ]
    }
}
------------------------

取得したデータを整形するPythonスクリプト

取得したデータをExcel等で利用しやすくするために、以下のPythonスクリプトを使用して整形できます。

import json
import csv
import re

def process_file(file_path):
    with open(file_path, 'r') as file:
        content = file.read()

    # ホストゾーンとJSONデータのブロックを分割
    blocks = re.split(r'-+\n', content)

    data = []
    for block in blocks:
        if block.strip():
            # ホストゾーン名を抽出
            hosted_zone_match = re.match(r'Hosted Zone: (.+)', block)
            if hosted_zone_match:
                hosted_zone = hosted_zone_match.group(1)

                # JSONデータを抽出して解析
                json_data = re.search(r'\{.*\}', block, re.DOTALL)
                if json_data:
                    json_obj = json.loads(json_data.group())
                    resource_id = json_obj['ResourceTagSet']['ResourceId']
                    tags = {tag['Key']: tag['Value'] for tag in json_obj['ResourceTagSet']['Tags']}

                    data.append({
                        'Hosted Zone': hosted_zone,
                        'ResourceId': resource_id,
                        'Project': tags.get('Project', ''),
                        'Name': tags.get('Name', '')
                    })

    return data

def write_csv(data, output_file):
    with open(output_file, 'w', newline='') as csvfile:
        fieldnames = ['Hosted Zone', 'ResourceId', 'Project', 'Name']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

        writer.writeheader()
        for row in data:
            writer.writerow(row)

# メイン処理
input_file = 'input.txt'  # 入力ファイル名
output_file = 'output.csv'  # 出力ファイル名

processed_data = process_file(input_file)
write_csv(processed_data, output_file)

print(f"変換が完了しました。結果は {output_file} に保存されています。")

このスクリプトを実行すると、以下のようなCSVファイルが生成されます。

Hosted Zone,ResourceId,Project,Name
HOGEHOGE,HOGEHOGEHOGE,service1,hoge.net

代替手段:Resource Groups & Tag Editor

AWS CLIを使用する方法以外に、AWSコンソールの"Resource Groups & Tag Editor"機能を使用してタグを管理することもできます。

この機能は、複数のAWSサービスにまたがるリソースのタグを一括で管理するのに便利です。

詳細については、公式ドキュメント:タグエディタ とはをご覧ください。

まとめ

この記事では、AWS CLIを使用してRoute53のタグを効率的に取得する方法を紹介しました。
基本的なコマンドラインの使用方法から、全てのホストゾーンのタグを取得するスクリプト、さらにはデータを整形するPythonスクリプトまで、様々なアプローチを説明しました。

これらの方法を活用することで、大規模な環境でもRoute53のリソースを効率的に管理できます。
タグ情報は、コスト配分、アクセス制御、運用管理など、様々な目的で活用できるため、定期的に確認し、適切に管理することをお勧めします。

最後に、AWSの機能は頻繁に更新されるため、最新の情報については常にAWS公式ドキュメントを参照することをお勧めします。

以上、どなたかのお役に立てば幸いです。

  • この記事を書いた人

緑川縁

ニートからシステムエンジニアになった人
クラウド案件をメインにやっています。
保持資格:CCNA,AWS SAA&SAP,秘書検定2級
趣味でボカロ曲作り始めました。

-IT
-,