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

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 エンドポイントを設定できます。

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 を作成するには、以下の手順に従います。

  1. AWS AppSync コンソールを開き、[Create API (API の作成)] を選択します。

  2. [GraphQL API] を選択し、[最初から設計] を選択します。[次へ ]を選択します。

  3. API 名として「UserData」と入力します。[次へ] を選択します。

  4. Create GraphQL resources later を選択してください。[次へ] を選択します。

  5. 入力内容を確認し、[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 データソースを設定するには、以下の操作を行います。

  1. AWS AppSync GraphQL API の[データソース] ページで、[データソースの作成] を選択します。

  2. HTTP_Example のようにデータソースの名前を入力します。

  3. [データソースタイプ][HTTP エンドポイント] を選択します。

  4. チュートリアルの最初に作成された 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リゾルバーをセットアップするには

  1. AWS AppSync GraphQL API で、「スキーマ」タブを選択します。

  2. スキーマエディタの右側のリゾルバー]ペインの[クエリタイプ]で、getUserフィールドを見つけて[アタッチ]を選択します。

  3. リゾルバータイプはUnitのままにし、ランタイムはAPPSYNC_JSにします。

  4. [データソース名] で、先ほど作成した HTTP エンドポイントを選択します。

  5. [作成] を選択します。

  6. 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}`, } }
  7. 次のスニペットをレスポンスハンドラーとして追加します。

    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) }
  8. [Query (クエリ)] タブを選択して、以下のクエリを実行します。

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

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

    { "data": { "getUser": { "id": "1", "username": "nadia" } } }

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

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

  2. スキーマエディタの右側のリゾルバー]ペインの[クエリタイプ]で、addUserフィールドを見つけて[アタッチ]を選択します。

  3. リゾルバータイプはUnitのままにし、ランタイムはAPPSYNC_JSにします。

  4. [データソース名] で、先ほど作成した HTTP エンドポイントを選択します。

  5. [作成] を選択します。

  6. 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 } } }
  7. 次のスニペットをレスポンスハンドラーとして追加します。

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

JSON
{ "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 のリストを返します。