Hasuraのエンドポイントにアクセスコントロールをつける

こんにちはかみむらです。GraphQLのAPIサーバーを作成できる「Hasura」にやっと入門しました。

HasuraはGraphQLエンジンで、PostgreSQLのデータベースを使用しています。そして、そのデータに対してGraphQLのクエリが発行できます。デプロイはHerokuにできるので、API開発に慣れてない人でもすぐに使うことができます。

今回はHasuraに入門したら必ず設定する必要がある、エンドポイントにアクセスコントロールをつけてみます。

Dockerの場合

HasuraはDockerで、簡単に開発環境を用意できます。Dockerを起動して、docker-compose.yamlに下記を記述してください。

docker-compose.yaml

version: '3.6'
services:
  postgres:
    image: postgres:12
    restart: always
    volumes:
    - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgrespassword
  graphql-engine:
    image: hasura/graphql-engine:v1.2.0-beta.2
    ports:
    - "8080:8080"
    depends_on:
    - "postgres"
    restart: always
    environment:
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
      HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
      HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
volumes:
  db_data:

参考
graphql-engine/docker-compose.yaml at master · hasura/graphql-engine · GitHub

これをバックグランドで実行します。

$ docker-compose up -d

簡単に説明します。上記でも説明しましたが、HasuraはPostgreSQLを使う前提となっています。なので、HASURA_GRAPHQL_DATABASE_URLPostgreSQLの設定をしています。

そして、HASURA_GRAPHQL_ADMIN_SECRETで認証キーを設定しています。もちろん今回はローカルで実行しているので問題ないですが、もし、本番で運用する場合はシークレットキーを外部に漏らさないように保護してください。

実行したHasuraのサーバーにアクセスしてみましょう。localhost:8080番にアクセスすると、シークレットキーで保護されてることがわかります。先ほど指定したHASURA_GRAPHQL_ADMIN_SECRETを入力するとログインできます。

f:id:kamimura-dev:20200308193745p:plain

Herokuの場合

次にHerokuにホストしたHasuraアプリケーションのエンドポイントに認証をつけます。公式ページのHerokuボタンをクリックすると、
github.com

そして、Herokuのダッシュボード上で、HASURA_GRAPHQL_ADMIN_SECRETを設定します。シークレットキーは推測しにくい文字列を入力してください。

f:id:kamimura-dev:20200308194040p:plain

同様にHerokuにデプロイしたHasuraにアクセスすると、認証を求められます。

f:id:kamimura-dev:20200308194818p:plain

最後に

今回はHasuraのエンドポイントにアクセスコントロールをつけてみました。もし、Hasuraでアプリケーションを作成する場合、必ず必要な設定となっています。なので、Hasuraに入門した方はぜひ参考にしてください。