【Terraform】Terraform ~ s3 ファイル到達の監視を考える ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2025/09/17/224604

の続き。

今回は、これをTerraformコードで設定できるようにする

【1】サンプル

1)フォルダ構成

├── lambda
│   └── main.py
├── local.tf
├── s3.tf
├── cloudwatch.tf
├── iam.tf
└── lambda.tf

lambda/main.py

* 以下の関連記事のサンプルを参照

https://dk521123.hatenablog.com/entry/2025/09/17/224604

local.tf

provider "aws" {
  region = "us-west-2"
}

# 対象の既存バケット名リスト
locals {
  lambda_function_name = "demo-lambda"
  s3_buckets = [
    "your-existing-bucket-a",
    "your-existing-bucket-b",
    "your-existing-bucket-c"
  ]
}

s3.tf

# 既存バケットをデータソースでまとめて参照
data "aws_s3_bucket" "target" {
  for_each = toset(local.s3_buckets)
  bucket   = each.value
}

# Lambdaへのinvoke権限 (for_eachで全バケット分)
resource "aws_lambda_permission" "allow_s3" {
  for_each = data.aws_s3_bucket.target

  statement_id  = "AllowExecutionFromS3-${each.key}"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.s3_event.function_name
  principal     = "s3.amazonaws.com"
  source_arn    = each.value.arn
}

# S3イベント通知 → Lambda (for_eachで全バケット分)
resource "aws_s3_bucket_notification" "notify" {
  for_each = data.aws_s3_bucket.target

  bucket = each.value.id

  lambda_function {
    lambda_function_arn = aws_lambda_function.s3_event.arn
    events              = ["s3:ObjectCreated:*", "s3:ObjectRemoved:*"]
  }

  depends_on = [ aws_lambda_permission.allow_s3 ]
}

cloudwatch.tf

resource "aws_cloudwatch_log_group" "demo_log_group" {
  name = "/aws/lambda/${local.lambda_function_name}"
  retention_in_days = 30
}

iam.tf

# Lambda用IAMロール
resource "aws_iam_role" "lambda_role" {
  name = "lambda_s3_event_role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect = "Allow",
        Principal = { Service = "lambda.amazonaws.com" },
        Action = "sts:AssumeRole"
      }
    ]
  })
}

resource "aws_iam_role_policy" "lambda_policy" {
  role = aws_iam_role.lambda_role.id
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      # すべての対象バケットにアクセス許可
      {
        Effect = "Allow",
        Action = [
          "s3:GetObject"
        ],
        Resource = [
          for bucket in local.s3_buckets : "arn:aws:s3:::${bucket}/*"
        ]
      },
      # CloudWatch Logs書き込み用
      {
        Effect = "Allow",
        Action = [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ],
        Resource = "*"
      }
    ]
  })
}

lambda.tf

# Lambdaをアップロードする際にzipにする必要があるので
# ファイルをZIP圧縮する
data "archive_file" "demo_zip" {
  type        = "zip"
  source_dir  = "${path.module}/lambda"
  output_path = "${path.module}/outputs/demo_lambda.zip"
}

# Lambda関数の作成
resource "aws_lambda_function" "demo_lambda" {
  function_name    = local.lambda_function_name
  handler          = "main.lambda_handler"
  runtime          = "python3.13"
  filename         = data.archive_file.demo_zip.output_path
  source_code_hash = filebase64sha256(data.archive_file.demo_zip.output_path)
  role = aws_iam_role.demo_lambda_role.arn
  environment {
    variables = {
      LOG_LEVEL = "INFO"
    }
}

関連記事

Terraform ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/05/000224
Terraform ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/09/222057
Terraform ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/05/03/000000
Terraform ~ local ~
https://dk521123.hatenablog.com/entry/2023/12/24/173633
Terraform ~ tfstate / Backend ~
https://dk521123.hatenablog.com/entry/2023/05/05/004939
Terraform ~ Terraformあれこれ ~
https://dk521123.hatenablog.com/entry/2023/05/15/205352
Terraform ~ AWS Lambda / 入門編 ~
https://dk521123.hatenablog.com/entry/2024/05/30/010920
Terraform ~ 複数環境へデプロイすることを考える ~
https://dk521123.hatenablog.com/entry/2023/05/06/003645
Lambda ~ Python / 入門編 ~
https://dk521123.hatenablog.com/entry/2021/10/07/103317
Lambda ~ Python / 外部モジュール追加 ~
https://dk521123.hatenablog.com/entry/2024/05/25/005456
Lambda ~ Python / S3トリガー ~
https://dk521123.hatenablog.com/entry/2024/05/23/162229
datadog ~ s3 ファイル到達の監視を考える ~
https://dk521123.hatenablog.com/entry/2025/09/17/224604
Terraform ~ s3 access log with EventBridge ~
https://dk521123.hatenablog.com/entry/2025/09/22/184009