AWS CloudWatchログをLambdaでS3にエクスポートする
AWS CloudWatchログをLambdaでS3にエクスポートしてみたいと思います。
このLambdaはCloudWatchEventで日次で動かし、その日の範囲のログをエクスポートする、といったことを想定しています。
S3はWebホスティングできるので、ホームページとすることができます。chart.jsなどでログをグラフ化したい、といったことはお客さんの要望としては十分あり得ると思います。※これは個人の妄想です
S3バケットに権限を設定する
CloudWatchのログをS3にエクスポートする際は、対象のバケットのバケットポリシーを設定する必要があります。
以下、バケットポリシーの例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "s3:GetBucketAcl",
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-exported-logs",
"Principal": { "Service": "logs.us-west-2.amazonaws.com" }
},
{
"Action": "s3:PutObject" ,
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-exported-logs/*",
"Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } },
"Principal": { "Service": "logs.us-west-2.amazonaws.com" }
}
]
}
赤字の部分を各自の環境に合わせて変更する必要があるようです。
Lambdaを作成する
ではLambdaを作成してみます。
'use strict';
const aws = require('aws-sdk');
aws.config.update({region: 'us-east-2'});
exports.handler = (event, context, callback) => {
const s3 = new aws.S3();
const cloudwatchlogs = new aws.CloudWatchLogs();
const response = cloudwatchlogs.createExportTask(
{
'logGroupName': '/aws/lambda/cognito-get-user',
'from': 1520787200000, // とりあえず試すだけなのでべた書き
'to': 1524873600000, // とりあえず試すだけなのでべた書き
'destination': 'aaddddfadf',
'destinationPrefix': String(new Date())
}, function(err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
}
}
);
callback(null);
};
これで、指定したバケットに指定したfrom~toの時間のログがエクスポートされます。
ちなみに、destinationPrefixは必須項目ではありません。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント