[Terraform] Lambda 함수 -> CloudWatch logs : 리소스 생성 자동화

HYEOB KIM·2022년 6월 13일
1

Terraform

목록 보기
6/11

리소스 생성 자동화 아키텍처

디렉토리 구조

코드

provider.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "4.17.1"
    }
  }
}

provider "aws" {
  profile = var.profile
  region  = "ap-northeast-2"
}

variables.tf

  • 어떤 프로파일을 이용할 것인지, 유저 아이디는 무엇인지는 항상 변수 파일에 포함되는 내용입니다.
  • Lambda 함수의 이름을 작성합니다.
variable "profile" {
  type    = string
  default = "ABC"
}

variable "user_id" {
  type    = string
  default = "ABC"
}

variable "lambda_function_name" {
  default = "lambda_function"
}

role.tf

  • Lambda 함수를 생성하기 전에 AWSLambdaBasicExecutionRole 정책이 연결된 실행 역할을 생성합니다.
# 기존의 AWS 관리형 정책 AWSLambdaBasicExecutionRole의 메타데이터를 가져옵니다.
data "aws_iam_policy" "AWSLambdaBasicExecutionRole" {
  name = "AWSLambdaBasicExecutionRole"
}

resource "aws_iam_role" "lambda_function" {
  name               = "lambda_function_role"
  path               = "/"
  assume_role_policy = jsonencode(
    {
      "Version" : "2012-10-17",
      "Statement" : [
        {
          "Effect" : "Allow",
          "Principal" : {
            "Service" : "lambda.amazonaws.com"
          },
          "Action" : "sts:AssumeRole"
        }
      ]
    }
  )
}

resource "aws_iam_role_policy_attachment" "lambda_function" {
  role       = aws_iam_role.lambda_function.name
  policy_arn = data.aws_iam_policy.AWSLambdaBasicExecutionRole.arn
}

cloudwatch.tf

  • CloudWatch/aws/lambda/<Lambda 함수 이름>의 경로로 설정된 로그 그룹을 생성합니다.
resource "aws_cloudwatch_log_group" "lambda_function_log_group" {
  name              = "/aws/lambda/${var.lambda_function_name}"
  retention_in_days = 14   # 로그의 expire 기간
}

lambda.tf

  • Lambda 함수를 생성합니다.
  • 현재 경로에 lambda_function 폴더 내에 아래와 같은 lambda_function.py 파일 내용을 작성하고 zip으로 압축합니다.
# lambda_function.py

import os

def lambda_handler(event, context):
    print('## ENVIRONMENT VARIABLES')
    print(os.environ)
    print('## EVENT')
    print(event)
  • 실행 역할CloudWatch 로그 그룹 리소스가 모두 생성되었을 때, Lambda 함수가 생성되도록 합니다(depend on).
resource "aws_lambda_function" "lambda_function" {

  # 코드 파일은 반드시 zip으로 압축
  filename = "./lambda_function/${var.lambda_function_name}.zip"

  function_name = var.lambda_function_name

  role = aws_iam_role.lambda_function.arn

  # handler는 반드시 filename과 동일하게 작성
  handler = "${var.lambda_function_name}.lambda_handler"
  timeout = "600"

  #현재 Bug때문에 archive_file 사용불가 
  #source_code_hash = data.archive_file.example_lambda.output_base64sha256
  source_code_hash = filebase64sha256("./lambda_function/${var.lambda_function_name}.zip")

  runtime = "python3.9"

  tags = (
    {
      Name       = "${var.lambda_function_name}"
      Resource   = "lambda"
      CreateDate = "2022-06-13"
    }
  )

  depends_on = [
    aws_iam_role.lambda_function,
    aws_cloudwatch_log_group.lambda_function_log_group,
  ]
}

!중요

  • zip파일을 이용해 업로드할 때는 handler를 지정해주어야 합니다.
  • <Lambda 함수 이름>.lambda_handler의 형식으로 이름을 붙여줍니다.

테스트

  • AWS Lambda 콘솔에서 생성한 함수를 선택하고, 테스트 이벤트를 생성합니다.
    -테스트 버튼을 눌러 테스트 해봅니다.

  • [모니터링] > [CloudWatch에서 로그 보기]

  • 로그 스트림이 생성되어 있는 것을 확인할 수 있습니다.

profile
Devops Engineer

0개의 댓글