Udemy講師クーポン配布中。詳しくはこちら

[クォータ対策]AWS パラメータストアへのアクセスレートを集計してみた

AWSシステムを運用する際、たびたび問題になるクォータ問題があります。クォータとはAWSを使う上で定められている上限です。パラメータストアは環境依存パラメータを保存するのに非常に便利ですが、クォータには注意する必要があります。

今回は「今のシステムはパラメータストアのクォータ(秒間呼出し制限)は大丈夫なのか?」を確認する方法をまとめます。

目次

はじめに:パラメータストアのクォータと注意点

Systems Managerのリファレンスによるとスループットに関するクォータは以下の通りです。デフォルトである無課金状態では「標準スループット」です。

パラメータストアに関する上限
  • 標準スループット: 40 (次のAPIアクションで共有: GetParameterGetParametersGetParametersByPath
  • スループットの向上: 10,000 (GetParameter
  • スループットの向上: 1,000 (GetParameters
  • 高スループット: 100 (GetParametersByPath)

上記の値は秒間です。標準スループットモードでは秒間40回に制限されます。

また、通常スループットではおおよそ70~80ms程度のレイテンシーのようです。

X-RAYで確認したパラメータストアのレイテンシー(実測)
X-RAYで確認したパラメータストアのレイテンシー

このレイテンシーが遅いか早いかはシステムの特性によるとは思いますが、DynamoDBからのGetItemが一桁ミリ秒なのでAWS関連サービスの中では遅めなようです。

X-RAYで確認したDynamoDBのレイテンシー(実測)
X-RAYで確認したDynamoDBのレイテンシー

パラメータストアへのアクセス頻度を調べる方法

パラメータストアへのアクセス頻度を表示するダッシュボードやメトリクスはありません。そのため工夫する必要があります。パラメータストアへのアクセスログがCloudTrailに記録されるのでこれを利用します。

CloudTrailのログを集計する手順は以下のClassmethod様の記事が大変参考になりました。本記事で紹介する手順においても大変参考にさせていただいています。

ざっくり申し上げると、CloudTrailに記録されているパラメータストアのアクセスログをAthenaで集計するという手法です。

CloudTrailログ解析のアーキテクチャ
CloudTrailログ解析のアーキテクチャ

CloudTrailのログはS3に保存されるので、それをAthenaで集計していきます。

パラメータストアへのアクセス頻度を調べる詳細手順

Athenaでテーブルを作る

AthenaでCREATE TABLEを行ってテーブルを作成します。ただ、いきなりSQLを作成するのはハードルが高いと思います。CloudTrailの画面でAthenaテーブルを作成するためのSQLを生成することができます。

マネジメントコンソールでCloudTrail画面に遷移して「Athenaテーブルを作成」を押下しましょう。

CloudTrail画面で「Athenaテーブルを作成する」を押下
CloudTrail画面で「Athenaテーブルを作成する」を押下

するとSQLが生成されます。CloudTrailのログが格納されているS3バケットを選択すればSQLの中にS3を埋め込んでくれるので選択しましょう。

生成されたSQLをコピーする
生成されたSQLをコピーする

以下のようなSQLが出力されます。すべてのCloudTrailログをスキャンしてもよいのであれば「テーブルを作成」で問題ありませんが、対象を絞りたい場合は下部のLOCATION(58行目)でクエリ範囲をプレフックスで絞りましょう。編集する場合はいったんSQLをメモ帳などにコピーします。

CREATE EXTERNAL TABLE 【CloudTrailバケット名】 (
    eventVersion STRING,
    userIdentity STRUCT<
        type: STRING,
        principalId: STRING,
        arn: STRING,
        accountId: STRING,
        invokedBy: STRING,
        accessKeyId: STRING,
        userName: STRING,
        sessionContext: STRUCT<
            attributes: STRUCT<
                mfaAuthenticated: STRING,
                creationDate: STRING>,
            sessionIssuer: STRUCT<
                type: STRING,
                principalId: STRING,
                arn: STRING,
                accountId: STRING,
                username: STRING>,
            ec2RoleDelivery: STRING,
            webIdFederationData: STRUCT<
               federatedProvider: STRING,
               attributes: MAP<STRING,STRING>>>>,
    eventTime STRING,
    eventSource STRING,
    eventName STRING,
    awsRegion STRING,
    sourceIpAddress STRING,
    userAgent STRING,
    errorCode STRING,
    errorMessage STRING,
    requestParameters STRING,
    responseElements STRING,
    additionalEventData STRING,
    requestId STRING,
    eventId STRING,
    resources ARRAY<STRUCT<
        arn: STRING,
        accountId: STRING,
        type: STRING>>,
    eventType STRING,
    apiVersion STRING,
    readOnly STRING,
    recipientAccountId STRING,
    serviceEventDetails STRING,
    sharedEventID STRING,
    vpcEndpointId STRING,
    tlsDetails STRUCT<
        tlsVersion: STRING,
        cipherSuite: STRING,
        clientProvidedHostHeader: STRING>
)
COMMENT 'CloudTrail table for 【CloudTrailバケット名】 bucket'
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://【CloudTrailバケット名】/AWSLogs/123456789012/CloudTrail/'
TBLPROPERTIES ('classification'='cloudtrail');

ここでは2024/12の東京リージョンで絞るために以下のようにしました。環境ごとにバケットのプレフィックス構造が変わっているかもしれないのでバケットを見に行ってください。

LOCATION 's3://【CloudTrailバケット名】/AWSLogs/123456789012/CloudTrail/ap-northeast-1/2024/12/'

マネジメントコンソールでAthenaの画面に行ってクエリエディタを開きます。

Athena画面でクエリエディタを開く
Athena画面でクエリエディタを開く

SQLを実行する前に設定タブで「クエリの結果の場所」を設定しておかないとエラーになる可能性があります。適当に設定しておきましょう。

クエリエディタで出力先(S3)の設定
クエリエディタで出力先(S3)の設定

この設定はアーキテクチャ上では以下の赤枠のS3バケット(クエリ結果を格納するS3)を指定しています。

クエリエディタで出力先(S3)の設定(アーキテクチャ上)

先ほど作成したSQLを実行します。

Athenaでテーブルを作成するためのSQLを実行する
Athenaでテーブルを作成するためのSQLを実行する

完了済みと出れば成功です。

AthenaでSELECTクエリを実行する

先ほどはテーブルを作成した状態なので、ここではテーブルに対してSELECTします。クォータではGetParameterGetParametersGetParametersByPathの合計で毎秒40回なので以下のようなSQLになります。

【テーブル名】はデフォルトではCloudTrailログのバケット名になっているかと思います。

SELECT eventtime
FROM "default"."【テーブル名(デフォルトはCloudTrailのS3)】" 
WHERE eventsource = 'ssm.amazonaws.com'
    AND eventname IN ('GetParameter', 'GetParameters', 'GetParametersByPath')

上記のSQLではssm(パラメータストア)に対して’GetParameter’, ‘GetParameters’, ‘GetParametersByPath’を行った時刻を出力するような構文になっています。

完了すると以下のような画面になります。結果をダウンロードしましょう。

AthenaでSELECTするためのSQLを実行する
AthenaでSELECTするためのSQLを実行する

CSVがDLできるはずです。

Excelのピボットグラフで集計する

ダウンロードしたCSVにはパラメータストアへアクセスした日時が秒ごとに記載されています。

ここでダウンロードしたCSVをExcelで少し編集します。ピボットグラフを使用するため、保存したい場合は.xlsx形式に変換してください。そのままのcsvはeventtimeが記載されていますが、その隣の列にcountを追加してすべて1を入れます。

eventtimeの隣にcountを追加する
eventtimeの隣にcountを追加する

A列とB列を選択を選択した状態で「ピボットグラフ」を挿入します。

列を選択してピボットグラフを作成する
列を選択してピボットグラフを作成する

「eventtime」と「count」にチェックを入れるとグラフが生成されます。

グラフフィールドをチェックしてグラフをプロットする
グラフフィールドをチェックしてグラフをプロットする

このグラフを確認することでパラメータストアへのアクセスを秒単位に時系列で確認できました。私の環境ではパラメータストアへのアクセスは最大秒間18回程度でした。

本番環境では定期的に確認してチューニングするのが望ましいですね。

秒ごとのパラメータストアへのアクセスがグラフ化される
秒ごとのパラメータストアへのアクセスがグラフ化される

まとめ

AWSパラメータストアはシステムの運用において非常に便利なツールですが、クォータの制約によりパフォーマンスが低下するリスクがあります。本記事では、CloudTrailとAthenaを利用してパラメータストアへのアクセス頻度を可視化し、その結果をExcelで分析する方法を紹介しました。

この手法を活用することで、以下のメリットが得られます:

  • クォータ対策:アクセス頻度を把握し、クォータの限界を超えるリスクを回避できます。
  • パフォーマンス最適化:アクセス頻度のピークを特定し、必要に応じてスループットの向上やキャッシュの導入を検討できます。
  • データドリブンな判断:可視化されたデータを基に、システム運用の改善点を明確にできます。

本番環境ではアクセス頻度の定期的な確認と、必要に応じたチューニングが重要です。本記事がシステム運用に役立つと幸いです。

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次