Edited at

AWS のServiceLimitとAPIのRateLimitに気をつける

More than 1 year has passed since last update.


この文書について

対象読者: サーバサイドエンジニアやインフラエンジニアで、

AmazonWebServices(AWS)のサービス選定をする人。

AWSでは作成可能なリソースの数がデフォルトで制限されていることがあります。(ServiceLimit)

またAWSのAPIには単位時間あたりの呼び出し回数に制約がかかっているものがあります。(RateLimit)

これを知らずにサービス選定をしてしまうと、上限に引っかかってしまって、

リリース直前に非機能要件が満たせないという悲しいことも起こり得ます。

この文書ではServiceLimitとRateLimitについて、

AWSの公式文書の紹介と実際に陥った事例を紹介します。


ServiceLimit と RateLimitの公式ドキュメント

AWSのサービス選定する際には必ずこのドキュメントを参照してください。

http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html

リソース数やAPIのリクエスト数の制限については、上限緩和申請が可能なものもあります。

利用するサービスで緩和申請が必要であれば、AWSのサポートに連絡して制限を上げてもらいます。

ただ、引き上げには2~3日のリードタイムがかかるので、負荷試験フェーズになるまでに余裕をもって申請してください。


失敗事例

制限事項を見落としていたり、制限の数字を楽観的に捉えてしまった事例を紹介します。


SNS の Subscribe API の RateLimit

SNSはトピック配信という機能があり、トピックを購読している端末に一斉に通知を送ることができます。

よくモバイルアプリの全体配信に使われます。

ここで「SNSで配信 = Topicを使う」と勘違いしてしまい、

即時性が必要なセグメント配信にもTopicをつかった配信をしようとするとハマります。

http://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html

にあるように、 TopicへEndpointArnの紐付けを行う Sbcribe APIは 秒間100リクエストが上限なので、即時配信したい場合は配信速度がRateLimitのせいで頭打ちになります。

対策としては、EndpointArnを抽出したら個別に SNSの Publish APIを使うような分散処理を設計します。


EC2 の DescribeInstances の RateLimit

EC2はオートスケールで増減してしまうような場合、ASG配下のインスタンスのIPを取得するために、

EC2のTagにサービス名や環境名を入れてDescribeInstancesを使います。

http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/APIReference/query-api-troubleshooting.html

公式ドキュメントを見ると、

Describe actions, such as DescribeInstances and DescribeVolumes. These requests simply retrieve cached data, so they have the highest request limit.

the highest request limit とあるので、割りと頻繁に叩いて大丈夫だろうと思いますよね。

そう思って、EC2へ逐次更新されるファイルを配置しようとこのAPIを使っていたら、

ある日突然 RateLimitExceeded エラーになります。

対策としては、DescribeInstancesの実行結果をどこかストレージにキャッシュし、

IPはキャッシュから取得します。