Lambda Cron 예제(Terraform)
소개
서버리스 인프라로 전환할 때 사람들이 경험하는 일반적인 문제는 cron을 구성할 위치를 찾는 것입니다.
이 기사에서는 EventBridge를 사용하여 일정에 따라 람다를 트리거하는 방법을 살펴보겠습니다. Terraform을 사용하여 이를 구현할 것입니다.
Golang 람다 설정
람다 생성 섹션은 이미 Golang 및 Python에서 다룬 내용이므로 생략하겠습니다.
이 예제에서는 간단한 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.
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을 구성했습니다.
Reference
이 문제에 관하여(Lambda Cron 예제(Terraform)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rhuaridh/lambda-cron-example-terraform-c8k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)