🌟

StepFunctionsで特定Subnetの残IPを取得 Cloudwatchでモニタリング

2024/02/29に公開

概要

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のモニタリング画面
    cloudwatch

まとめ

今回は特定のSubnetの残IPを取得してCloudwatchでモニタリングする方法について紹介しました。
SubnetのIPが枯渇しそうな事象に備えて、拡張もしくは新規でSubnetを発行するための参考データとして
利用できるようになりました。

Goals Tech Blog

Discussion