AWSラムダのPostgres DBへの接続:その1


パート0 :プリリクサイト


Serverless関数は、そのコアで、非常に簡単です.構成は最大のバグであることを終了します.それでも、このチュートリアルではいくつか考えます.
  • JavaScript、ノード、NPMとの親しみ.すべてインストール
  • AWSアカウントSign up for one あなたがそれを持たないならば.
  • Serverlessフレームワークの設定.Serverless Frameworkの利点は、多くのAWSリソースを作成し、配備することです.そのためには、これらのリソースにアクセスできる必要があるので、いくつかの初期設定が必要です.そのためには、I'll point you to the Serverless blog .
  • パート1 : Serverless Frameworkによるプロジェクトの設定


    プロジェクトの足場作り


    ターミナルで実行しているサーバーレスプロジェクトを足場にするには、次の手順に従います.
    $ serverless create —template aws-nodejs —path sls-new-project
    
    これはフォルダと呼ばれるフォルダを作成しますsls-new-project それはちょうど2つのファイルを含んでいます.handler.js 関数の論理を持ち、serverless.yaml これには、すべての設定が含まれます.非常に最小限を開始します.

    ローカルデータベースの設定と順序付け


    Sequgizeと呼ばれるPostgresとオブジェクトリレーショナルマッパー(ORM)を使いたい.それではNPMを介してプロジェクトにこれらの依存関係をインストールしましょう.
    ファーストnpm init 作成するpackage.json 我々のプロジェクトで.次に、いくつかの依存関係のインストールを開始します.
    npm install --save pg
    npm install --save pg-hstore
    npm install --save sequelize
    npm install -—save-dev sequelize-cli
    
    私たちが使用したいいくつかの移行を実行するのでsequelize-cli これらの移行を生成する.私たちは走ることができるnpx sequelize-cli init これは、どのように各環境のデータベースに接続するには、CLIの指示を移動移動フォルダ、設定を作成し、モデルのフォルダをモデル化し、苗木.初期化のための完全な命令を得ることができますsequelize-cli here .
    あなたがちょうど作成した内容を読むならばconfig/config.json MySQL用に設定されていることがわかります.変更するにはほとんど
  • 先に行くと変更するpostgres そしてそれらを保存します.
  • また、変更usernamedevelopment お使いのデバイスのルートユーザーの名前に.
  • また、データベースの名前を変更してくださいsls-starter またはあなたのプロジェクトの名前に関連する何か.
  • この設定はCLIのデータベースへのアクセス方法のみを指示しますので、アプリケーションにデータベースにアクセスするよう指示しなければなりません.次の手順で別々のファイルでこれをします.
    我々はまだモデルを持っていないが、我々はすぐにそれらを作成を開始します.しかし、その前の最後のステップでは、ローカルデータベースを作成しなければなりませんnpx sequelize-cli db:create .
    失敗した場合は、おそらくconfig/config.json ファイル.ユーザーがデバイス上のルートユーザーであることを確認するには、上記の手順に従って、データベース名は一意ですし、データベースの正しいタイプを使用しているpostgres . 今のところ、以下の値を変更する必要がありますdevelopment .
    参考のために、ここに私のですconfig/config.json
    {
      "development": {
        "username": "dengel",
        "password": null,
        "database": "sls-starter",
        "host": "127.0.0.1",
        "dialect": "postgres"
      },
      "test": {
        "username": "dengel",
        "password": null,
        "database": "database_test",
        "host": "127.0.0.1",
        "dialect": "postgres"
      },
      "production": {
        "username": "dengel",
        "password": null,
        "database": "database_production",
        "host": "127.0.0.1",
        "dialect": "postgres"
      }
    }
    
    成功するとメッセージが表示されます.
    Sequelize CLI [Node: 10.16.0, CLI: 6.2.0, ORM: 6.3.5]
    
    Loaded configuration file "config/config.json".
    Using environment "development".
    Database sls-starter created.
    
    上記のリンクもモデルを作成することができますこのチュートリアルでは、データベース接続を正常にすることができます.
    この時点でプロジェクトファイル構造は次のようになります.

    アプリケーションのローカルデータベースへの接続


    さて、我々は多くのことをインストールしました、そして、現在、若干の接続論理を書く時間です.
    私たちは別のファイルでconnection.js , プロジェクトのルートで作成します.
    const { Sequelize } = require('sequelize');
    const pg = require('pg')
    
    const sequelize = new Sequelize('sls-starter', 'dengel', '', {
      dialect: 'postgres',
      dialectModule: pg,
      host: '127.0.0.1'
    })
    
    module.exports = sequelize
    
    
    上のコードについてはいくつか注意してください.
  • 我々がハードコード化したことdbname , username , password ( NULLです)db.endpoint.url で設定します.これは良い習慣ではなく、次のポストの環境に基づいてこのダイナミックを作るために、これを改良して、環境変数を使う方法を見ます.
  • 我々にはpg Postgresnode_module ここで、そのオブジェクトをdialectModule オプションSequelize コンストラクタ.これはラムダ関数、シーケンス化、およびPostgresに調和して動作するために必要です.
  • 私たちは接続ロジックをエクスポートしましたhandler.js .
    すべて削除serverless create コマンドは、このファイルの初期に作成し、新鮮なスタートしましょう.
    関数のHTTPトリガを使用する予定ですので、以下のパッケージをインストールします.
    npm install —-save serverless-http
    npm install --save express
    
    それから、我々の中で彼らを必要としますhandler.js
    'use strict';
    const db = require('./connection.js');
    const serverless = require('serverless-http');
    const express = require('express');
    const app = express();
    
    そして今、我々はデータベース接続をテストするための関数を追加することができます.
    app.get('/test', async function (req, res) {
    
    let msg;
    try {
      await db.authenticate();
      msg = 'Connection successful'
    } catch (error) {
      msg = 'Unable to connect to the database:'
      console.error('Unable to connect to the database:', error);
    }
    
      return res.send(msg)
    })
    
    module.exports.index = serverless(app)
    
    我々はほとんど機能をテストする準備ができている.
    物事をテストすることになると、最も重要な要因の一つは、フィードバックループをスピードアップする方法を見つけることです.もし私たちの関数をテストする唯一の方法がそれらを展開し、彼らが生産上で動作するかどうかを見ていたならば、それは恥です.だからこそ、いくつかのプラグインをインストールするつもりです.

    フィードバックループのスピードアップ


    Serverless Frameworkプラグインを使用して開発を支援します.serverless-offline フィードバックループ(重要)をスピードアップするためにローカルに機能をテストするにはserverless-sequelize-migrations これは私たちの移行を取り、私たちのための生産環境でそれらを実行します.我々は、プロジェクトの少し後にそれを使用します.これらはNPMパッケージではありませんが、serverless CLIは、我々の中で言及しますserverless.yaml .
    まず最初に、プロジェクトルートから次のコマンドを実行します.
    serverless plugin install —name serverless-offline
    serverless plugin install —name serverless-sequelize-migrations
    
    それからあなたのserverless.yaml まだ触れていないファイルです.
    コメントアウトされるすべての異なるオプションを見ることができます.私は、現在我々にとって重要であるものにだけ触れます.
    あなたはserver and provider コンフィギュレーション、そして今私たちはplugins 年代の最高水準のセクションyaml .
    plugins:
      - serverless-offline
      - serverless-sequelize-migrations
    
    我々はまた、の詳細を変更することができますfunctions セクションでは、より正確に何が現在我々のものであるかについて反映しますhandler.js :
    functions:
      app:
        handler: handler.index
        events:
          - http: ANY /
          - http: 'ANY {proxy+}'
    
    これは、我々が最終的にそれを展開するとき、どのようなオプションがローカルで利用できるかについて、そして、どのように我々の機能にアクセスするかについて、ServersのどのようにAWSラムダを構成するかについて説明しますhandler ファイル名を参照してください.index 年にエクスポートしたものを参照しますmodule.exports .
    今、それが働いているかどうかチェックする時間です.

    局所煙試験と次のステップ


    煙テストだけで物事が期待通りに動作しているかどうかを確認する簡単なテスト.我々の唯一の機能のロジックはdb.authenticate() 関数とprintが正常に接続するかどうかを出力します.
    テストするにはsls offline これで、我々のServerlessな関数のローカルモックを開始します.私たちは訪れることができますhttp://localhost:3000/dev/test 関数が成功したかどうかを確認します.そして、すべてが正常に続くならば、あなたは「接続成功」を見なければなりません、あるいは、機能の中のどんな成功メッセージもブラウザにあったでしょう.
    しかし、あなたが走るならばsls deploy この時点でこれを試してみてください
  • 私たちは生産データベースを持っていません.
  • AWSラムダは、より余分な構成なしでPostgresを話すことができません.
  • それは、我々が我々の環境を切り離すことと同様に我々がするものです.