こんにちは。 ディベロップメントサービス1課の山本です。
Amazon APIGateway(以下、APIGateway)の使用量プランの利用法を説明します。 今回は、APIキー毎の使用回数をメトリクスに表示する方法を説明します。
APIGatewayの使用量プランって何?って方は、過去ブログにて説明しておりますので参考ください。 blog.serverworks.co.jp
はじめに
下記のような構成の時に無限にAPIを呼ばれて、無限にお金がかからないように対策します。
APIキーで識別しているクライアントを制限するために、APIGatewayの機能にある使用量プランを利用します。
ブログを前半・後半の2回に分けて説明します。
- 前半:使用量プランの使い方
- 後半:APIキー毎の使用回数をメトリクスに表示する
今回は後半なので、APIキーの使用回数をメトリクスに表示する内容を説明します。
構成図
- Amazon Event Bridgeにて定期的にAWS Lambdaを起動
- AWS LambdaがAPIGatewayからAPIの残り使用回数を取得
- AWS LambdaがAmazon CloudWatchのカスタムメトリクスに値を設定
カスタムメトリクスまで格納すると、閾値によるアラームの設定などで監視が容易になります。
Lambda関数の構築
IAMロール
APIGatewayとCloudWatchへのアクセスが必要となるので、IAMロールを作成します。
その後、作成したLambda関数にアタッチします。
信頼ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
許可ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData", "apigateway:GET" ], "Resource": "*" } ] }
コード
今回はPythonにて作成しました。
import boto3 import datetime import os def lambda_handler(event, context): # 環境変数から使用量プランIDとAPIキーIDを取得 usage_plan_id = os.environ['USAGE_PLAN_ID'] api_key_id = os.environ['API_KEY_ID'] # 現在時刻を取得 dt_now = datetime.datetime.now() # 本日のAPI使用量を取得 apigateway_client = boto3.client('apigateway') response = apigateway_client.get_usage( usagePlanId = usage_plan_id, keyId = api_key_id, startDate = dt_now.strftime('%Y-%m-%d'), endDate = dt_now.strftime('%Y-%m-%d') ) # カスタムメトリクスにプロット cloudwatch_client = boto3.client('cloudwatch') cloudwatch_client.put_metric_data( MetricData = [ { 'MetricName': 'LeftCount', 'Dimensions': [ { 'Name': 'ApiKeyID', 'Value': api_key_id }, ], 'Unit': 'Count', 'Value': response['items'][api_key_id][0][1] # APIの残使用量をプロットする。 }, ], Namespace = 'ApiGateway' )
利用しているboto3の機能説明
get_usage - Boto3 1.34.145 documentation
put_metric_data - Boto3 1.34.145 documentation
EventBridgeの構築
構築したLambda関数を定期的に実行するため、トリガーにAmazon Event Bridgeを追加します。
毎時00分にLambda関数を起動させて、現時点で残っているAPI使用回数を記録させます。
毎時00分に起動させるcron式は下記の通りです。
cron(0 * * * ? *)
AWSでのcron式は日と曜日を両方*
(全ての値)で設定することができず、片方?
(任意)で設定する必要があります。
Cron expressions reference - Amazon EventBridge
メトリクスの確認
Amazon CloudWatchのカスタムメトリクスを確認すると、無事に一時間毎の残り使用回数を確認することができました。
このメトリクスをアラームで監視することで、急激な使用の増加や残量が少なくなってきた警告を行うことができます。
さいごに
企業間のAPI連携などで急にAPIの利用を止めることが難しい場合に、 本ブログで紹介したメトリクスでの監視を合わせて検討いただければと思います。
本ブログがどなかたのお役に立てれば幸いです。