技術ブログ
目次
峯岸です。引き続きAWSの監視について投稿します。今回は前回に引き続きOracle Databaseのアラートログ監視についてです。
CloudWatch Logsサブスクリプションフィルタを用いたアラートログ監視実装について設定方法を説明していきます。メトリクスフィルタと異なる点はAWS Lambdaに連携することでメールの通知内容等をユーザ側で制御できるという点です。
AWS Lambdaとは関数(プログラムコード)の実行環境を提供するサービスです。さまざまなプログラミング言語に対応していますが、今回はライブラリが充実しているPythonで実装していきます。
まず、サブスクリプションフィルタ使用時の流れですが、以下のスライドにまとめました。
各項目の手順について説明します。
こちらについては前回の投稿をご参照ください。
まず、準備としてLamda関数用のIAMロールとLambdaからSNSにアクセスするためのVPCエンドポイントを作成します。
IAMコンソール画面の左側のリストからロール(①)をクリックし、「ロールを作成」ボタン(②)を押下します。
信頼されたエンティティを選択画面で信頼されたエンティティタイプにAWSのサービス(③)を選択、ユースケースにLambda(④)を選択し、「次へ」ボタン(⑤)を押下します。
許可を追加画面で以下のIAMポリシーを選択し、「次へ」ボタン(⑥)を押下します。
名前、確認、および作成画面でロール名(⑦)を入力し、「ロールを作成」ボタン(⑧)を押下します。
これでLambdaが必要なサービスにアクセスするためのIAMロールが作成できました。ただし、このままではVPC内に作成したLambdaがSNSサービスと通信できないため、引き続きVPC内にSNSのVPCエンドポイントを作成します。
VPCコンソール画面の左側のリストからエンドポイント(⑨)をクリックし、「エンドポイントの作成」ボタン(⑩)を押下します。
エンドポイントの作成画面にて名前タグ(⑪)にエンドポイント名を入力します。
画面をスクロールし、サービス名にSNSを選択(⑫)、VPCにRDSが存在するVPC(⑬)を選択します。
画面をさらにスクロールし、SNSのVPCエンドポイントを作成するサブネット(⑭)およびセキュリティグループ(⑮)を選択します。
画面の最下部までスクロールし、エンドポイントの作成(⑯)ボタンを押下します。
これでSNS用のVPCエンドポイントを作成できました。続いてLambda関数を作成します。
Lambdaコンソール画面の左側のリストから関数(⑰)をクリックし、「関数の作成」ボタン(⑱)を押下します。
関数の作成画面で、関数名(⑲)を入力し、ランタイムにPython 3.9(⑳)を選択、アーキテクチャにx86-64(㉑)、実行ロールに既存のロール(㉒)を選択、実行ロール名に本投稿で作成したロール名(㉓)を選択、VPCを有効化(㉔)にチェックを入れ、VPC(㉕)、サブネット(㉖)、セキュリティグループ(㉗)を選択し、「関数の作成」ボタン(㉘)を押下します。
続いてサブスクリプションフィルタを作成します。作成したLambdaの画面に遷移しているので、「+トリガーを追加」(㉙)をクリックします。
トリガーの追加画面で、CloudWatch Logsを選択(㉚)し、ロググループにアラートログ(㉛)のロググループを選択、フィルターの名前(㉜)を入力し、フィルターパターンに"ORA-"(㉝)を入力後、「追加」ボタン(㉞)を押下します。
以上で、サブスクリプションフィルタの作成が完了しました。
サブスクリプションフィルタを用いて受け取ったアラートログの情報を読み込み、SNSトピックを呼び出すプログラミングコードを作成します。
作成したLambda関数を開き、「コード」タブ(㉟)のコード欄(㊱)にプログラミングコードを記載します。記載後、「Deploy」ボタン(㊲)を押下すれば、デプロイ完了です。
なお、以下に実際のソースコードも載せておきます。
import base64
import json
import gzip
import boto3
def lambda_handler(event, context):
try:
# SNS通知設定
sns_topic_arn = 'arn:aws:sns:ap-northeast-1:********:rds-email-topic'
sns_client = boto3.client('sns')
subject = 'RDS ORACLE ERROR'
# CloudWatch Logの読み込み
cloud_log_data= event['awslogs']['data']
compressed_data= base64.b64decode(cloud_log_data)
uncompressed_data = gzip.decompress(compressed_data)
logdataload = json.loads(uncompressed_data)
# JSONデータよりエラー情報の読み込み
message = logdataload['logEvents'][0]['message']
# SNSへの通知実行
request = {
'TopicArn': sns_topic_arn,
'Subject': subject,
'Message': message
}
response = sns_client.publish(**request)
except:
print('Error')
上記内容で、Lambda関数を作成した場合、以下のようにメールが送信されます。
メールのサブジェクトなどを変更したい場合は、上記ソースコードのsubject変数の内容を変更すれば変更可能です。また、特定のORA-エラーに対してメッセージ内容を変更するなど、Lambda関数を修正すれば様々な制御が可能になります。
通知させたくないORAエラーがある場合にはサブスクリプションフィルターのフィルターパターンを変更することで除外可能です。
作成したLambda関数を開き、「設定」タブ(㊳)の「トリガー」(㊴)を開き、サブスクリプションフィルターにチェックを入れ(㊵)、「編集」ボタン(㊶)を押下します。
トリガーを編集画面でフィルターパターンに除外条件を追加(㊷)します。例えばORA-04031を除外したい場合には以下のように設定します。
"ORA-" -"ORA-04031"
複数、除外したい条件があるのであれば続けて記載します。
"ORA-" -"ORA-04031" -"ORA-07445"
フィルターパターンを追加したら「保存」ボタン(㊸)を押下すれば設定完了です。
これまでの投稿ではCloudWatchを用いた監視実装についてご紹介してきましたが、当社で取り扱っているソーラーウィンズ社のDPA(Database Performance Analyzer)という製品で今回までにご紹介させていただいた監視の実装が可能です。以下に当社の技術情報へのリンクも記載しますのでご参考いただければ幸いです。
・セッション数監視
・表領域監視
・アラートログ監視
・DB接続監視
※DPAはOracle Database以外にも主要なデータベース製品の監視が可能です
DPAは基本的にはDBのパフォーマンスモニタリング製品ですが、監視機能も備えた製品となっております。もし、ご興味をお持ちの方がいらっしゃいましたら当社営業担当までご連絡いただければ幸いです。
コーソルではパブリッククラウドでも監視可能なデータベースの監視製品やモニタリングする製品を取り揃えています。運用まで見据えてデータベース全体を設計しますのでパブリッククラウド上でのデータベース構築については是非コーソルにお問い合わせください。
クラウドベンダーの選定からクラウド上での環境構築までお客様を支援いたします。データベースに強みを持った当社が運用まで見据えた設計を行います。
Database Performance Analyzer (DPA)は、オンプレミスとクラウド上の多くのデータベース製品に対応したデータベース性能管理製品です。低価格であるため、非常に導入しやすいです。
Database Performance Analyzer (DPA)で検出された問題SQLをチューニングする際に、Toad for Oracle / Toad for SQL Serverの SQL Optimizer機能を使用できます。
リモートDBAサービスはDB・運用の専門家がお客様のデータベースに対して必要な時に必要な対応を行うリモート接続型運用保守サービスです。
時間制コンサルティングサービスは”必要な時に” ”必要な時間だけ”契約できる時間契約型のコンサルティングサービスです。