🌊

Amplify CLI API(GraphQL)/Custom business logic

2023/08/13に公開

lambda関数リゾルバー

  • @functionディレクティブを使用するとGraphQLAPIを使用してAWS Lamdbaリゾルバーを迅速かつ簡単に設定できます。
  • (例)amplify add functionでlambda関数を追加する。
exports.handler =  async function(event, context){
  return event.arguments.msg;
};
  • aws lambdaリゾルバーをGraphQLAPIに接続するには@functionをスキーマのフィールドに追加する。
type Query {
  echo(msg: String): String @function(name: "echofunction-${env}")
}

関数の構造

Head Head
typeName オブジェクトの名前
fieldName フィールド名
arguments 引数
identity 特定するマップ
source 実行時の親の値
request リクエストオブジェクト。ヘッダー含む
prev 前の関数によって返されたオブジェクト

関数の連鎖

  • 複数のリゾルバーが連続して呼び出されるように設定できる。
  • 以下では最初にworker関数が呼び出され、次にevent.prev.resultキーの下にワーカー関数の結果を含むイベントを持つaudit関数が起動します。
type Mutation {
  doSomeWork(msg: String): String @function(name: "worker-function") @function(name: "audit-function")
}
  • ディレクティブの定義@function
directive @function(name: String!, region: String) on FIELD_DEFINITION
  • 必要に応じて次のリソースを生成する。
  1. 関数を呼び出す権限と、AWS AppSync の信頼ポリシーを持つ AWS IAM ロール。
  2. 新しいロールと既存の関数を AppSync API に登録する AWS AppSync データ ソース。
  3. ラムダ イベントを準備し、新しいデータ ソースを呼び出す AWS AppSync パイプライン関数。
  4. GraphQL フィールドにアタッチし、新しいパイプライン関数を呼び出す AWS AppSync リゾルバー。

HTTPリゾルバー

  • @httpディレクティブを用いることでGraphQL API内でHTTPリゾルバーを素早く構成できる。
type Post {
  id: ID!
  title: String
  description: String
  views: Int
}

type Query {
  listPosts: [Post] @http(url: "https://www.example.com/posts")
}
  • amplifyはlistPostsクエリが使用されるときにURLにリクエストを装輪する以下の定義を生成する。
type Query {
  listPosts: [Post]
}

リクエストヘッダー

  • @httpディレクティブはXMLおよび、JSON応答を処理できるリゾルバーを生成する。メソッドが定義されていない場合はGETが使用される。静的ヘッダーのリストを指定できる。
type Query {
  listPosts: [Post]
    @http(
      url: "https://www.example.com/posts"
      headers: [{ key: "X-Header", value: "X-Header-Value" }]
    )
}

パスパラメータ

  • URLにパラメータを指定することで、動的パスを生成できる。
type Query {
  getPost: Post @http(url: "https://www.example.com/posts/:id")
}
  • 上記の:idでは下に示すように適切なquery inputを生成する
type Query {
  getPost(params: QueryGetPostParamsInput!): Post
}

input QueryGetPostParamsInput {
  id: String!
}
  • idを用いてfetchできる
query post {
  getPost(params: {id: "POST_ID"}) {
    id
    title
  }
}

詳細はdocs

Discussion