AWS를 사용하여 자동화된 개인 재무 대시보드 생성 - 2부(람다 요청)

6335 단어 apiawspythonlambda
안녕하세요 여러분, 지난번에 우리가 이야기한 내용은 다음과 같습니다.
  • 수동 솔루션의 문제점
  • 자동화 솔루션의 사용 사례
  • 기본 MVP 디자인

  • 이 게시물에서는 첫 번째 장애물인 새로운 사용자 프로비저닝 람다를 다룰 것입니다.

    이제 이 두 개의 람다는 각 사용 사례에 대해 별도의 기능이 있는 단일 람다로 패키징할 수 있지만 단순성을 위해 이들을 분리할 예정이며 향후에는 어떤 방식으로든 함께 끝날 것입니다.

    람다 개요:


  • 새 사용자 프로비저닝
  • GET 요청을 보냅니다
  • .
  • 수동 트리거
  • 일반적으로 한 번만 사용되거나 데이터를 완전히 새로 고쳐야 할 때 사용됨

  • 웹후크 처리
  • POST 요청 수신
  • 웹후크를 통해 트랜잭션이 등록될 때마다 트리거됨(나중에 설명)
  • 자동화 대시보드의 핵심으로 실시간 데이터 제공 예정


  • 행동 계획


  • AWS에서 람다 생성
  • Up의 API 끝점에 GET 요청을 보내고 트랜잭션 기록을 사전에 저장하는 Python 코드를 작성합니다
  • .

    충분히 간단하게 들리나요?

    그것으로 균열하자.

    AWS에서 람다 함수 생성


  • AWS 콘솔로 이동하여 새 Lambda 함수를 생성합니다. Python 3.9를 런타임으로 선택하고 다른 모든 것은 기본값으로 둡니다. 기본 실행 역할에 유의하십시오. 나중에 Cloudformation으로 솔루션을 배포할 때 나타날 것입니다!

  • UP Api 끝점에 도달하는 코드를 작성합니다.
  • 이 코드는 응답을 필터링하고 관련 정보를 모두 가져와 배열 사전에 모두 넣습니다.


  • import json
    import os
    import requests
    
    api_token = os.getenv('api_token')
    api_url_base = 'https://api.up.com.au/api/v1/'
    headers = {'Authorization': 'Bearer {}'.format(api_token)}
    
    def create_list(api_url):
        response = requests.get(api_url, headers=headers)
        if response.status_code == 200:
            data = []
            data.append(response.json().get('data'))
            if response.json().get('links').get('next'):
                token = response.json().get('links').get('next')
                while token:
                    response = requests.get(token, headers=headers)
                    data.append(response.json().get('data'))
                    token = response.json().get('links').get('next')
                    if token:
                        print("Processing token: {}".format(token))
                    else:
                        print("Finished processing tokens")
            return data
        else:
            print(response.status_code)
    
    def create_csvDictionary():
        api_url = api_url_base + 'transactions'
        data = create_list(api_url)
        csvDictionary = {'id' : [], 'description' : [], 'value' : [], 'category' : [], 'parentCategory' : [], 'createdAt' : []}
    
        for array in data:
            for transaction in array:
                if 'Transfer' in transaction.get('attributes').get('description'):
                    continue
                if 'transfer' in transaction.get('attributes').get('description'):
                    continue
                if 'Cover' in transaction.get('attributes').get('description'):
                    continue
                if 'Round Up' in transaction.get('attributes').get('description'):
                    continue
                if float(transaction.get('attributes').get('amount').get('value')) > 0:
                    continue
                else:
                    csvDictionary['id'].append(transaction.get('id'))
                    csvDictionary['description'].append(transaction.get('attributes').get('description'))
                    csvDictionary['value'].append(transaction.get('attributes').get('amount').get('value')[1:])
                    if transaction.get('relationships').get('category').get('data'):
                        csvDictionary['category'].append(transaction.get('relationships').get('category').get('data').get('id'))
                    else:
                        csvDictionary['category'].append('Uncategorized')
                    if transaction.get('relationships').get('parentCategory').get('data'):
                        csvDictionary['parentCategory'].append(transaction.get('relationships').get('parentCategory').get('data').get('id'))
                    else:
                        csvDictionary['parentCategory'].append('Uncategorized')
                    csvDictionary['createdAt'].append(transaction.get('attributes').get('createdAt'))
    
        print(csvDictionary)
        return csvDictionary
    
    
    def lambda_handler(event, context):
        create_csvDictionary()
    
    
    
    


    우리의 첫 번째 장애물! 우리 람다에는 요청 라이브러리가 없습니다. 이 라이브러리를 어떻게 정렬할까요?


    이 문제를 해결하는 방법에는 몇 가지가 있습니다. 제가 가장 좋아하는 방법은 람다 계층을 생성하는 것입니다. 그러면 AWS 계정에서 다른 기능과 함께 재사용할 수 있기 때문입니다.

    람다 레이어 생성


  • 패키지를 로컬로 설치합니다(Windows의 경우 --no-user 태그 지정).

  • pip3 install requests --target .\requests --no-user
    


  • 패키지 압축
  • Lambda 계층 콘솔에 업로드하여 런타임이 올바른지 확인합니다
  • .


  • 람다 함수에 계층을 추가합니다
  • .


  • 좋습니다. 이제 우리의 람다 함수는 요청 라이브러리에 액세스할 수 있습니다. 이 코드 블록을 시험해 보고 어떻게 진행되는지 확인하겠습니다.


  • 굉장합니다 - Up API 끝점에 도달하고 토큰을 처리하고 있습니다!

    Not Awesome - 람다는 너무 많은 데이터가 있기 때문에 초기에 시간 초과되었습니다(2년 분량의 트랜잭션).

    요약해서 말하자면


  • API 끝점에 GET 요청을 보내고 응답을 다시 받는 Lambda 함수를 구축했습니다
  • .
  • GET 요청을 활성화하기 위해 요청 람다 계층을 생성하고 이를 람다
  • 에 연결했습니다.
  • Lambda 함수는 기록 데이터 세트를 가져오는 데 오랜 시간이 걸립니다. 나중에 다시 살펴보겠습니다. 지금은 작동합니다.

  • 다음번



    다음 게시물에서는 Webhook(이벤트 기반) 람다 함수와 필요한 해당 API 게이트웨이 및 엔드포인트를 다룰 것입니다. 기다릴 수 없어!

    좋은 웹페이지 즐겨찾기