この記事では、TypeScript、AWS Lambda、およびApollo Serverを使用して無服务器のGraphQL APIを作成する手順をご案内します。
無服务器計算
無服务器計算は、雲プロバイダがアプリケーションの実行に必要なインフラを自動で管理するクラウド実行モデルです。このモデルで、開発者はコードを書いて、クラウドプロバイダは実行、スケール、およびサーバーの保守を行います。つまり、開発者はサーバー管理、インフラの提供、またはスケールには気にしなくてもよいです。「無服务器」とは、サーバーが存在しないことを意味するわけではなく、開発者によるサーバー管理業務を抽象化させていることを意味します。AWS Lambdaは、アマゾン・ウェブサービス(AWS)により提供される無服务器計算サービスであり、サーバーの提供または管理する必要はありません。
GraphQL
GraphQLは、API用のクエリ言語であり、これらのクエリを実行する runtimeです。クライアントは必要とするデータのみを要求することができ、これによりRESTと比較してより効果的である。GraphQLを使用すると、クライアントはレスポンスの形状と構造を指定し、一度の要求で複数のリソースを取得することができます。この柔軟性はパフォーマンスを改善し、ネットワークのオーバーヘッドを削減します。GraphQLは強く typingされており、利用可能なタイプと操作を定義するスキーマがあります。これは、フロントエンドとバックエンドの間で通信を最適化する Modern applicationでよく使用されています。これにより、より反応的で効率的なデータ管理が可能です。
Apollo Server
人気の開発者向け、オープンソースのGraphQLサーバーで、GraphQL APIの簡単な作成を助けます。これは、スキーマ定義、クエリの実行、およびレスポンスの整形を処理して、健全で伸缩性のあるGraphQL APIの構築プロセスを簡素化します。Apollo Serverは、データ取得、キャシング、認証などの機能をサポートしており、 modern applicationsに最適なところに適用できます。これは、REST APIs、データベース、およびマイクロサービスなどのさまざまなデータ源と無缝に作動します。性能監視とエラー処理の内蔵ツールを提供しており、Apollo Serverは、GraphQL環境でクライアントとサーバー間の効率的な通信を提供するために一般的に使用されます。
なぜTypeScriptですか?
JavaScriptのスーパーセットで、言語に静的な型を追加します。開発中にエラーを捕まえ、コードの可读性を向上させ、refactoringを向上させます。型安全性和ツール支持を提供しており、TypeScriptは、より持続可能でスケーラブルなアプリケーションを実現し、大規模なプロジェクトやチームに最適です。
サーバーレスとGraphQLがお互いにとてもよく機能している理由(ある恋の物語をコードにして)
- 最適化されたリソース使用: GraphQLの正確なデータ取得は、サーバーレスの料金プランとして最適なリソース使用を保証します。
- 簡素化されたバックエンド: サーバーレス関数はGraphQLの解決器を効率的に処理し、バックエンドのアーキテクチャを流暢にすることができます。
- 改善されたパフォーマンス: GraphQLはデータのオーバーヘッドを削減することで、特にサーバーレスアーキテクチャと組み合わさるとより速いアプリケーションを実現します。
- 伸縮性: どちらの技術も変動する負荷を処理することに優れており、この組合せは高い伸縮性を持っています。
- コスト効率: サーバレスコンピューティングのプAYGモデルとGraphQLの効率的なデータ転送を組み合わせることで、多大なコスト節約が可能です。
“サーバレスとGraphQLの組合せにより、スケーラブルで効率的なAPIの迅速開発ができます。開発時間と運営コストを大幅に削減する強力なパートナーシップです。” – Nader Dabit, “フルスタックサーバレス“
以下は、AWS LambdaでGraphQLを使用したサービスの部署の手順を説明します。
- 手順1: 新しいTypeScriptプロジェクトを初期化し、依存関係をインストールします。
mkdir serverless-graphql-api
cd serverless-graphql-api
npm init -y
npm install typescript @types/node --save-dev
npx tsc --init
npm install apollo-server-lambda graphql @types/aws-lambda
npm install --save-dev serverless-offline
- 手順2: 必要な要素でGraphQLスキーマを定義します。
import { gql } from 'apollo-server-lambda';
export const typeDefs = gql`
type Query {
auto: String
}
type Mutation {
sayAuto(name: String!): String
}
`;
- 手順3: リソルバーの実装:
export const resolvers = {
Query: {
auto: () => 'Hello from serverless GraphQL!',
},
Mutation: {
sayAuto: (_: any, { name }: { name: string }) => `Hello, ${name}!`,
},
};
- 手順4: Lambdaハンドラーの作成:
import { ApolloServer } from 'apollo-server-lambda';
import { typeDefs } from './schema';
import { resolvers } from './resolvers';
const server = new ApolloServer({
typeDefs,
resolvers,
});
export const graphqlHandler = server.createHandler();
- 手順5: サーバレスの布石を設定します。
serverless.yml
ファイルを作成します:
service: serverless-graphql-api provider: name: aws runtime: nodejs16.x stage: dev region: us-east-1 functions: graphql: handler: handler.graphqlHandler events: - http: path: graphql method: post - http: path: graphql method: get plugins: - serverless-offline
AWSで(素早いHello World)に直接コードを書くことができ、CDKやTerraformなどの適切なデプロイメントオプションを使用します。サーバーレスコンピューティングとGraphQLはどちらも進化を続けるため、より強力なツールと慣習が出現することが期待できます。
結論
サーバーレスGraphQLを受け入れることで、開発者は拡張性のあるAPIを簡単に作成することができ、クライアントが必要とするものを正確に提供します。常にどのデータを取得し、スケールするか知るのは容易なクリスタルボールのようです。
Source:
https://dzone.com/articles/serverless-computing-and-graphql