🌟
StepFunctionsで特定Subnetの残IPを取得 Cloudwatchでモニタリング
概要
AWS StepFunctionsで特定のSubnetの残IPを取得してCloudwatchでモニタリングしたい。
背景
弊社のアーキテクチャではバッチ処理をECSタスクを利用しているのですが、
ECSタスクの実行数が増えるとSubnetのIPが足りなくなってしまい、エラー終了してしまうことがありました。
その対策のため現状どれほどIPを利用し、どれほど余剰されているIPがあるのかを把握することが重要と考えました。
設計
当初NAUの機能が利用できるかと思い
有効にしてみましたが取得期間が一日単位と特定のSubnetで利用できるIPを確認したいためNAUでは要件を満たすことができませんでした。
そのため手組みでSubnetの残IPを取得してCloudwatchに値をPutする設計で考えましたが、
コストや障害を気にすることがないようにStepFunctions + EventBridgeで実装することにしました。
実装
以下のStepFuncitonsのコードは以下のようになります。
- Inputデータ
{
"subnetIds": [
"subnet-XXXXXXXXXXXXXXXXX",
"subnet-XXXXXXXXXXXXXXXXX",
"subnet-XXXXXXXXXXXXXXXXX",
"subnet-XXXXXXXXXXXXXXXXX",
"subnet-XXXXXXXXXXXXXXXXX"
]
}
- StepFunctionsコード
{
"Comment": "retrieves the number of available IP addresses for the specified subnet and adds that information to CloudWatch metrics.",
"StartAt": "MapState",
"States": {
"MapState": {
"Type": "Map",
"ItemsPath": "$.subnetIds",
"Parameters": {
"subnetid.$": "$$.Map.Item.Value"
},
"Iterator": {
"StartAt": "DescribeSubnets",
"States": {
"DescribeSubnets": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:ec2:describeSubnets",
"Parameters": {
"SubnetIds.$": "States.Array($.subnetid)"
},
"ResultPath": "$.subnetInfo",
"Next": "PutMetricData"
},
"PutMetricData": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:cloudwatch:putMetricData",
"Parameters": {
"Namespace": "VPC",
"MetricData": [
{
"MetricName": "AvailableIpCount",
"Value.$": "$.subnetInfo.Subnets[0].AvailableIpAddressCount",
"Unit": "Count",
"Dimensions": [
{
"Name": "SubnetID",
"Value.$": "$.subnetid"
}
]
}
]
},
"End": true
}
}
},
"End": true
}
}
}
実行結果
上記のStepFunctionsをEventBridgeで5分間隔などで実行することで
Cloudwatchで確認することができます。
残IPが一定以下になった場合にアラートも設定できるようになったのですが、現状はまだ設定していません。
- Cloudwatchのモニタリング画面
まとめ
今回は特定のSubnetの残IPを取得してCloudwatchでモニタリングする方法について紹介しました。
SubnetのIPが枯渇しそうな事象に備えて、拡張もしくは新規でSubnetを発行するための参考データとして
利用できるようになりました。
Discussion