AWS AppSync での HTTP リゾルバーの使用
AWS AppSync では、サポートされたデータソース (つまり Amazon DynamoDB、Amazon OpenSearch Service、または Amazon Aurora) を使用してさまざまなオペレーションを実行できるほか、任意の HTTP エンドポイントを使用して GraphQL フィールドを解決できます。HTTP エンドポイントが利用可能になったら、データソースを使用してこれに接続できます。その後、クエリ、ミューテーション、およびサブスクリプションなどの GraphQL オペレーションを実行するために、スキーマ内のリゾルバーを設定できます。このチュートリアルでは、いくつかの一般的な例を説明します。
このチュートリアルでは、AWSAppSync GraphQL エンドポイントで REST API (Amazon API Gateway と Lambda により作成) を使用します。
REST API を作成する
以下の AWS CloudFormation テンプレートを使用して、このチュートリアルで機能する REST エンドポイントを設定できます。
AWS CloudFormation スタックは以下のステップを実行します。
-
マイクロサービス用のビジネスロジックを含む Lambda 関数を設定します。
-
以下のエンドポイント/メソッド/コンテンツタイプを組み合わせて、API Gateway REST API をセットアップします。
| API リソースパス | HTTP メソッド | サポートされているコンテンツタイプ |
|---|---|---|
|
/v1/users |
POST |
application/json |
|
/v1/users |
GET |
application/json |
|
/v1/users/1 |
GET |
application/json |
|
/v1/users/1 |
PUT |
application/json |
|
/v1/users/1 |
DELETE |
application/json |
GraphQL API の作成
AWS AppSync で GraphQL API を作成するには、以下の手順に従います。
-
AWS AppSync コンソールを開き、[Create API (API の作成)] を選択します。
-
[GraphQL API] を選択し、[最初から設計] を選択します。[次へ ]を選択します。
-
API 名として「
UserData」と入力します。[次へ] を選択します。 -
Create GraphQL resources laterを選択してください。[次へ] を選択します。 -
入力内容を確認し、[API の作成] を選択します。
AWS AppSync コンソールによって、API キー認証モードを使用して新しい GraphQL API が作成されます。コンソールを使用して GraphQL API をさらに設定し、リクエストを実行できます。
GraphQL スキーマを作成する
GraphQL API を作成できたので、次に GraphQL スキーマを作成します。AWS AppSync コンソールのスキーマエディタで、以下のスニペットを使用してください。
type Mutation { addUser(userInput: UserInput!): User deleteUser(id: ID!): User } type Query { getUser(id: ID): User listUser: [User!]! } type User { id: ID! username: String! firstname: String lastname: String phone: String email: String } input UserInput { id: ID! username: String! firstname: String lastname: String phone: String email: String }
HTTP データソースを設定する
HTTP データソースを設定するには、以下の操作を行います。
-
AWS AppSync GraphQL API の[データソース] ページで、[データソースの作成] を選択します。
-
HTTP_Exampleのようにデータソースの名前を入力します。 -
[データソースタイプ] で [HTTP エンドポイント] を選択します。
-
チュートリアルの最初に作成された API ゲートウェイエンドポイントに、エンドポイントを設定します。Lambda コンソールに移動し、[アプリケーション] でアプリケーションを見つけると、スタックで生成されたエンドポイントを見つけることができます。アプリケーションの設定の中に、AWS AppSync のエンドポイントとなる API エンドポイントが表示されます。エンドポイントの一部にステージ名が含まれていないことを確認します。例えば、エンドポイントが
https://aaabbbcccd.execute-api.us-east-1.amazonaws.com/v1であれば、https://aaabbbcccd.execute-api.us-east-1.amazonaws.comに入力します。
注記
注意: 現時点では、パブリックエンドポイントのみが AWS AppSync でサポートされています
AWS AppSync サービスによって認識される認証機関の詳細については、「HTTPS エンドポイントについて AWS AppSync によって認識される認証機関 (CA)」を参照してください。
リゾルバーを設定する
このステップでは、http データソースを とgetUser および addUser クエリに接続します。
getUserリゾルバーをセットアップするには
-
AWS AppSync GraphQL API で、「スキーマ」タブを選択します。
-
スキーマエディタの右側の[リゾルバー]ペインの[クエリタイプ]で、
getUserフィールドを見つけて[アタッチ]を選択します。 -
リゾルバータイプは
Unitのままにし、ランタイムはAPPSYNC_JSにします。 -
[データソース名] で、先ほど作成した HTTP エンドポイントを選択します。
-
[作成] を選択します。
-
Resolver コードエディターで、次のスニペットをリクエストハンドラーとして追加します。
import { util } from '@aws-appsync/utils' export function request(ctx) { return { version: '2018-05-29', method: 'GET', params: { headers: { 'Content-Type': 'application/json', }, }, resourcePath: `/v1/users/${ctx.args.id}`, } } -
次のスニペットをレスポンスハンドラーとして追加します。
export function response(ctx) { const { statusCode, body } = ctx.result // if response is 200, return the response if (statusCode === 200) { return JSON.parse(body) } // if response is not 200, append the response to error block. util.appendError(body, statusCode) } -
[Query (クエリ)] タブを選択して、以下のクエリを実行します。
query GetUser{ getUser(id:1){ id username } }これは以下のレスポンスを返します。
{ "data": { "getUser": { "id": "1", "username": "nadia" } } }
リゾルバーをセットアップするには、以下の手順に従います。
-
[Schema (スキーマ)] タブを選択します。
-
スキーマエディタの右側の[リゾルバー]ペインの[クエリタイプ]で、
addUserフィールドを見つけて[アタッチ]を選択します。 -
リゾルバータイプは
Unitのままにし、ランタイムはAPPSYNC_JSにします。 -
[データソース名] で、先ほど作成した HTTP エンドポイントを選択します。
-
[作成] を選択します。
-
Resolver コードエディターで、次のスニペットをリクエストハンドラーとして追加します。
export function request(ctx) { return { "version": "2018-05-29", "method": "POST", "resourcePath": "/v1/users", "params":{ "headers":{ "Content-Type": "application/json" }, "body": ctx.args.userInput } } } -
次のスニペットをレスポンスハンドラーとして追加します。
export function response(ctx) { if(ctx.error) { return util.error(ctx.error.message, ctx.error.type) } if (ctx.result.statusCode == 200) { return ctx.result.body } else { return util.appendError(ctx.result.body, "ctx.result.statusCode") } } -
[Query (クエリ)] タブを選択して、以下のクエリを実行します。
mutation addUser{ addUser(userInput:{ id:"2", username:"shaggy" }){ id username } }getUserクエリを再実行すると、次のレスポンスが返されるはずです。{ "data": { "getUser": { "id": "2", "username": "shaggy" } } }
AWS のサービスの呼び出し
HTTP リゾルバーを使用して、AWS のサービスの GraphQL API インターフェイスを設定できます。AWS への HTTP リクエストは、AWS誰が送信したかを特定できるように 署名バージョン 4 の署名プロセス で署名する必要があります。AWSIAM ロールを HTTP データソースに関連付けるときに、AppSync が署名を計算します。
HTTP リゾルバーで AWS のサービスを呼び出すには、2 つの追加のコンポーネントを指定します。
-
AWS のサービス API を呼び出すアクセス許可を持つ IAM ロール
-
データソースの署名設定
例えば、HTTP リゾルバーを使用して ListGraphqLapis オペレーションを呼び出す場合は、まず IAM ロールを作成すると AWS AppSync は、それに以下のポリシーをアタッチします。
次に、AWS AppSync の HTTP データソースを作成します。この例では、米国西部 (オレゴン) リージョンで AWS AppSync を呼び出します。http.json という名前のファイルで、署名リージョンとサービス名を含む以下の HTTP 設定を定義します。
{ "endpoint": "https://appsync.us-west-2.amazonaws.com/", "authorizationConfig": { "authorizationType": "AWS_IAM", "awsIamConfig": { "signingRegion": "us-west-2", "signingServiceName": "appsync" } } }
その後、以下のように AWS CLI を使用して、ロールが関連付けられたデータソースを作成します。
aws appsync create-data-source --api-id <API-ID> \ --name AWSAppSync \ --type HTTP \ --http-config file:///http.json \ --service-role-arn <ROLE-ARN>
リゾルバーをスキーマのフィールドにアタッチする場合、以下のリクエストマッピングテンプレートを使用して AWS AppSync を呼び出します。
{ "version": "2018-05-29", "method": "GET", "resourcePath": "/v1/apis" }
このデータソースに対して GraphQL クエリを実行すると、AWS AppSync によって、指定したロールを使用してリクエストが署名され、リクエストに署名が追加されます。クエリは、その AWS リージョンのアカウントの AWS AppSync GraphQL API のリストを返します。