kakakakakku blog

Weekly Tech Blog: Keep on Learning!

AWS CDK で Service Quotas のクォータをモニタリングする CloudWatch Alarm を設定する

特にプロダクション環境でウェブサービスを稼働させるときに AWS サービスのクォータ(サービス制限)を理解して運用することが重要で,例えば AWS Well-Architected Framework (Reliability Pillar) の REL01-BP04 では Not configuring monitoring to check for service quota thresholds というアンチパターンが紹介されていたりもする❗️

docs.aws.amazon.com

Service Quotas でクォータの使用状況をモニタリングする

実は Amazon CloudWatch で Service Quotas 使用状況をモニタリングすることができる🚨モニタリングできるサービスとメトリクスは以下のドキュメントに載っている.しかしサービスによっては詳細に載っていないこともあって判断しにくく,Service Quotas コンソールでメトリクスを選択して「モニタリング」タブと「アラーム」タブが表示されていればモニタリングできて,モニタリングできない場合は「リクエスト履歴」タブのみ表示されるので判断できる👌

docs.aws.amazon.com

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 トピックなどを設定しておくと良いと思う.

docs.aws.amazon.com

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,
        })
    }
}

デプロイ確認

デプロイするとマネジメントコンソールから作ったデフォルトのアラートとほとんど同じ設定になっていた❗️

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com