terraform
을 통해 자동화 해봅시다.terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "4.17.1"
}
}
}
provider "aws" {
profile = var.profile
region = "ap-northeast-2"
}
variable "profile" {
type = string
default = "ABC"
}
variable "user_id" {
type = string
default = "ABC"
}
variable "lambda_function_name" {
default = "lambda_function"
}
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
에 /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 함수
를 생성합니다.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에서 로그 보기]
로그 스트림
이 생성되어 있는 것을 확인할 수 있습니다.