この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
協栄情報の陸です
やりたいこと
Lambda関数を使ってCloudWatchからAmazon S3バケットにログのグループをインポートします。
利用するサービス
- Lambda
- Amazon S3
- CloudWatch ロググループ
構成図
操作ステップ
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"
}
}
}
]
}