AWS RDS監査ログをS3バケットインスタンスに自動的にエクスポートする方法は?

公開: 2022-03-05

Export RDS logs to S3 Bucket

RDS監査ログをS3に自動的にエクスポートする方法を学ぶ前に、AWSCloudWatchがRDSDBログを自動的に保存することをご存知でしたか? はい、ありますが、DBインスタンスの一般的なログのみを保存します。 では、ログから特定のクエリまたはデータを検索したい場合はどうでしょうか。 どのユーザーが特定のクエリを実行したか、またはどのIPアドレスから実行しましたか? DBテーブルから特定のレコードを削除したのは誰ですか?

また、どういうわけか、RDSインスタンスのすべての監査ログをCloudWatchにエクスポートできました。これはすばらしいことです。 しかし、あなたは知っていますか? CloudWatchはこれらのログを30日間のみ保持します!! それらを長期間保持するには、CloudWatchログをS3バケットにエクスポートする必要があります。 これは、CloudWatchダッシュボードから手動で行うことができます。 しかし、これを自動化したい場合はどうでしょうか。

このガイドでは、このようなすべてのイベントを自動的にログに記録するために必要なすべての手順を説明します。

AWSエキスパートをお探しですか? ここでチェックアウト

このガイドの内容は次のとおりです。

1)RDS設定を微調整して、監査ログをCloudWatchに送信します
2)S3バケットを作成します(CloudWatch監査ログを保存するため)
3)IAMロールを作成します(これをLambda自動化に使用します)
4)Lambda(CloudWatch LogsのS3へのエクスポートを自動化する機能)

さぁ、始めよう!

RDS設定を微調整して、監査ログをCloudWatchに送信します

まず、特定のログをCloudWatchに送信するためにRDSを微調整する必要があります。 これを行うには、1つのオプショングループと1つのパラメータグループを作成します。

オプショングループの作成

⇒AmazonRDSダッシュボードにアクセスします。
⇒オプショングループに移動します。
⇒[グループの作成]ボタンをクリックします。

Create an Option Group

⇒このグループの名前と説明を入力します。
⇒[エンジン:mysql]および[エンジンバージョン:8.0]を選択します。 [作成]をクリックします。

Create an Option Group

⇒作成したオプショングループをクリックします。
⇒[オプション]セクションで、[オプションの追加]ボタンをクリックします。
⇒「SERVER_AUDIT_EVENTS*」オプションの下に、監査する値、つまりCONNECT、QUERY、QUERY_DDL、QUERY_DML、QUERY_DCL、QUERY_DML_NO_SELECTを入力します。 テーブルで実行されたすべてのクエリをログに記録する場合は、このフィールドにQUERYと入力するだけです。
⇒即時適用は「はい」に設定してください。 [オプションの追加]をクリックします。

Option Group Settings

AWSエキスパートをお探しですか? ここでチェックアウト

パラメータグループの作成

⇒AmazonRDSダッシュボードを開きましょう。
⇒パラメータグループをクリックします。
⇒[パラメータグループの作成]ボタンをクリックします。

Create Parameter Group

⇒「パラメータグループファミリ」を選択します:mysql8.0
⇒「タイプ」を選択:DBパラメータグループ
⇒グループ名と説明を入力します。 [作成]をクリックします。

Create Parameter Group

⇒ここで、作成したパラメータグループをクリックします。
⇒[パラメータ]で、特定のパラメータを編集し、次の値を設定します。
⇒パラメータの編集:「log_output」⇒値をTABLEからFILEに変更します
⇒パラメータの編集:「slow_query_log」⇒値をBLANKから1に変更します
⇒パラメータの編集:「general_log」⇒値をBLANKから1に変更します

これで、オプショングループとパラメータグループが設定されました。 それでは、これらのグループをRDSに割り当てましょう。

⇒RDSダッシュボードに移動します。
⇒作成したRDSをクリックします。
⇒[変更]をクリックします。
⇒ページを下にスクロールして、「データベースオプション」セクションに移動します。
⇒「DBパラメータグループ」で、作成したパラメータグループを選択します。
⇒「オプショングループ」で、作成したオプショングループを選択します。

Tweak RDS Settings

これで、すべてRDSが設定されました。 上記の手順が完了したら、CloudWatchにデータを入力するのに20〜30分かかります(注:ログのサイズによってはさらに時間がかかる場合があります)。

CloudWatchがすべてのログを収集すると、CloudWatchダッシュボードの下に監査ログが表示されます。 次の画像のようになります。

CloudWatch Log Groups

AWSエキスパートをお探しですか? ここでチェックアウト

S3バケットを作成する(CloudWatch監査ログを保存するため)

⇒AmazonS3ダッシュボードに移動します。
⇒新しいバケットを作成します。
⇒バケットを作成したら、バケットを開いて[権限]タブに移動します。
⇒CloudWatchがオブジェクトをバケットに配置できるようにする必要があります(書き込みアクセス)
⇒バケットポリシーの[編集]ボタンをクリックします。 次のコードを入力します。

