자동화된 보고 시스템

발행: (2026년 1월 1일 오전 12:49 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

위에 제공된 Source 링크만으로는 번역할 텍스트가 포함되어 있지 않습니다. 번역이 필요한 전체 내용(본문, 코드 블록, 마크다운 등)을 제공해 주시면, 요청하신 대로 한국어로 번역해 드리겠습니다.

개요

  • AWS Lambda와 기타 서버리스 도구를 사용하여 일일 보고서를 자동화합니다.
  • 시스템은:
    • 여러 소스에서 데이터를 수집합니다.
    • PDF 보고서를 생성합니다.
    • 이메일로 보고서를 전송합니다.
    • 이 프로세스를 매일 트리거합니다.

이 가이드는 AWS에 대한 기본적인 이해가 있다고 가정합니다.

1단계: S3 버킷 만들기

  1. S3 서비스로 이동합니다.
  2. Create bucket를 클릭합니다.
  3. 버킷 이름을 지정합니다 (예: daily-reports-s3-bucket).
  4. 다른 설정은 기본값으로 두고 Create를 클릭합니다.

필요한 경우 이 버킷에 보고서를 저장합니다.

단계 2: SES에서 이메일 주소 확인

  1. Amazon SES를 엽니다.
  2. Identity Management 아래의 Email Addresses로 이동합니다.
  3. Verify a New Email Address를 클릭하고 이메일을 입력합니다.
  4. 받은 편지함을 확인하고 인증 링크를 클릭합니다.

인증을 하면 SES가 이 주소에서 이메일을 보낼 수 있습니다.

단계 3: Lambda 함수 작성

  1. AWS Lambda 로 이동하여 Create function 을 클릭합니다.
  2. Author from scratch 를 선택합니다.
    • Function name: daily-report-lambda
    • Runtime: Python 3.9 (또는 그 이후 버전)
  3. Create function 를 클릭합니다.

Lambda 함수 코드

기본 코드를 아래 코드로 교체합니다:

import boto3
from fpdf import FPDF
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

def lambda_handler(event, context):
    try:
        # PDF 보고서 생성
        pdf = FPDF()
        pdf.add_page()
        pdf.set_font("Arial", size=12)
        pdf.cell(200, 10, txt="Daily Report", ln=True, align="C")
        pdf.cell(200, 10, txt="This is your automated report.", ln=True)

        # PDF 저장
        report_path = "/tmp/daily_report.pdf"
        pdf.output(report_path)

        # S3에 업로드 (선택 사항)
        s3 = boto3.client('s3')
        bucket_name = "daily-reports-s3-bucket"
        s3.upload_file(report_path, bucket_name, "daily_report.pdf")

        # SES를 사용해 첨부 파일이 포함된 이메일 전송 (raw email 방식)
        ses = boto3.client('ses')
        msg = MIMEMultipart()
        msg['From'] = "sender_email@gmail.com"      # SES에서 인증된 발신자 이메일로 교체
        msg['To'] = "receiver_email@gmail.com"      # 수신자 이메일로 교체
        msg['Subject'] = "Daily Report"

        # 텍스트 본문 첨부
        body = MIMEText("Please find the attached report.", 'plain')
        msg.attach(body)

        # PDF 보고서 첨부
        with open(report_path, 'rb') as file:
            part = MIMEBase('application', 'octet-stream')
            part.set_payload(file.read())
            encoders.encode_base64(part)
            part.add_header('Content-Disposition',
                            f'attachment; filename={os.path.basename(report_path)}')
            msg.attach(part)

        # SES의 send_raw_email 로 이메일 전송
        response = ses.send_raw_email(
            Source=msg['From'],
            Destinations=[msg['To']],
            RawMessage={'Data': msg.as_string()}
        )

        return {"status": "success", "response": response}

    except Exception as e:
        return {"status": "error", "message": str(e)}

Step 4: 라이브러리를 로컬에 설치하고 배포 (선택 사항)

Lambda 런타임에는 fpdf가 포함되어 있지 않으므로 직접 패키징하세요:

pip install fpdf -t ./package
cd package
zip -r ../lambda_layer.zip .

생성된 ZIP(lambda_layer.zip)을 Lambda 함수에 레이어로 또는 함수 코드로 직접 업로드하세요.

5단계: EventBridge 트리거 설정

  1. EventBridge를 엽니다.
  2. Create rule을 클릭합니다.
    • Name: daily-report-trigger
    • Define pattern: Schedule
    • Cron expression: cron(0 9 * * ? *) (매일 UTC 09:00)
  3. Target 아래에서 Lambda 함수(daily-report-lambda)를 선택합니다.
  4. Create를 클릭합니다.

6단계: Lambda 함수 테스트

  1. Lambda 콘솔에서 Test 탭으로 이동합니다.
  2. 새 테스트 이벤트를 생성합니다(기본 템플릿은 비워두어도 됩니다).
  3. Test를 클릭합니다.

생성된 PDF 보고서가 수신자 메일함에 도착했는지 확인하세요.

서버리스 보고 시스템을 구축했습니다! 🎉

행복한 클라우드 학습

— Adeel Abbas

Back to Blog

관련 글

더 보기 »

RGB LED 사이드퀘스트 💡

markdown !Jennifer Davis https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%...

Mendex: 내가 만드는 이유

소개 안녕하세요 여러분. 오늘은 제가 누구인지, 무엇을 만들고 있는지, 그리고 그 이유를 공유하고 싶습니다. 초기 경력과 번아웃 저는 개발자로서 17년 동안 경력을 시작했습니다.