サイトアイコン 協栄情報ブログ

LambdaよりCloudWatchログをS3に保存方法紹介


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

協栄情報の陸です

やりたいこと

Lambda関数を使ってCloudWatchからAmazon S3バケットにログのグループをインポートします。

利用するサービス

構成図

操作ステップ

Lambda

まずLambda関数を作成し、そこに与えられたロールにCloudWatch、Amazon S3を操作する権限を持たせます。

それを使うためのテストコードを書きます。

Amazon S3

ロググループを受け取る良いバケットを作成し、Lambdaエクスポートしたオブジェクトをバケットに配置できるようにするバケットポリシーを作成します。

CloudWatch ロググループ

CloudWatchのロググループの中からエクスポートしたいロググループを探します。 名前をLambda関数にコピーしてダウンロードする

結果

異常発生ない場合

独自のサービスに合わせてコード内の情報を修正します。

その後、テストを行い、最後に
Amazon S3バケットでインポートが成功したかどうかを確認します。


異常発生する場合

s3 のポリシーが設定されていない場合は、GetBucketAcl エラープロンプトが表示されます。

注意点

client.create_export_taskメソッドのforTimeとtoはどちらもミリ秒単位で、そうでなければインポートされたデータはws-logs-write-testファイルのみで、ログファイルはありません。

コードとポリシー

Code

import boto3
import collections
from datetime import datetime, date, time, timedelta

def lambda_handler(event, context):
    yesterday = datetime.combine(date.today()-timedelta(1),time())

    today = datetime.combine(date.today(),time())

    unix_start = datetime(1970,1,1)

    client = boto3.client('logs')

    response = client.create_export_task(
    logGroupName='/aws/lambda/CloudWatch_Test',
    fromTime = int((yesterday-unix_start).total_seconds() * 1000),
    to = int((today-unix_start).total_seconds() * 1000),
    destination='log-2',
    destinationPrefix='Lambda-logs-{}'.format(yesterday.strftime("%Y-%m-%d"))
    )

    return 'Response from export task at {} :\n{}'.format(datetime.now().isoformat(),response)

Policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::s3b-p349-005-test"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::s3b-p349-005-test/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
モバイルバージョンを終了