【Amazon APIGateway】使用量プランを利用して、APIキー毎の使用回数をメトリクスに表示する(後半)

記事タイトルとURLをコピーする

こんにちは。 ディベロップメントサービス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使用回数を記録させます。

EventBridge設定画面

毎時00分に起動させるcron式は下記の通りです。
cron(0 * * * ? *)

AWSでのcron式は日と曜日を両方*(全ての値)で設定することができず、片方?(任意)で設定する必要があります。

Cron expressions reference - Amazon EventBridge

メトリクスの確認

Amazon CloudWatchのカスタムメトリクスを確認すると、無事に一時間毎の残り使用回数を確認することができました。

APIキー残使用回数_メトリクス

このメトリクスをアラームで監視することで、急激な使用の増加や残量が少なくなってきた警告を行うことができます。

さいごに

企業間のAPI連携などで急にAPIの利用を止めることが難しい場合に、 本ブログで紹介したメトリクスでの監視を合わせて検討いただければと思います。

本ブログがどなかたのお役に立てれば幸いです。

山本 真大(執筆記事の一覧)

アプリケーションサービス部 ディベロップメントサービス1課

2023年8月入社。カピバラさんが好き。