自動化された個人の財政ダッシュボードをつくること


私はいくつかの悪いコードを書いて、その場で再設計しました.
最後のポストでは、Webhookイベントを処理するコードを書いて、それをサポートするAPIインフラストラクチャを設定しました.
この部分は、S 3バケツでCSVファイルへの書き込みをカバーすることになっていました.私はDynamoDBをサポートするために再設計して正直に、それは私が最初からしなければならなかったものだった.
新しいシステムが次のようになります.


なぜS 3のCSVでない?
  • S 3でCSVファイルに追加するのはとても難しいですが、BOTO 3との機能はちょうど
  • ではありません
  • は、解決がより多くのエンジニアリングとメンテナンスを必要とした
  • クール242479182としてではなく


  • なぜダイナモ?
    AWS
  • によって完全に管理される
  • 素晴らしいBOTO 3サポート
  • はシステムと共にスケールします、S 3のCSVはとても長い間
  • のために実際的であっただけでした

    ダイナモの設定
    これは私の初めてのDynamoDBを使用していました.
    DynamoDB内のテーブルを作成します-これはすべて非常に自己説明です.

    ... それはほとんど-あまりにも簡単に右のようですか?ここにトリックがありません.これは完全に管理されたNOSQLデータベースがどのように見えるかです.それは非常に簡単です.

    ダイナモへの書き込み
    これは、物事はもう少し面白いが、まだ非常に簡単です.目的は、直接のDynamoDBを行うには、それぞれのペイロードを書くために我々のラムダの両方を変更することです.
    我々がDynamoDBに書くことを試みる前に、我々は正しい許可を持っていることを確認する必要があります.ブランケットは“すべての”ポリシーが悪い、と私は悪い感じてください.v 0の最後に行われたセキュリティレビューがあります.1私が通り抜けて、すべての方針が最も特権があるコンプライアントであることを確実とするならば、今、私は純粋に物事を働かせることに集中します.
    "Effect": "Allow",
    "Action": [
        "dynamodb:*"
    
    今、我々は、我々はいくつかのコードを書くことができる我々のLambdas最高のDynamoDBコントロールを与えている.DynamoDBのためのBOTO 3サポートは素晴らしいです、それは本当に使いやすく、直感的です.DynamoDBについての私のお気に入りの1つは、手前にスキーマを定義する必要がないことです.パーティションキーを必要とする最小値で、必要に応じて他のキー値ペアを追加できますs 'と' n 'は文字列または数値を表します.
    これは、プロセスWebhookラムダが使用する関数です.
    def write_to_dynamo(dictionary):
        dynamodb = boto3.client('dynamodb')
        dynamodb.put_item(TableName='quicksightTest', Item={'TransactionID':{'S': dictionary['ID']},'Category':{'S': dictionary['Category']}, 
        'ParentCategory' : {'S' : dictionary['ParentCategory']}, 'Value' : {'N' : dictionary['Value']}, 'Description' : {'S' : dictionary['Description']}, 
        'CreatedAt' : {'S' : dictionary['CreatedAt']}})
    

    悪いコード
    それが働くならば、コードは悪いですか?おそらくはい.
    なぜそれが悪いのか?コンカレンシーの欠如と全体的に非効率的なデザイン.
    私は、新しいユーザーラムダを提供するためにプロセスWebhookコードを複製しました.正しい意味を作る?それは基本的に同じ規模でちょうど同じことをする
    以下にコードブロックを示します:
    def write_to_dynamo(dictionary):
        dynamodb = boto3.client('dynamodb')
        a = 0
        for transaction in dictionary['id']:
            dynamodb.put_item(TableName='quicksightTest', Item={'TransactionID':{'S': dictionary['id'][a]},'Category':{'S': dictionary['category'][a]}, 
            'ParentCategory' : {'S' : dictionary['parentCategory'][a]}, 'Value' : {'N' : dictionary['value'][a]}, 'Description' : {'S' : dictionary['description'][a]}, 
            'CreatedAt' : {'S' : dictionary['createdAt'][a]}})
            a += 1
    
    
    def lambda_handler(event, context):
        dictionary = create_Dictionary()
        write_to_dynamo(dictionary)
    
    私が最初にこれを実行しようとしたとき、それはタイムアウトしました.何も心配しないで、ラムダの制限は1分に設定され、大きなトランザクション履歴がダウンロードするよりも長くかかります.

    最後に、私は15分の最大のラムダタイムアウトを上げなければなりませんでした、そして、私のラムダ資源は~ 13分走りました.これは明らかに私のトランザクションの履歴は、サイズだけで成長することは、このコードが動作しない時間が来るという意味では理想的ではない.
    それで、私は何をしましたか?
    何もない.
    これがプロセスWebhook側にあるならば、私はrefactorを強いられて、より効率的な解決を作成しなければなりませんでした、しかし、この機能は新しいユーザーを準備するために一度だけ実行されます.

    たとえそれが醜いとしても、私が働いたので、私は現在Dynamodbで4418の記録を持ちます、そして、より多くはあらゆるWebhookイベントで加えられます.私がどのように計算を扱っているかについて私に考えさせましたが、私がパッケージ全体を改善することができる多くの方法があります.それらの更新のために調整滞在.

    今日の進歩
  • は、DynamoDB
  • のテーブルを作成しました
  • は、DynamoDB
  • に書き込む機能を書きました
  • 私の全体のトランザクション履歴をDynamoDB!

  • 次のポスト
    次の我々は、アテナとQuerDigiDynamoBを介して行くとQuickSightに我々の金融記録をもたらす-これは楽しいものです!