Help us understand the problem. What is going on with this article?

Apollo ServerをAWS Lambdaで動かす

More than 1 year has passed since last update.

やりたいこと

  • Apolloで作ったGraphQLサーバをAWS Lambdaで動かしサーバーレスで使いたい

手順

AWS周りのセットアップ

AWS CLIのインスール

curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
aws --version
# aws-cli/1.16.67 Python/2.7.10 Darwin/18.0.0 botocore/1.12.57

AWSのユーザ設定

  • コマンドラインからAWSにアクセスするためのユーザ設定をする
  • 以下のページの手順に沿って実施する
  • 手順
    1. IAMコンソールへアクセス
    2. 「ユーザ」 -> 「ユーザ追加」
    3. ユーザー詳細の設定
      • 「ユーザ名」: 適当な名前
      • 「アクセスの種類」: 「プログラムによるアクセス」にチェック
      • 「次のステップ:アクセス権限」を押す
    4. アクセス許可の設定(※とりあえず動かしただけでこの内容は過剰すぎるので注意)
      • 検索に「AWSLambdaFullAccess」を入力し出てきたものにチェック
      • 「ポリシーを作成」を押し以下の3つのアクセス許可を持ったポリシーを作成する
        • CloudFormationの設定追加
          • サービス:CloudFormation
          • アクション:すべての CloudFormation アクション (cloudformation:*)
          • リソース:すべてのリソース
        • API Gatewayの設定追加
          • サービス:API Gateway
          • アクション:すべての API Gateway アクション (apigateway:*)
          • リソース:すべてのリソース
        • IAMの設定追加
          • サービス:IAM
          • アクション:すべての IAM アクション (iam:*)
          • リソース:すべてのリソース
        • 「Review policy」ボタンを押して次のページへ
        • 名前に適当な値を入れて「Create policy」を押してポリシー作成完了
      • 「ポリシーのフィルタ」で「ユーザーによる管理」を選択すると作成したポリシーが出てくるのでチェックを入れる
        • 出てこない場合画面右にある更新ボタンを押すと出てくる
      • 「次のステップ:タグ」を押す
    5. タグの追加 (オプション)
      • タグの設定は必須ではないので何もせずに「次のステップ:確認」を押す
    6. 確認
      • 「ユーザの作成」を押すとユーザが作成される
    7. アクセスキーの保存
      • 作成が完了するとアクセスキーが表示されるので以下の2つをメモしておく
        • アクセスキー ID
        • シークレットアクセスキー
    8. アクセスキーの登録
      • ターミナルで以下のコマンドを実行しメモしたアクセスキーを登録する
aws configure
# AWS Access Key ID [None]: アクセスキー IDを入力
# AWS Secret Access Key [None]: シークレットアクセスキー
# Default region name [None]: ap-northeast-1
# Default output format [None]: json

アプリの作成

  • Lambdaで動作させるアプリケーションを作成する

事前準備

  • Serverless Frameworkをグローバルにインストールしておく
npm i -g serverless
serverless -v
# 1.34.1

セットアップ

  • 以下のコマンドを実行
    • npm の人は適宜yarnをnpmに読み替えてください
mkdir apollo-lambda-sample && cd apollo-lambda-sample
yarn init -y
yarn add apollo-server-lambda graphql

ファイルの作成

  • graphql.jsを作成する
graphql.js
const { ApolloServer, gql } = require('apollo-server-lambda');

const typeDefs = gql`
  type Query {
    hello: String
  }
`;

const resolvers = {
  Query: {
    hello: () => 'Hello world!',
  },
};

const server = new ApolloServer({ typeDefs, resolvers });

exports.graphqlHandler = server.createHandler({
  cors: {
    origin: '*',
    credentials: true,
  },
});
  • serverless.ymlを作成する
serverless.yml
service: apollo-lambda
provider:
  name: aws
  runtime: nodejs8.10
  region: ap-northeast-1
functions:
  graphql:
    # this is formatted as <FILENAME>.<HANDLER>
    handler: graphql.graphqlHandler
    events:
      - http:
          path: graphql
          method: post
          cors: true
  • ファイル内のコメントにもあるようにhandler: graphql.graphqlHandlerの部分がhandler: jsのファイル名.export名のように紐付いている

デプロイ

  • 以下のコマンド一つでデプロイできる!すごい!
serverless deploy
  • 完了するとエンドポイント等の情報が出てくる
Service Information
service: apollo-lambda
stage: dev
region: ap-northeast-1
stack: apollo-lambda-dev
api keys:
  None
endpoints:
  POST - https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/graphql
functions:
  graphql: apollo-lambda-dev-graphql
layers:
  None
  • 自分が試した時はawsアカウントの権限が足りずにエラーがたくさん出たが、上記の手順通りであれば問題なく実行できるはず
  • ちなみにリソースを削除する時は以下のコマンド
serverless remove

動作確認

  • アクセスして動作確認する
  • ここではGraphiQLを使う
    • ここからインストールできる
  • GraphQL EndpointにエンドポイントのURLを設定
  • 左のフィールドに以下の内容を入力し実行ボタンを押すとHelloWorld!のレスポンスを取得できる
query {
  hello
}

graphiql.png

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away