熱中症を防ぐため塩水を飲むようになった前田(青)です。
お客様からAmazon Athena APIのコール数の制限(クォータ)についてお問い合わせがあり、調査過程で表題のような疑問を持ったため記事にしました。
結論
クエリ実行の際に複数回呼び出されるため。
Athena APIコール数のクォータとは?
Athena APIには下記表のように1秒間あたりの呼び出し回数に制限が設けられています。制限を超過すると実行に失敗してエラーになります。 この制限はAWSへ依頼することで引き上げ可能です。
※表の参照元 Service Quotas - Amazon Athena
GetQueryExecutionのクォータがやたら高い…なぜ?
調査過程で、各APIの意味を理解したいと思い、Actions - Amazon Athenaを参考にまとめた結果が下記表になります。 (今回注目したいのは1秒あたりのデフォルトコール数のため、上の表にあった最大バーストキャパシティの列は省略しています。)
API名 | 1秒当たりのデフォルトコール数 | 説明 |
---|---|---|
BatchGetNamedQuery | 5 | 名前付きクエリIDをもとに、複数の名前付きクエリの情報(名前、クエリ、説明)を一括取得する。 |
ListNamedQueries | 5 | 指定されたワークグループ内の名前付きクエリIDを一括取得する。 |
ListQueryExecutions | 5 | 指定されたワークグループ内で実行クエリIDを一括取得する。 |
CreateNamedQuery | 5 | 名前付きクエリを作成する |
DeleteNamedQuery | 5 | 名前付きクエリを削除する |
GetNamedQuery | 5 | 名前付きクエリIDをもとに、単一の名前付きクエリの情報(名前、クエリ、説明)を取得する。 |
BatchGetQueryExecution | 20 | 実行クエリIDをもとに、複数の実行されたクエリの情報(クエリ、開始時刻、実行時間など)を一括取得する。 |
StartQueryExecution | 20 | クエリを実行し、実行クエリIDを取得する。 |
StopQueryExecution | 20 | クエリの実行を停止する。 |
GetQueryExecution | 100 | 実行クエリIDをもとに、実行されたクエリの情報を取得する。 |
GetQueryResults | 100 | クエリ実行IDを指定し、クエリ結果を表示する。 |
これを見て私はGetQueryExecutionのクォータが類似API(ListQueryExecutions、BatchGetQueryExecutionなど)と比べて高いことに違和感を持ちました。(例えばBatchGetNamedQueryとGetNamedQueryはともにクォータが5であり、似たようなAPIのクォータは同程度になるイメージを持っていたためです。)
調査結果
各APIがAthena画面上の操作とどのように対応しているのか下記表のようにまとめた時、理由が分かりました。 GetQueryExecutionはクエリ実行結果が表示されるまでの間、複数回呼び出されていました。
API名 | 1秒当たりのデフォルトコール数 | 説明 | Ahtna操作画面との対応 |
---|---|---|---|
BatchGetNamedQuery | 5 | 名前付きクエリIDをもとに、複数の名前付きクエリの情報(名前、クエリ、説明)を一括取得する。 | タブ「保存したクエリ」クリック時に「名前付きクエリ」が一覧表示される時に呼び出される。 |
ListNamedQueries | 5 | 指定されたワークグループ内の名前付きクエリIDを一括取得する。 | タブ「保存したクエリ」クリック時に「名前付きクエリ」が一覧表示される時に呼び出される。 |
ListQueryExecutions | 5 | 指定されたワークグループ内で実行クエリIDを一括取得する。 | タブ「最近のクエリ」クリック時に「実行したクエリ」が一覧表示される時に呼び出される。 |
CreateNamedQuery | 5 | 名前付きクエリを作成する | タブ「エディタ」における「名前を付けて保存」クリック時に呼び出される。 |
DeleteNamedQuery | 5 | 名前付きクエリを削除する | タブ「保存したクエリ」における「削除する」クリック時に呼び出される。 |
GetNamedQuery | 5 | 名前付きクエリIDをもとに、単一の名前付きクエリの情報(名前、クエリ、説明)を取得する。 | (本APIの呼び出しは、Athena操作画面で操作実施してもCloudTriilログに記録されていなかった。) |
BatchGetQueryExecution | 20 | 実行クエリIDをもとに、複数の実行されたクエリの情報(クエリ、開始時刻、実行時間など)を一括取得する。 | タブ「最近のクエリ」クリック時に「実行したクエリ」が一覧表示される時に呼び出される。 |
StartQueryExecution | 20 | クエリを実行し、実行クエリIDを取得する。 | タブ「エディタ」における「実行」クリック時に呼び出される。 |
StopQueryExecution | 20 | クエリの実行を停止する。 | タブ「エディタ」における「キャンセル」クリック時に呼び出される。 |
GetQueryExecution | 100 | 実行クエリIDをもとに、実行されたクエリの情報を取得する。 | ・タブ「最近のクエリ」における「実行したクエリ」のリンクをクリック時に呼び出される。 ・タブ「エディタ」における「実行」クリック後に結果が表示されるまでの間、複数回呼び出される。 |
GetQueryResults | 100 | クエリ実行IDを指定し、クエリ結果を表示する。 | ・タブ「エディタ」における「実行」クリック後に結果を表示する時に呼び出される。 ・タブ「最近のクエリ」における「実行したクエリ」のリンクをクリック後に結果が表示される時に呼び出される。 |
具体的に言うと、下記の操作をコンソール上で実施する時になります。
上記操作が記録されたCloudTrailログを見てみると、SQLを実行(StartQueryExecution)してから結果が表示される(GetQueryResult)までの間にGetQueryExecutionが複数回呼び出されていることが分かります。
クエリ結果が取得できるようになるまで、クエリの実行状態(QueryExecutionStatus)をポーリングしているため複数回呼び出されていると推測されます。
1回の操作で複数回呼び出されるのであれば1秒当たりのAPIコール数も多くなるため、クォータが他APIよりも高いことについて納得することが出来ました。
まとめ
細かい内容となってしまいましたが、APIクォータについて調べていて同じような疑問を持つ方のお役に立てば幸いです。