CloudWatch LogsからS3にエクスポート(Lambda/Python)

CloudWatch Logsから、LmabdaでログをS3にエクスポートする。対象のロググループとバケット内の第一階層を引数で指定するようにした。今回の事例ではエクスポートの範囲は「前日0時〜実行当日の0時」となる。 参考 boto3 API Reference LambdaよりCloudWatchログをS3に保存方法紹介 ちなみに過去マネコンから実行する手順書いた。 CloudWatchLogsからS3へログをエクスポートする 今回の検証に使用したアイテム(個人メモ) アイテム 名称 Lambda用IAMロール lambda_basic_execution Lambda関数 log-export-function S3バケット log-export-xxxxxxxx Lambda用IAMロールの権限はlogsフルアクセスのみ。S3もいると思ってたがなくてもできた。バケットポリシー側で許可しているからか。S3バケット名は環境変数で指定した。ちなみに対象バケットは、動作不可になるためオブジェクトロックを設定しないこと。 S3バケットポリシー(log-export-xxxxxxxx) { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::log-export-xxxxxxxx" }, { "Effect": "Allow", "Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::log-export-xxxxxxxx/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] } Lambdaコード(Python3.9) import boto3 import collections from datetime import datetime, date, time, timedelta import os def lambda_handler(event, context): log_g = event....

December 19, 2021

Terraform loop処理の応用編(4) - Lambda

今日のTerraform loopネタはLambda関数作成。ログ監視の一貫なので、CloudWatchLogsのロググループとサブスクリプションフィルタ作成も一緒にやる。 この例でのディレクトリ構成は以下の通り。lambda/upload配下のzipファイルはTerraformにより生成されたもので、初回は空である。 work_dir ├── config.tf #初期化ファイル ├── lambda │ ├── code │ │ ├── func001 │ │ │ └── lambda-func001.py │ │ ├── func002 │ │ │ └── lambda-func002.py │ │ └── func003 │ │ └── lambda-func003.py │ └── upload │ ├── lambda-func001.zip │ ├── lambda-func002.zip │ └── lambda-func003.zip ├── lambda.auto.tfvars ├── lambda_cwl.tf ├── terraform.tfvars #regionのみ定義 └── variables.tf 最初に、すべて定数で記述したパターン。 lambda_logs.tf(定数バージョン) ################################################# # Lambda archive data ################################################# data "archive_file" "data-lambda-func001" { type = "zip" source_dir = "lambda/code/func001" output_path = "lambda/upload/lambda-func001....

December 12, 2021

Terraform loop処理の応用編(3) - Event rule

過去記事Terraform loop処理の応用編(2)で、AWS Code兄弟のリソースをTerraformのloop処理で作成した。それとは別に、CodePipelineのトリガーをEventBridgeルールにしたかったので追加処理を書いた。パイプラインの数だけ対応するルールを作成するため、これもloop処理で書く。Code兄弟の分も含めて全て同じtfファイルにまとめてもよいが、ここでは分割している。 以下tfコード本体に、ルールとターゲットを作成する処理を書く。 event_rule.tf ######################################## # EventBridge rule ######################################## resource "aws_cloudwatch_event_rule" "pln-rule" { for_each = var.events_param_list name = lookup(each.value, "name") description = "Start the pipeline when detect CodeCommit repository state change." event_pattern = <<-EOT { "source": ["aws.codecommit"], "detail-type": ["CodeCommit Repository State Change"], "resources": ["arn:aws:codecommit:ap-northeast-1:012345678910:${lookup(each.value, "repo_name")}"], "detail": { "event": ["referenceCreated", "referenceUpdated"], "referenceType": ["branch"], "referenceName" : ["master"] } } EOT } ######################################## # EventBridge target ######################################## resource "aws_cloudwatch_event_target" "pln-rule" { for_each = var....

December 11, 2021

Terraform loop処理の応用編(2) - CI/CD

前回投稿Terraform loop処理の応用編 の続き。CodeDeployを作成するTerraformコードに、CodeCommit, CodePipelineを追加して通して作ってみる。 cicd.tf #################################### # CodeCommit #################################### resource "aws_codecommit_repository" "codecommit_repos" { for_each = var.codecommit_param_list repository_name = lookup(each.value, "repository_name") description = lookup(each.value, "description") } #################################### # CodeDeploy Application #################################### resource "aws_codedeploy_app" "codedeploy" { for_each = var.deploy_param_list name = lookup(each.value, "name") compute_platform = "Server" } #################################### # CodeDeploy Deployment Group #################################### resource "aws_codedeploy_deployment_group" "codedeploy_grp" { for_each = var.deploy_param_list app_name = lookup(each.value, "name") deployment_group_name = lookup(each.value, "deployment_group_name") depends_on = [aws_codedeploy_app.codedeploy] service_role_arn = var....

