기본 구조 완성. 파일 정리하면 끝. 일단 배포 완료

todo
- tf 파일의 slack_url 환경변수 등으로 정리
- 배포하는 스크립트? 필요할 것 같기도 함
This commit is contained in:
bumpsoo 2024-07-03 05:06:54 +09:00
parent 91e986b475
commit 1b8b580554
6 changed files with 230 additions and 82 deletions

53
main.py
View file

@ -1,13 +1,12 @@
from datetime import datetime
import json
from typing import Dict, Any, Final, List, Optional
import requests
from typing import Dict, Any, Final, Optional
import os
import time
from dataclasses import dataclass
import menu
import schedule
import slack
# Load environment variables (recommended for sensitive data)
@ -37,43 +36,35 @@ def __parse_param(evt: Dict[str, Any]) -> Optional[Param]:
return Param(str(evt.get('slack_url')), date, cnt + 1)
def retry(p: Param, lambda_arn: str, schedule_role_arn: str) -> Dict[str, str]:
schedule.one_time_schedule(lambda_arn, schedule_role_arn, RETRY_INTERVAL, p)
schedule.one_time_schedule(lambda_arn, schedule_role_arn, RETRY_INTERVAL, p.slack_url, p.date, p.count)
return {'statusCode': '200', 'body': f'retry {p.count}'}
def wrap_return(ret: bool) -> Dict[str, str]:
return {
'statusCode': '200',
'body': 'success' if ret else 'fail'
}
def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, str]:
os.environ['TZ'] = 'Asia/Seoul'
time.tzset()
lambda_arn = os.environ['LAMBDA_ARN']
if context.invoked_function_arn is None:
raise Exception('None???')
lambda_arn = str(context.invoked_function_arn)
schedule_role_arn = os.environ['SCHEDULE_ROLE_ARN']
bucket_name = os.environ['S3_BUCKET_NAME']
param = __parse_param(event)
if param is None:
return PARAM_ERROR
menus = menu.menu(param.date)
menus_without_img = [ x for x in menus if x.menu_image is None ]
if param.count < MAX_RETRY and (len(menus) == 0 or len(menus_without_img) > 0):
print('menus', menus)
print('menus_without_img', menus_without_img)
print('param', param)
if param.count <= MAX_RETRY and (len(menus) == 0 or len(menus_without_img) > 0):
return retry(param, lambda_arn, schedule_role_arn)
if len(menus) == 0:
# 슬랙 메시지 전송( 오늘의 메뉴 존재 X )
return retry(param, lambda_arn, schedule_role_arn)
# Extract relevant data for your Slack message (adjust as needed)
message_content: str = f"*Important Data from External API*\n"
message_content += f"`\n{json.dumps(api_data, indent=4)}\n`"
# Construct payload for the Slack webhook
slack_payload: Dict[str, Any] = {
"text": message_content,
"blocks": [
{"type": "section", "text": {"type": "mrkdwn", "text": message_content}}
]
}
# Send the message to Slack
slack_response: requests.Response = requests.post(
'',
#SLACK_WEBHOOK_URL,
data=json.dumps(slack_payload),
headers={'Content-Type': 'application/json'}
)
slack_response.raise_for_status()
return {
'statusCode': '200',
'body': json.dumps('Data successfully sent to Slack.')
}
for each in menus:
each.resize_image(bucket_name, param.date)
return wrap_return(slack.send(param.slack_url, param.date, menus))