Lambda Cron 예제(Terraform)

8264 단어 lambdaawsterraform

소개



서버리스 인프라로 전환할 때 사람들이 경험하는 일반적인 문제는 cron을 구성할 위치를 찾는 것입니다.

이 기사에서는 EventBridge를 사용하여 일정에 따라 람다를 트리거하는 방법을 살펴보겠습니다. Terraform을 사용하여 이를 구현할 것입니다.

Golang 람다 설정



람다 생성 섹션은 이미 GolangPython에서 다룬 내용이므로 생략하겠습니다.

이 예제에서는 간단한 Golang Hello World 예제를 사용합니다.

main.go를 만든 다음 다음 golang 스니펫을 추가합니다.

package main

import (
    "log"

    "context"

    "github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context) error {
    log.Println("Golang Lambda executed via Eventbridge Cron")

    return nil
}

func main() {
    lambda.Start(handler)
}


그런 다음 다음 CLI 명령을 실행하여 .zip 파일을 생성합니다.

# Initialise our golang project
go mod init example.com/demo
go get github.com/aws/aws-lambda-go/lambda

# If you are on a mac, let Go know you want linux
export GOOS=linux
export GOARCH=amd64
export CGO_ENABLED=0

# Build our lambda
go build -o hello

# Zip up our binary ready for terraform
zip -r function.zip hello


Terraform 설정



main.tf를 만든 다음 이 terraform 스니펫을 추가합니다.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

# Configure the AWS Provider

provider "aws" {
  region = "eu-west-1"
}


이를 통해 terraform은 우리가 AWS 공급자를 사용하고 싶다는 것과 eu-west-1 지역에서 작업할 것임을 알 수 있습니다.

이제 CLI에서 이를 실행하여 terraform을 초기화할 수 있습니다.

terraform init


Terraform에서 Lambda 생성



lambda.tf를 만든 다음 이 terraform 스니펫을 추가합니다.

# Create out lambda, using a locally sourced zip file
resource "aws_lambda_function" "demo_lambda_hello_world" {
  function_name = "demo-lambda-hello-world"
  role          = aws_iam_role.demo_lambda_role.arn
  package_type  = "Zip"
  handler       = "hello"
  runtime       = "go1.x"

  filename         = "function.zip"
  source_code_hash = filebase64sha256("function.zip")

  depends_on = [
    aws_iam_role.demo_lambda_role
  ]

  tags = {
    Name = "Demo Lambda Hello World"
  }
}


Lambda에 대한 IAM 역할 생성



람다가 작동하려면 몇 가지 기본 권한이 필요합니다. 처음에는 이상하게 보일 수 있지만 일단 읽어보면 상당히 간단합니다.

기본적으로 이 역할은 Lambda에서 맡아 Cloudwatch Logs에 쓸 수 있는 액세스 권한을 부여합니다.

iam.tf를 만든 다음 이 terraform 스니펫을 추가합니다.

# Store the AWS account_id in a variable so we can reference it in our IAM policy
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}

locals {
  account_id = data.aws_caller_identity.current.account_id
}

# Lambda IAM Role
resource "aws_iam_role" "demo_lambda_role" {
  name = "demo-lambda-role"

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

  inline_policy {
    name = "demo-lambda-policies"
    policy = jsonencode({
      "Version" : "2012-10-17",
      "Statement" : [
        {
          "Effect" : "Allow",
          "Action" : "logs:CreateLogGroup",
          "Resource" : "arn:aws:logs:${data.aws_region.current.name}:${local.account_id}:*"
        },
        {
          "Effect" : "Allow",
          "Action" : [
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource" : [
            "arn:aws:logs:${data.aws_region.current.name}:${local.account_id}:log-group:/aws/lambda/*:*"
          ]
        }
      ]
    })
  }
}


Cron 설정



이제 람다 설정이 있으므로 할 수 있습니다set up the cron.
  • 다음과 같이 cron을 사용할 수 있습니다. cron(*/5 * * * ? *)
  • 또는; 예를 들어 비율을 사용할 수 있습니다. 비율(5분)

  • eventbridge.tf를 만든 다음 이 terraform 스니펫을 추가합니다.

    # Create our schedule
    resource "aws_cloudwatch_event_rule" "demo_lambda_every_5_minutes" {
      name                = "demo-lambda-every-5-minutes"
      description         = "Fires every 5 minutes"
      schedule_expression = "rate(5 minutes)"
    }
    
    # Trigger our lambda based on the schedule
    resource "aws_cloudwatch_event_target" "trigger_lambda_on_schedule" {
      rule      = aws_cloudwatch_event_rule.demo_lambda_every_5_minutes.name
      target_id = "lambda"
      arn       = aws_lambda_function.demo_lambda_hello_world.arn
    }
    


    Lambda 권한 추가



    크론이 작동하려면 Lambda에 EventBridge가 호출할 수 있음을 알려야 합니다.

    lambda.tf 내부에 다음 terraform 스니펫을 추가합니다.

    resource "aws_lambda_permission" "allow_cloudwatch_to_call_split_lambda" {
      statement_id  = "AllowExecutionFromCloudWatch"
      action        = "lambda:InvokeFunction"
      function_name = aws_lambda_function.demo_lambda_hello_world.function_name
      principal     = "events.amazonaws.com"
      source_arn    = aws_cloudwatch_event_rule.demo_lambda_every_5_minutes.arn
    }
    


    Terraform 배포



    먼저 실행

    terraform plan
    


    이제 확신이 들면 다음을 실행할 수 있습니다.

    terraform apply
    


    그러면 terraform 파일에서 리소스가 생성됩니다.

    실행 중인지 확인



    5분 동안 실행된 후 Cloudwatch Logs 그룹을 확인하여 트리거되었는지 확인할 수 있습니다.

    작동하는지 확인하려면 콘솔에서 Lambda를 찾은 다음 "모니터링"을 선택하십시오. 이제 "최근 호출"에서 실행 중인 람다가 표시되어야 합니다.



    대청소



    실험 중이었다면 완료되면 다음을 실행하여 리소스를 제거할 수 있음을 기억하십시오.

    terraform destroy
    


    Lambda는 호출 비용이 저렴하지만 불필요한 청구를 피하기 위해 항상 계정을 깨끗하게 유지하는 것이 좋습니다.

    그리고 그게 다야! 이제 EventBridge를 사용하여 Lambda cronjob을 구성했습니다.

    좋은 웹페이지 즐겨찾기