💭

AWSLambdaにApolloServerをデプロイ

2020/12/28に公開

Apollo Docsのチュートリアルをみながらデプロイまでしてみましたので、自己学習した記録を残します。
Apollo Docs
参考にさせていただいた記事
AWS CLIのインストール

macOSで進めていきます。

前提条件としてAWSアカウントを持っていることとします。

1. AWSCLIをインストールします。

自分はpipコマンドを用いてインストールしました。

コマンド
sudo pip install awscli --upgrade --ignore-installed six

2. ユーザー認証情報を使用してAWSCLIの設定

コマンド
aws configure
設定
AWS Access Key ID [None]: *************ID
AWS Secret Access Key [None]: ******************************KEY
Default region name [None]: ap-northeast-1
Default output format [None]: json

3. NPMからサーバーレスフレームワークをインストール

npm install -g serverless

ここまでで、ApolloDocsの前提条件がクリアできます。

プロジェクトの設定

ここからはプロジェクト用ディレクトリで操作を行ってください。

1. apollo-server-lambdaパッケージのインストール

npm install apollo-server-lambda graphql

2. スキーマの型定義とリゾルバーの設定

まずプロジェクトディレクトリの直下にgraphql.jsを作成します。

// graphql.js

const { ApolloServer, gql } = require('apollo-server-lambda');

// graphQL serverが返す値に関する型の定義
const typeDefs = gql`
  type Query {
    hello: String
  }
`;

// graphQL serverが実際にどんな値を返すのかを定義
const resolvers = {
  Query: {
    hello: () => 'Hello world!',
  },
};
ApolloServerのコンストラクターに渡す
const server = new ApolloServer({ typeDefs, resolvers });

exports.graphqlHandler = server.createHandler({
  cors: {
    origin: true,
    credentials: true,
  },
});

一応認証情報(cookie,http認証)を使用したリクエストに対応するためにcrosを有効にしています。
最後の行でgraphqlHandlerをエクスポートしていることを覚えておきましょう。

3. ServerlessFrameworkの構成

serverless.ymlというファイルを使ってデプロイします。

# serverless.yml
service: apollo-lambda
provider:
  name: aws
  runtime: nodejs12.x
functions:
  graphql:
    handler: graphql.graphqlHandler
    events:
    - http:
        path: graphql
        method: post
        cors: true
    - http:
        path: graphql
        method: get
        cors: true

serverless.ymlファイルのhandlerには先ほどエクスポートしたファイル名.ハンドラー名を記入します。
handler:<FILENAME>.<HANDLER>という形式でかきます。

以上でデプロイする準備が完了しました。

4. デプロイ

以下のコマンドでデプロイできます。

serverless deploy

サービスの管理に関してはAWSコンソールにて確認できます。

GraphQLPlaygroundのセットアップ

最後にGraphQLPlaygroundのセットアップを行います。
コンストラクターにplaygroundのendpointを追加します。

const server = new ApolloServer({
  typeDefs,
  resolvers,

  playground: {
    endpoint: "/dev/graphql"
  }
});

Discussion