Amazon Web Services ブログ
Amazon DynamoDB テーブルのストレージをモニタリングするサーバーレスソリューション
Amazon DynamoDB をアプリケーションの NoSQL データベースサービスとして使用する場合に、DynamoDB テーブルが使用するストレージ使用量を追跡したいとしましょう。DynamoDB は、サービスメトリックを Amazon CloudWatch に公開します。CloudWatch は、これらのメトリックをモニタリングおよび分析し、アラームを設定し、さらに AWS リソースの変更に対して自動的に反応します。現在のところ、DynamoDB は、ThrottledRequests
、ConsumedWriteCapacityUnits
、および ConsumedReadCapacityUnits
を含む、多くの有用なメトリックを CloudWatch に送信します。
DynamoDB テーブルのストレージ使用状況を分析し、DynamoDB ワークロードが使用するストレージ使用量の履歴を把握し、ストレージコストを管理することは重要です。例えば、Time to Live (TTL) を使用して、不要なデータや陳腐化したデータを期限切れにしたいとします。そのような場合、ストリームを使用してそのデータを Amazon S3 または Amazon Glacier にアーカイブすることができるのです。この記事では、DynamoDB テーブルのストレージ使用状況をモニタリングする方法について解説します。
ソリューションの概要
DynamoDB は、6 時間ごとにテーブルのストレージ使用状況を更新します。この情報は、DynamoDB DescribeTable API を使用することで取得できます。テーブルのサイズを決定したら、カスタム CloudWatch メトリックを作成して、データを CloudWatch にプッシュできます。このソリューションでは、AWS CloudFormation を使用して、DynamoDB テーブルのストレージ使用状況をモニタリングするワンクリックデプロイメントアーキテクチャを作成する方法を解説します。これはインフラストラクチャをコードモデルとして実装するために必要です。
次の Python スクリプトと AWS CloudFormation テンプレートは、この GitHub リポジトリで入手できます。プロセスの仕組みは、上の図のようになります。(このソリューションは、DynamoDB ワークロードのあるすべての AWS リージョンでデプロイし、DynamoDB テーブルのストレージ使用量を継続してモニタリングすることを忘れないでください。)
- Amazon CloudWatch Events は、AWS Lambda 関数をスケジュールに従って実行します。
- Lambda 関数は、
DescribeTable
API を使って、リージョン内のすべての DynamoDB テーブルのサイズを確認します。 - Lambda 関数はテーブルサイズ情報を、カスタム CloudWatch メトリックに格納します。
- Lambda は、AWS CloudFormation テンプレートが作成したカスタムの AWS Identity and Access Management (IAM) ロールを使用して、DynamoDB および CloudWatch にアクセスします。
- AWS CloudFormation は、IAM ロールと Lambda 関数の作成、イベントのスケジューリングなど、ソリューション全体のデプロイを行います。
DynamoDB テーブルのストレージ使用状況をモニタリングする
DynamoDB テーブルのストレージ使用状況をモニタリングするには、次の手順に従います。
ddbstoragemon.py
というファイルを作成し、次のコードをファイルに貼り付けます。このサンプルコードでは、特定の AWS リージョン内のすべてのテーブルに対してDescribeTable
API を呼び出し、API レスポンスからTableSizeBytes
を読み取り、その情報をDynamoDBStorageMetrics
と呼ばれるカスタムの CloudWatch メトリックに配置します。ddbstoragemon.py
ファイルを圧縮し、ddbstoragemon.zip
として保存します。- .zip ファイルを Amazon S3 にアップロードする
AWS CloudFormation を使用して、コードをデプロイする
コードが Amazon S3 に配置されたので、AWS CloudFormation を使ってソリューション全体をデプロイします。
- 次の CloudFormation サンプルコードをファイルに貼り付け、ファイルを
ddbStoreMonCF.json
として保存します。このコードでは、次の項目が作成されます。- DynamoDB
DescribeTable
API にアクセスし、DynamoDB テーブルサイズを取得し、その情報を CloudWatch に格納するための IAM ロール。 - Amazon S3 に格納された Python スクリプトを使用する Lambda 関数。
- 6 時間ごとに Lambda 関数をトリガーする CloudWatch Events ルール。
AWS CloudFormation JSON テンプレート
- DynamoDB
- AWS マネジメントコンソールにサインインし、AWS CloudFormation コンソールに移動します。
- [Create Stack] を選択します。
- 「Select Template」ページで、[Upload a template to Amazon S3] を選択します。[Browse] を選択し、先に作成した
ddbStoreMonCF.json
テンプレートを選択します。 - [Next] を選択します。以前に Amazon S3 にアップロードした .zip ファイルの Stack name、Amazon S3 BucketName、FileName を入力します。
- [Next] を選択します。「Options」ページでデフォルト設定を維持して、[Next] を選択します。
- [I acknowledge that AWS CloudFormation might create IAM resources] チェックボックスを選択し、[Create] を選択します。
AWS CloudFormation はテンプレート定義に基づいてリソースを作成します。数分後、次のスクリーンショットに示すように、CloudFormation が、スタックを正常に作成したことを確認する必要があります。
設定をテストする
AWS CloudFormation テンプレートが作成した CloudWatch ルールは、6 時間ごとにトリガーし、関連するメトリックを CloudWatch に保存します。構成が正常に動作していることを確認するため、簡単なテストを行いましょう。
- CloudWatch コンソールに移動し、ナビゲーションペインで [Rules] を選択します。
- AWS CloudFormation スタック ddbstoragemon をその名前の中に持つルールを探して、それを選択します。
- このルールは、6 時間ごとに Lambda 関数をトリガーするようにスケジュールされています。AWS CloudFormation で作成された Lambda 関数を開くには、Resource名を選択します。
- AWS Lambda コンソールで、[Test] を選択します。[Configure test event] ウィンドウで、イベント名を入力し、デフォルト値を受け入れ、[Create] を選択します。
- [Test] を選択して、関数を実行します。
Lambda 関数は、その AWS リージョンのすべての DynamoDB テーブルのストレージメトリックを確認し、その情報をカスタム CloudWatch メトリック名前空間DynamoDBStorageMetrics
に配置します。 - CloudWatch コンソールに戻ります。[All metrics] タブ (Custom Namespaces の下にある) で、DynamoDBStorageMetrics を選択します。
- [TableName] を選択し、リストからテーブルを選択してストレージの使用状況を確認します。この例では、本番テーブルに関するメトリックを取得するため、数日間このソリューションを実行しました。
次のスクリーンショットは、先週の hashrange1
テーブルのストレージメトリックを示しています。
そして次のスクリーンショットは、hashrange1
テーブルの現在のサイズを示しています。
これらのメトリックは、例えば次のような是正処置を取るのに役立ちます。
- テーブルが突発的な増大したかを、確認することができます。このような場合は、増大が「新しい標準」を表すのか、あるいは最近のコード変更により不具合が発生したのかを知るために、開発チームに確認する必要があります。
- テーブルが許容可能なストレージサイズを超えている場合は、関連する CloudWatch メトリックにアラームを設定できます。
まとめ
この記事では、サーバーレスアプリケーションをデプロイして、DynamoDB テーブルのストレージをモニタリングする方法を紹介しました。例えば、テーブルが指定サイズを超えた時に、Lambda からオペレーションチームに Amazon SNS 通知を送信することで、このソリューションを強化できます。
このソリューションの実装について質問がある場合は、下のコメント欄で尋ねてください。
著者について
Masudur Rahaman Sayem はアマゾン ウェブ サービスのソリューションアーキテクトです。 AWS を使用している場合にソリューションの価値を向上させる手助けとなるために、AWS の顧客と協力してデータベースプロジェクト上の指導や技術支援を行っています。