{{
「バージョン」:「2012-10-17」、
"声明": [
{{
「効果」:「許可」、
"主要": {
「サービス」:「logs.YOUR-REGION.amazonaws.com」//すなわちlogs.us-east-1.amazonaws.com
}、
「アクション」:「s3:GetBucketAcl」、
「リソース」:「arn:aws:s3:::BUCKET_NAME_HERE」
}、
{{
「効果」:「許可」、
"主要": {
「サービス」:「logs.YOUR-REGION.amazonaws.com」
}、
「アクション」:「s3:PutObject」、
「リソース」:「arn:aws:s3 ::: BUCKET_NAME_HERE / *」、
"調子": {
「stringEquals」:{
「s3:x-amz-acl」:「bucket-owner-full-control」
}
}
}
]}

IAMロールの作成(これをLambda自動化に使用します)

次に、Lambda関数の設定で使用されるIAMロールを作成します。 AWS Lambdaサービスには、イベントをログに記録し、作成したS3バケットに書き込むためのアクセス許可が必要です。

「AmazonS3FullAccess」、「CloudWatchLogsFullAccess」、「CloudWatchEventsFullAccess」ポリシーを使用して、IAMロール「Export-RDS-CloudWatch-to-S3-Lambda」を作成します。

⇒AWSIAMダッシュボードを開きます。
⇒ロールに切り替えて、[ロールの作成]ボタンをクリックします。
⇒「ユースケース」で、Lambdaを選択し、「次へ」をクリックします。
⇒「AmazonS3FullAccess」を検索して選択します。
⇒「CloudWatchLogsFullAccess」を検索して選択します。
⇒「CloudWatchEventsFullAccess」を検索して選択します。
⇒ロール名を設定します:「Export-RDS-CloudWatch-to-S3-Lambda」そして「Createrole」をクリックします。

AWSエキスパートをお探しですか? ここでチェックアウト

Lambda(CloudWatch LogsのS3へのエクスポートを自動化する機能)

Lambda関数を使用すると、コードを関数の下に配置して、トリガーで実行できます。 サーバーを用意したり、このためにセットアップしたりする必要はありません。 とても簡単で効率的です!

⇒AWSLambdaダッシュボードに切り替えます。
⇒関数をクリックしてから、関数の作成ボタンをクリックします。

Create Lambda Function

⇒「スクラッチの作成者」を選択したままにします。
⇒「関数名」を設定します:Export-RDS-CloudWatch-Logs-To-S3
⇒「ランタイム」で、Python3.xを選択します。
⇒[権限]で、[既存のロールを使用する]を選択し、前の手順で作成したIAMロールを選択します。

Configure Lambda Function

⇒作成機能をクリックしてコードビューに移動し、次のスクリプトを入力します。

boto3をインポートする
OSのインポート
インポート日時

GROUP_NAME = os.environ ['GROUP_NAME'] DESTINATION_BUCKET = os.environ ['DESTINATION_BUCKET'] PREFIX = os.environ ['PREFIX'] NDAYS = os.environ ['NDAYS'] nDays = int(NDAYS)

currentTime = datetime.datetime.now()
StartDate = currentTime – datetime.timedelta(days = nDays)
EndDate = currentTime – datetime.timedelta(days = nDays – 1)

fromDate = int(StartDate.timestamp()* 1000)
toDate = int(EndDate.timestamp()* 1000)

BUCKET_PREFIX = os.path.join(PREFIX、StartDate.strftime('%Y {0}%m {0}%d')。format(os.path.sep))

def lambda_handler(event、context):
client = boto3.client('logs')
client.create_export_task(
logGroupName = GROUP_NAME、
fromTime = fromDate、
to = toDate、
destination = DESTINATION_BUCKET、
destinationPrefix = BUCKET_PREFIX
)。

⇒次に、[構成]⇒[環境変数]をクリックします。
⇒4つの変数を作成する必要があります。
⇒DESTINATION_BUCKET:<S3バケットの名前>
⇒GROUP_NAME:<エクスポートするログのグループ名>
⇒NDAYS:1
⇒プレフィックス:エクスポートされたログ

Lambda Environment Variables

⇒了解しました。これで設定は完了です。 関数を保存します。

それでは、このラムダ関数を実行するように自動化を設定しましょう。

⇒次に、CloudWatchダッシュボードにアクセスします。
⇒イベント⇒ルールに移動します。
⇒[ルールの作成]をクリックします。
⇒[イベントソース]で、[スケジュール]を選択します。
⇒ラムダ関数を自動的に実行するには、固定レートまたはcron式を設定します。
⇒[ターゲット]で、[ラムダ関数]を選択します。
⇒[関数]で、前の手順で作成した関数を選択します。

Cron to Execute Lambda Function

これですべてです。 これで、RDSログをS3に自動的にエクスポートする環境が設定されました。 必要な限りログを保持できます。 ただし、それでも問題が発生する場合は、ここにコメントを投稿してください。 ご連絡をお待ちしております!!

AWSエキスパートをお探しですか? ここでチェックアウト