AWS CloudWatch LogsからS3へログを自動で保存するため、LambdaにPythonを書く(1/2)
AWSのCloudWatch LogsからS3にログをエクスポートができないを書きましたが、本来は本記事の内容を設定したかったんです。それなのに..。そのうちAWSにはこの機能が付きそうな気もする(希望)。それぐらい便利でよく使うイメージの設定です。
手順全体像
1. Amazon S3で準備をする
2. CloudWatch Logsでログをエクスポート出来るか確認する
3. Lambda準備
4. Python in Lambda
5. 定期的な動作設定
こんな感じ。本記事では1-3を書きます。4は続きの記事で書きます。こっち「リンク」。
1. Amazon S3で準備
先ずはS3の中にログをエクスポートする先のバケツを準備します
今回はバケットを作成も行います。その際、デフォルト暗号化を使う際は「AES-256」を選びます。KMSは非対応です by [AWS ドキュメント]。
バケット名は今回用途から「service-cloudwatchlogs」としています。リージョンはデータの転送元であるCloudWatchのリージョンと同じ、「アジアパシフィック(東京)(ap-northeast-1)」です。
次にバケットに利用させるアクセス権限をつけます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::<Your Bucket's Name>"
},
{
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<Your Bucket's Name>/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
「logs」のサービスからはGetBucketAclでバケットにアクセスする権限、PutObjectでバケット(+ プレフィックス)にファイル書き込みを許可してやります。「AWS 公式ドキュメント」を見ればもっと細かい説明があります。
あまりパブリックアクセスをさせるケースが無いとは思いますが、ブロックのパブリックアクセスは「オン=パブリックアクセスを禁じる」設定にしています。
2. CloudWatch Logsのログデータエクスポート確認
入れ物は出来たので、実際にログをエクスポートしてみましょう。
実際のCloudWatch にあるLog Groupsから送りたいロググループを選び、その「アクション」の中にエクスポート(データをAmazon S3にエクスポート)を選びます。
バケット名、さらにその下にディレクトリ(プレフィックス)が欲しいので入力して「エクスポート」実施。アクセス権限が正しく設定されていればエクスポートタスクが成功した旨、表示されます。
保存先のS3バケットを見ると、aws-logs-write-testの書き込みテスト結果ファイルがあれば正しく権限設定ができています。あと、既に溜まっていれば実際のログデータが格納されています。
3. Lambda準備
次にCloudWatch LogsをS3へ送るLambda関数を作ります。定期的な実行も併せて行います。
Lambda関数を一から作成を選び関数名入力とランタイムとしてPython3.8を使います。Lambdaにコーディングする内容は簡単なので、ランタイムはPython3系なら大丈夫だと思います。
次にRole設定が必要です。Lambdaでも関数毎に必要な権限を最小限で付けることを推奨とされます。既にCloudWatchとS3へのアクセス権限をLambda向けに作っていたら作成は不要です。今回は無いため、Roleを作ります。
IAMコンソールへのリンクがあります。優しい。
IAMからRole作成。
ポリシーも無いため、ポリシーを作成します。
ポリシーエディタに切り替えて、JSONで直接書きます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:CreateExportTask",
"s3:GetBucketAcl",
"s3:PutObject"
],
"Resource": "*"
}
]
}
logs:でCloudWatchへのアクセス、s3:でAmazon S3への許可を行ってます。
ポリシーに名前と説明(英語のみ)を記載、ポリシーがCloudWatch LogsとS3にだけ当たっている事を確認したら作成実施。
Role作成画面に戻り、右上の更新マークをおしてから先程作成したポリシーを選択し、次のステップへ進む。タグとロール名を付けたらロールを作成します。作成完了しました、旨のメッセージが出れば作成完了です。
Lambda関数作成の画面に戻り「既存のロールを使用する」を選択すると、先ほど作成したRoleが使えるので、それを選択し関数の作成を実行。
本記事としては、ここで中締め。次に実際にPythonコードで動かし、設定を続けていきます。次の記事「これ」。
引用
タイトル写真はUnsplashより
次記事
https://note.com/cavityyoukey/n/ne5ae744ba4c1
参考にさせて頂きました記事(Qiitaさんですが...)。今回のLambdaコードは参考にさせて頂き、非常に助かりました。コードは少し変えさせてもらってます。
この記事が気に入ったらサポートをしてみませんか?