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


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

協栄情報の陸です

やりたいこと

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

利用するサービス

  • Lambda
  • Amazon S3
  • CloudWatch ロググループ

構成図

file

操作ステップ

Lambda

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

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

Amazon S3

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

CloudWatch ロググループ

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

結果

異常発生ない場合

独自のサービスに合わせてコード内の情報を修正します。
file
その後、テストを行い、最後に
Amazon S3バケットでインポートが成功したかどうかを確認します。
file
file
file

異常発生する場合

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

注意点

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"
                }
            }
        }
    ]
}
Last modified: 2024-02-05

Author