特にプロダクション環境でウェブサービスを稼働させるときに AWS サービスのクォータ(サービス制限)を理解して運用することが重要で,例えば AWS Well-Architected Framework (Reliability Pillar) の REL01-BP04 では Not configuring monitoring to check for service quota thresholds
というアンチパターンが紹介されていたりもする❗️
Service Quotas でクォータの使用状況をモニタリングする
実は Amazon CloudWatch で Service Quotas 使用状況をモニタリングすることができる🚨モニタリングできるサービスとメトリクスは以下のドキュメントに載っている.しかしサービスによっては詳細に載っていないこともあって判断しにくく,Service Quotas コンソールでメトリクスを選択して「モニタリング」タブと「アラーム」タブが表示されていればモニタリングできて,モニタリングできない場合は「リクエスト履歴」タブのみ表示されるので判断できる👌
Amazon SageMaker: Number of instances across all processing jobs
クォータによってメトリクスの設定が異なるため,実装する前にマネジメントコンソールからアラートを作って設定を確認しておくと良いと思う👌
具体例を挙げると,AWS Lambda のクォータ Concurrent executions (L-B99A9384) だと AWS/Lambda
名前空間の ConcurrentExecutions
メトリクスを使って,Amazon DynamoDB のクォータ Maximum number of tables (L-F98FE922) だと AWS/Usage
名前空間の ResourceCount (TableCount)
メトリクスを使う.そして,Amazon SageMaker のクォータ Number of instances across all processing jobs (L-F311B08F) だと AWS/Usage
名前空間の ResourceCount (processing-job/total_instance_count)
メトリクスを使う.
👾 lib/service-quotas.ts
今回はサンプルとして Amazon SageMaker のクォータ Number of instances across all processing jobs (L-F311B08F) を使う❗️実装上のポイントは Amazon CloudWatch メトリクスの数式でクォータの使用状況を返す SERVICE_QUOTA
関数を使うところ \( 'ω')/ 今回アラームアクションは割愛しているけど,実際には Amazon SNS トピックなどを設定しておくと良いと思う.
import { Duration, Stack, StackProps, aws_cloudwatch, } from 'aws-cdk-lib' import { Construct } from 'constructs' export class ServiceQuotasStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props) const mathExpression = new aws_cloudwatch.MathExpression({ expression: '(usage_data/SERVICE_QUOTA(usage_data))*100', label: '% 使用率', usingMetrics: { usage_data: new aws_cloudwatch.Metric({ namespace: 'AWS/Usage', metricName: 'ResourceCount', dimensionsMap: { Type: 'Resource', Service: 'SageMaker', Resource: 'processing-job/total_instance_count', Class: 'None', }, statistic: 'Maximum', }), }, period: Duration.hours(1), }) mathExpression.createAlarm(this, 'QuotasAlarm_L-F311B08F', { alarmName: 'Number of instances across all processing jobs', threshold: 50, evaluationPeriods: 10, comparisonOperator: aws_cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, }) } }
デプロイ確認
デプロイするとマネジメントコンソールから作ったデフォルトのアラートとほとんど同じ設定になっていた❗️