はじめに
CloudFormationでService Quota Exceeded Exceptionのエラーが発生した場合の対処方法をまとめていきます。
遭遇した状況
大量のCloudWatchアラームをでCloudFormationでデプロイしたところ、Service Quota Exceeded Exceptionエラーが発生・・・
原因
「Rate exceeded」(レート超過) エラーは、AWS のサービスに対する API コールが許可された API リクエストの最大数を超過し、API コールがスロットリングされた場合に発生します。通常、これらのエラーは一時的なもので、API コールが少なくなると自動的に解決されます。
つまりどういうこと?
AWSがCloudFormationからリソースを作成する際にAPIコールの数が多すぎてスロットリングされたということです。この辺はリソースを作成する際にCloudFormationがよろしく調整してくれるのかなと思っていたのですが、あまりにも多すぎるとだめみたいですね。
対策
オフィシャルに公開されている情報は以下です。
・エクスポネンシャルバックオフを実装する
・スタックを 1 つずつ作成または更新する
・DependsOn 属性を使用する
・クォータの引き上げをリクエストする
今回は、AWS API エンドポイントを直接叩いているわけではないので、エクスポネンシャルバックオフは除外、スタックも1つなので、スタックを 1 つずつ作成または更新するも除外、クォータの引き上げをリクエストするも、一時的なものなので除外します。
そのため、DependsOn属性を利用することとします。
Depends on属性とは?
DependsOn 属性を使用すると、特定のリソースが他のリソースに続けて作成されるように指定できます。DependsOn 属性をリソースに追加した場合、そのリソースの作成は必ず、DependsOn 属性で指定したリソースの作成後に行われます。
つまり、対象のリソースの作成の前提条件として別のリソースの作成完了を条件とすることができるものです。これを追加すれば、作成タイミングをコントロールできるので、同時に作成される量を減少させ、レート制限にも対応できそうです。
CPUAlarm:
Type: AWS::CloudWatch::Alarm
DependsOn: XXXAlarm
Properties:
AlarmDescription: CPU alarm for my instance
AlarmActions:
- Ref: "logical name of an AWS::SNS::Topic resource"
MetricName: CPUUtilization
Namespace: AWS/EC2
Statistic: Average
Period: '60'
EvaluationPeriods: '3'
Threshold: '90'
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: InstanceId
Value:
Ref: "logical name of an AWS::EC2::Instance resource"
# まとめ
CloudFormationでもレート制限がでることがあります。
DependsOnやスタックの分割などで工夫していきましょう。