AWS AppSync での HTTP リゾルバーの使用 - AWS AppSync GraphQL

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS AppSync での HTTP リゾルバーの使用

注記

現在、主に APPSYNC_JS ランタイムとそのドキュメントをサポートしています。こちらにある APPSYNC_JS ランタイムとそのガイドの使用をご検討ください。

AWS AppSync では、サポートされたデータソース (つまり Amazon DynamoDB、Amazon OpenSearch Service、または Amazon Aurora) を使用してさまざまなオペレーションを実行できるほか、任意の HTTP エンドポイントを使用して GraphQL フィールドを解決できます。HTTP エンドポイントが利用可能になったら、データソースを使用してこれに接続できます。その後、クエリ、ミューテーション、およびサブスクリプションなどの GraphQL オペレーションを実行するために、スキーマ内のリゾルバーを設定できます。このチュートリアルでは、いくつかの一般的な例を説明します。

このチュートリアルでは、AWSAppSync GraphQL エンドポイントで REST API (Amazon API Gateway と Lambda により作成) を使用します。

ワンクリックでのセットアップ

AWS AppSync で HTTP エンドポイントを設定した GraphQL エンドポイントを自動的に設定するには (Amazon API Gateway および Lambda を使用)、以下の AWS CloudFormation テンプレートを使用します。

Blue button labeled "Launch Stack" with an arrow icon indicating an action to start.

REST API を作成する

以下の AWS CloudFormation テンプレートを使用して、このチュートリアルで機能する REST エンドポイントを設定できます。

Blue button labeled "Launch Stack" with an arrow icon indicating an action to start.

AWS CloudFormation スタックは以下のステップを実行します。

  1. マイクロサービス用のビジネスロジックを含む Lambda 関数を設定します。

  2. 以下のエンドポイント/メソッド/コンテンツタイプを組み合わせて、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 の作成)] を選択します。

  • API 名として「UserData」と入力します。

  • カスタムスキーマを選択します。

  • [Create] (作成) を選択します。

AWS AppSync;コンソールによって、API キー認証モードを使用して新しい GraphQL API が作成されます。このコンソールを使用して、残りの GraphQL API を設定し、このチュートリアルの残りの部分でクエリを実行できます。

GraphQL スキーマを作成する

GraphQL API を作成できたので、次に GraphQL スキーマを作成します。AWS AppSync コンソールのスキーマエディタで、スキーマが以下のスキーマと一致することを確認します。

schema { query: Query mutation: Mutation } 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 データソースを設定するには、以下の操作を行います。

  • [DataSources (データソース)] タブで [New (新規)] を選択し、データソース名としてわかりやすい名前 (HTTP など) を入力します。

  • [Data source type (データソースタイプ)] で「HTTP」を選択します。

  • 作成された API Gateway エンドポイントに、エンドポイントを設定します。エンドポイントの一部にステージ名が含まれていないことを確認します。

注意: 現時点では、パブリックエンドポイントのみが AWS AppSync でサポートされています。

注意: AWS AppSync サービスによって認識される認証機関の詳細については、「HTTPS エンドポイントについて AWS AppSync によって認識される認証機関 (CA)」を参照してください。

リゾルバーの設定

このステップでは、http データソースを getUser クエリに接続します。

リゾルバーをセットアップするには、以下の手順に従います。

  • [Schema (スキーマ)] タブを選択します。

  • クエリタイプの右下のデータ型ペインで、getUserフィールドを見つけて、アタッチを選択します。

  • [データソース名] で、[HTTP] を選択します。

  • 以下のコードを [リクエストマッピングテンプレートの設定] に貼り付けます。

{ "version": "2018-05-29", "method": "GET", "params": { "headers": { "Content-Type": "application/json" } }, "resourcePath": $util.toJson("/v1/users/${ctx.args.id}") }
  • 以下のコードを [レスポンスマッピングテンプレートの設定] に貼り付けます。

## return the body #if($ctx.result.statusCode == 200) ##if response is 200 $ctx.result.body #else ##if response is not 200, append the response to error block. $utils.appendError($ctx.result.body, "$ctx.result.statusCode") #end
  • [Query (クエリ)] タブを選択して、以下のクエリを実行します。

query GetUser{ getUser(id:1){ id username } }

これは以下のレスポンスを返します。

{ "data": { "getUser": { "id": "1", "username": "nadia" } } }
  • [Schema (スキーマ)] タブを選択します。

  • ミューテーションの右下のデータ型ペインで、AddUserフィールドを見つけて、アタッチを選択します。

  • [データソース名] で、[HTTP] を選択します。

  • 以下のコードを [リクエストマッピングテンプレートの設定] に貼り付けます。

{ "version": "2018-05-29", "method": "POST", "resourcePath": "/v1/users", "params":{ "headers":{ "Content-Type": "application/json", }, "body": $util.toJson($ctx.args.userInput) } }
  • 以下のコードを [レスポンスマッピングテンプレートの設定] に貼り付けます。

## Raise a GraphQL field error in case of a datasource invocation error #if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end ## if the response status code is not 200, then return an error. Else return the body ** #if($ctx.result.statusCode == 200) ## If response is 200, return the body. $ctx.result.body #else ## If response is not 200, append the response to error block. $utils.appendError($ctx.result.body, "$ctx.result.statusCode") #end
  • [Query (クエリ)] タブを選択して、以下のクエリを実行します。

mutation addUser{ addUser(userInput:{ id:"2", username:"shaggy" }){ id username } }

これは以下のレスポンスを返します。

{ "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 は、それに以下のポリシーをアタッチします。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "appsync:ListGraphqlApis" ], "Effect": "Allow", "Resource": "*" } ] }

次に、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 のリストを返します。