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の大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント