본문 바로가기

App

카카오톡 학식봇 만들기(AWS Dynamo DB with lambda) - 10

import json
import boto3
import crawling_INUmenu as im
def lambda_handler(event, context):
    body = json.loads(event["body"])
    typemenu_list = ["중식(백반)","중식(일품)","석식"]
    food_name = body["action"]["params"]["food_list"]
    user_id = body["userRequest"]["user"]["id"]
    
    # Date and index
    date_obj = json.loads(body["action"]["params"]["sys_date"])
    date = date_obj["date"]
    date_tmp = int(date[5:].replace('-',''))
    diff_index = im.today_index + date_tmp - im.short_date
    
    
    # food list
    food_list = []
    if typemenu_list[i] in food_name:
    for i in range(len(typemenu_list)):

            for j in range(len(im.all_menu_list[diff_index][i])):
                food_list.append(im.all_menu_list[diff_index][i][j])
    # DB insert 
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('FHistory')
    table.put_item(
            Item={
                'Userid': user_id,
                'Write_Date':date,
                'food_name':food_name
            }
        )
    
    result = {
        "version": "2.0",
        "template":{
            "outputs": [
                {
                    "simpleText":{
                        "text":"사용자 id: {}\n날짜 : {}, 음식이름 : {} 추가되었습니다.".format(user_id,date, food_name)
                    }
                }    
            ]
        }
    }
    return {
        'statusCode': 200,
        "body": json.dumps(result, sort_keys=True ,indent=4),
        "headers": {
            "Access-Control-Allow-Origin": "*",
        }
    }

Dynamo DB에 Userid를 키값으로 가지는 DB 데이터들을 넣는 부분을 추가했다.

 

먼저 Lambda에서 Dynamodb에 접근하기위해서 awscli와 boto3에대한 패키지파일을 Lambda 함수의 새로운 레이어로 넣고 import를 시켰지만, import 실패가 떠서 오류 해결에 많은 시간을 쏟았다..

 

문제점은 어제 업데이트한 파이썬의 버전 문제였고, 어제 내가 업데이트한 3.9 버전의 boto3 패키지를 레이어로 삽입해서 난 오류였다.

 

컴퓨터에 설치되어있는 기존 파이썬 3.9를 모두 삭제하고.. 3.7로 다시 설치한 후 레이어에 업로드하자 정상적으로 임포트 되었다.

 

임포트된 후에도 오류가 발생했는데,

 

Please ensure the role can perform the GetRecords, GetShardIterator, DescribeStream, ListShards, and ListStreams Actions on your stream in IAM.

 

라는 오류가 계속해서 발생했다. 분명히 루트 계정으로 계속해서 개발중이였는데, 권한 오류가 발생해서 당황스러웠다.

 

구글에 많이 찾아보아도 따로 IAM user를 만들어서 권한을 할당하라고 되어있는데.. Root 계정은 이미 모든 권한을 가지고있고.. 라는 질문에 답을 아무리 생각해도 낼 수 없어서, Stack overflow에 질문글을 올렸다.

 

명쾌한 답변을 주신 ... 감사합니다 ㅠ ㅠ

역시 개발자 포럼이라는 생각을 하며, 계정 권한이 아닌 lambda 서비스에 권한을 따로 할당해야 한다는것을 알게 되었다.

 

그림에 보이는 화면에서, 역할 이름 밑의 하이퍼링크로 들어가면 lambda 서비스에 권한을 추가해줄 수 있다.

 

위 그림과 같이, 여기서 DynamoDBFullAccess라는 권한을 추가해주면, lambda에서 정상적으로 DynamoDB에 접근 할 수 있게 된다.

 

 

왠지 Userid는 가려야 할것 같아서 지운 그림(Dynamo DB)

그래서 이전에 등록해두었던 음식 DB를 이용해 Userid, Write_Date와 함께 위와 같이 DB 저장에 성공했지만..

 

이전에 CSV를 이용해 등록해둔 음식 목록들과 새롭게 DB에 등록된 food_name들을 보던 도중... 국밥과 같이 완전한 메뉴는 식단이 맞지만, 미나리무생채와 같이 반찬 이름 하나는 그날 먹은 식단이 아니다라는 생각이 문득 들었다.

 

그래서 엔티티와 발화를 전부 갈아엎고, 처음부터 작업을 다시 시작하는 바람에 menu_save를 하루만에 완성시키지 못햇다.

 

다음에도, menu_save 완성에 시간을 쓸듯하다.