Amazon FSx ファイルシステムの容量超過を監視してみた

背景

ファイルシステムのストレージ容量は増加することのみ可能で、減らすことはできません。
最小容量のストレージで作成し、閾値に超えたらメール通知する仕組みを考えて、手順を残していきたいと思います。

前提条件

・検証用ファイルシステムが構築済みであること(OpenZFSの64 GiB)
・下記のAmazon SNSが作成されていること
①Cloudwatchアラーム連携用トピック
サブスクリプションにLambda関数(fsx-freespace-threshold-exceeded-kobayashi-test)を登録しておく

②メール通知用トピックしておく
サブスクリプションに通知用メールアドレスを登録しておく

手順

1.Cloudwatchアラームの作成

下記のAWS CLIでアラームを作成する

aws cloudwatch put-metric-alarm \
--alarm-name 'あなたのアラーム名' \
--actions-enabled \
--alarm-actions 'あなたのSNSトピックARN' \
--metric-name 'UsedStorageCapacity' \
--namespace 'AWS/FSx' \
--statistic 'Maximum' \
--dimensions '[{"Name":"FileSystemId","Value":"あなたのFSxファイルシステムID"}]' \
--period 60 \
--evaluation-periods 2 \
--datapoints-to-alarm 2 \
--threshold あなたの容量閾値(バイト) \
--comparison-operator 'GreaterThanOrEqualToThreshold' \
--treat-missing-data 'missing'

2.関数の作成(Python3.12)

Lambda関数ロール事前に作成しておく(作成手順を割愛します。)

Lambda関数のコードは以下の通りです。

import boto3
import json

# FSxクライアントを作成
fsx = boto3.client('fsx')

# 閾値を設定(例: 60GB)
THRESHOLD = 62 * 1024 * 1024 * 1024

def lambda_handler(event, context):
    print("event:")
    print(event)

    event_json_encoder = json.dumps(event)
    print("event_json_encoder:")
    print(event_json_encoder)

    # 監視するFSxファイルシステムID
    file_system_id = 'fs-0180f4134c6bc2b16'

    # ファイルシステムの情報を取得
    response = fsx.describe_file_systems(FileSystemIds=[file_system_id])
    print("response:")
    print(response)
    file_system = response['FileSystems'][0]

    # 容量を取得
    total_size_bytes = file_system['StorageCapacity'] * 1024 * 1024 * 1024  # GB to bytes
    print("total_size_bytes:" + str(total_size_bytes))
    # FileSystemTypeを取得
    file_system_type = file_system['FileSystemType']
    print("file_system_type:" + file_system_type)

    # 使用できるストレージ容量を取得
    # FSx for Windowsの場合、FreeStorageCapacity 使用できるストレージ容量。単位: バイト 有効な統計: Average、Minimum
    # https://docs.aws.amazon.com/ja_jp/fsx/latest/WindowsGuide/fsx-windows-metrics.html
    # FSx for OpenZFS CloudWatch metricsの場合は、UsedStorageCapacity 単位: バイト
    # https://docs.aws.amazon.com/ja_jp/fsx/latest/OpenZFSGuide/how_to_use_metrics.html

    # free_size_bytes = event.get('FreeStorageCapacity')
    # print("free_size_bytes:" + free_size_bytes)

    # Lambda関数のイベントJSON に直接UsedStorageCapacityを記載した場合のテスト用
    # used_size_bytes = event.get('UsedStorageCapacity')

    # SNSイベントを取得
    message_unicode = event['Records'][0]['Sns']['Message']
    print("message_unicode:")
    print(message_unicode)

    # 文字列から辞書型に変換
    message_dict = json.loads(message_unicode)
    print("message_dict:")
    print(message_dict)

    threshold = message_dict['Trigger']['Threshold']
    print("threshold:")
    print(threshold)

    # if file_system_type == "OPENZFS":
    #     used_size_bytes = int(used_size_bytes)
    # else :
    #     used_size_bytes = int(total_size_bytes) - int(free_size_bytes)

    # print("used_size_bytes:" + str(used_size_bytes))

    # 容量が閾値を超えた場合に通知
    if int(threshold) >= int(THRESHOLD):

        send_notification(int(threshold), int(total_size_bytes))

    return {
        'statusCode': 200,
        'body': json.dumps('Monitoring completed')
    }

def send_notification(used_size_bytes, total_size_bytes_bytes):
    # 通知のロジック(例: SNSを使って通知)
    sns = boto3.client('sns')
    topic_arn = 'arn:aws:sns:ap-northeast-1:538815528650:fsx-freespace-threshold-exceeded-kobayashi-test'

    message = f'FSx file system usage exceeded threshold: {used_size_bytes / (1024 * 1024 * 1024)} GB of {total_size_bytes_bytes / (1024 * 1024 * 1024)} GB used'
    sns.publish(TopicArn=topic_arn, Message=message)

3.Lambda関数の実行方法1

疑似的にアラームを発生させるCLIを実行する
コマンド:

aws cloudwatch set-alarm-state --alarm-name fsx-used-kobayashi-test-alarm --state-value ALARM --state-reason "test"

4.Lambda関数の実行方法2

Lambdaのテスト用イベントJSON を保存し、
コードタブの「Test」をクリックする。

テスト用イベントJSON

{
    "Records": [
        {
            "EventSource": "aws:sns",
            "EventVersion": "1.0",
            "EventSubscriptionArn": "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:fsx-used-kobayashi-test:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
            "Sns": {
                "Type": "Notification",
                "TopicArn": "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:fsx-used-kobayashi-test",
                "Subject": "ALARM: \"fsx-used-kobayashi-test-alarm\" in Asia Pacific (Tokyo)",
                "Message": "{\"AlarmName\":\"fsx-used-kobayashi-test-alarm\",\"AlarmDescription\":null,\"AWSAccountId\":\"xxxxxxxxxxxx\",\"AlarmConfigurationUpdatedTimestamp\":\"2024-07-13T12:12:13.632+0000\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"test\",\"StateChangeTime\":\"2024-07-14T02:30:38.711+0000\",\"Region\":\"Asia Pacific (Tokyo)\",\"AlarmArn\":\"arn:aws:cloudwatch:ap-northeast-1:xxxxxxxxxxxx:alarm:fsx-used-kobayashi-test-alarm\",\"OldStateValue\":\"OK\",\"OKActions\":[],\"AlarmActions\":[\"arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:fsx-used-kobayashi-test\"],\"InsufficientDataActions\":[],\"Trigger\":{\"MetricName\":\"UsedStorageCapacity\",\"Namespace\":\"AWS/FSx\",\"StatisticType\":\"Statistic\",\"Statistic\":\"MAXIMUM\",\"Unit\":null,\"Dimensions\":[{\"value\":\"fs-0180f4134c6bc2b16\",\"name\":\"FileSystemId\"}],\"Period\":60,\"EvaluationPeriods\":2,\"DatapointsToAlarm\":2,\"ComparisonOperator\":\"GreaterThanOrEqualToThreshold\",\"Threshold\":6.6571993088E10,\"TreatMissingData\":\"missing\",\"EvaluateLowSampleCountPercentile\":\"\"}}",
                "Timestamp": "2024-07-14T02:30:38.758Z"
            }
        }
    ]
}

5.メール通知の確認

file

参考

https://docs.aws.amazon.com/ja_jp/fsx/latest/OpenZFSGuide/how_to_use_metrics.html

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/fsx/client/describe_file_systems.html

Last modified: 2024-07-14

Author