AWS CloudWatchログをLambdaでS3にエクスポートする

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は必須項目ではありません。

参考サイト

createExportTask参考サイト

コメント

タイトルとURLをコピーしました