#はじめに
こんにちは、山田です。
今回は、CloudWatchLogsにあるログを30日経過後S3にエクスポートする方法について記載していきます。
#構成図
構成図は以下の通りです。
①:EC2インスタンスにCloudWatchエージェントを導入し、対象のログがCloudWatchLogsに送られるように設定する。
②:S3バケットを作成し、CloudWatchLogsからのアクセスを許可するようにバケットポリシーを変更する。
②:30日前のログをS3にエクスポートするLamnbda関数を準備する。
④:EventBrigdeにて毎日23:59にLambda関数が実行されるようにスケジューリングする。
#S3バケットの作成
①:AWS管理コンソール -> S3 -> バケット -> バケットを作成をクリックし、一意の名前でバケットを作成する。
②:バケット作成後、以下のようにバケットポリシーを変更しCloudWatchLogsがアクセスできるように設定する。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::<対象のバケット名>"
},
{
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<対象のバケット名>/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
#Lambda関数の作成
①:AWS管理コンソール -> Lambda -> 関数 -> 関数の作成をクリックする。
②:以下のようにコードを記述する。
import boto3
import datetime
log_group_name = '<対象のロググループ名>'
log_stream_name = '<対象のリグストリーム名>'
s3_bucket_name = '<対象のS3バケット名>'
s3_prefix = '<S3のプレフィックス>'
def lambda_handler(event, context):
#実行日取得
to_time = datetime.datetime.now()
#30日前取得
from_time = datetime.datetime.now() - datetime.timedelta(days=30)
#エポック時刻取得(float型)
epoc_from_time = from_time.timestamp()
epoc_to_time = to_time.timestamp()
#エポック時刻をミリ秒にしint型にキャスト
m_epoc_from_time = int(epoc_from_time * 1000)
m_epoc_epoc_to_time = int(epoc_to_time * 1000)
client = boto3.client('logs')
response = client.create_export_task(
logGroupName = log_group_name,
logStreamNamePrefix = log_stream_name,
fromTime = m_epoc_from_time,
to = m_epoc_epoc_to_time,
destination = s3_bucket_name,
destinationPrefix = s3_prefix
)
return response
③:S3のアクセス権限が付与されているIAMロールを設定する。
#EventBridgeの作成
①:AWS管理コンソール -> Amazon EventBridge -> ルール -> ルールを作成をクリックする。
②:以下のように、毎日23:59に発動されるようにスケジューリングを組む。
③:ターゲットで先ほど作成したLambda関数を指定する。
#動作確認
①:対象のバケットにログが保管されているか確認する。
②:エクスポートされたログは、圧縮されているのでログの中身を確認するときは解凍する必要がある。
解凍後以下のようにログを見ることができれば完了です。