December 6, 2021

Terraform loop処理の応用編

過去記事Terraform loop処理の超シンプルな例 の続き。loopで作成したTerraformリソースの参照方法を検証したらやはりハマったので記録書いておく。 前回はCodeCommitリポジトリを作成したが、今回はそれ抜きでCodeDeployのリソースを作成した。CodeDeployは (1)アプリケーションと、(2)デプロイメントグループの2つのリソースを作成する。(2)は(1)に依存している。 作業ディレクトリ構成 work_dir ├── cicd.auto.tfvars ├── cicd.tf ├── config.tf #初期化用config ├── terraform.tfvars #regionのみ定義 └── variables.tf cicd.tf (リソース作成用コード) #################################### # CodeDeploy Application #################################### resource "aws_codedeploy_app" "codedeploy" { for_each = var.deploy_param_list name = lookup(each.value, "name") compute_platform = "Server" } #################################### # CodeDeploy Deployment Group #################################### resource "aws_codedeploy_deployment_group" "codedeploy_grp" { for_each = var.deploy_param_list app_name = lookup(each.value, "name") deployment_group_name = lookup(each.value, "deployment_group_name") service_role_arn = var.deploy_role deployment_config_name = "CodeDeployDefault.AllAtOnce" ec2_tag_set { ec2_tag_filter { key = "Name" type = "KEY_AND_VALUE" value = lookup(each....

December 5, 2021

Terraform loop処理の超シンプルな例

前回投稿で言及したTerraformのループ処理を、めっちゃシンプルなパターンでやってみた。 前回投稿 Terraform loop処理のリンク集 参考記事 Terraformで配列をloopする時はfor_eachを使った方がいい やったこと Terraformのセットアップは割愛。作業ディレクトリには以下のtfコードがある。 work_dir/ ├── codecommit.tf ├── init.tf ├── variables.tf └── vpc.tf 以下は初期化ファイル。terraform init で初期化実行すみである。VPCも別途サクッと作ってある。ひとりPoCだからremote_stateにする必要もないのだが、なんとなくtfstateをS3に保管するためbackendの定義がある。 init.tf terraform { required_providers { aws = { source = "hashicorp/aws" version = "3.66.0" } } } terraform { required_version = "1.0.11" backend "s3" { bucket = "my-terraform-poc-repository" key = "poc/poc.tfstate" region = "ap-northeast-1" } } で、肝心のloop処理。最初なので脳に優しく、超シンプルなパターンでいく。CodeCommitリポジトリの作成はパラメータが少ないので、参考記事を参照し、これで試した。他にもパラメータが少ないやつならなんでもいいけど。今回セットする値はrepository_nameとdescriptionの2点だけ。 variable.tf variable "codecommit_param_list" { type = map(map(string)) default = { param1 = { repository_name = "repo001" description = "desciption for repo001" } param2 = { repository_name = "repo002" description = "desciption for repo002" } param3 = { repository_name = "repo003" description = "desciption for repo003" } } } codecommit....

November 23, 2021

AWSイベント監視 - CloudTrail + EventBridge + Lambdaでメールカスタマイズ(2)

以下過去記事の続き。この時はメール本文がJSON生データで送信された。これを、人間が状況を判別可能な状態までもっていきたい。 AWSイベント監視 - CloudTrail + EventBridge + Lambdaでメールカスタマイズ とういことで、再度検証。使用したAWS各種サービスのリソースは前回と同様で、Lambda関数のコードだけ入れ替え。何度も同じようなことをやっていて何がなんだか分からなくなっているがもうヤケクソ。 lambda_function.py (イベント監視メール通知用) import boto3 import json import os import re from botocore.exceptions import ClientError from datetime import datetime, timezone, timedelta from dateutil import parser print('Loading function') sns_arn = os.environ['SNS_TOPIC_ARN'] def lambda_handler(event, context): data = event s = json.dumps(data) e = json.loads(s) print(e) # eventから項目を抽出 dtl = e['detail'] #詳細(detail)を定義 e_type = e['detail-type'] # イベントタイプ 例:'AWS API Call via CloudTrail' t = e['time'] # 発生時刻 evt_name = dtl['eventName'] # イベント名 例:DeleteBucket evt_src = dtl['eventSource'] # イベントソース 例:s3....

November 21, 2021