背景
ファイルシステムのストレージ容量は増加することのみ可能で、減らすことはできません。
最小容量のストレージで作成し、閾値に超えたらメール通知する仕組みを考えて、手順を残していきたいと思います。
前提条件
・検証用ファイルシステムが構築済みであること(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.メール通知の確認
参考
https://docs.aws.amazon.com/ja_jp/fsx/latest/OpenZFSGuide/how_to_use_metrics.html