AWS AppSync Apollo Extensions
AWS AppSync Apollo Extensionsは、Apollo Clientというオープンソースの GraphQL クライアントを使用して AWS AppSync バックエンドにシームレスに接続する方法を提供します。
Apollo の詳細については、https://www.apollographql.com/docs/kotlin を参照してください。
機能
AWS AppSync Apollo Extensions は、Apollo クライアントで使用される AWS AppSync オーサライザーを提供し、GraphQL 操作に正しい認可ペイロードを簡単に適用できます。
さらに、Amplify が認可トークンと対応する Authorizer の署名ロジックを提供できるようにするオプションの Amplify 拡張機能を公開しています。
AWS AppSync Apollo Extensions ライブラリをインストールする
apollo-appsync-amplify 依存関係を app/build.gradle.kts ファイルに追加します。
dependencies { // Connect Apollo to AppSync, delegating some implementation details to Amplify implementation("com.amplifyframework:apollo-appsync-amplify:1.0.0") }apollo-appsync 依存関係を app/build.gradle.kts ファイルに追加します。
dependencies { // Connect Apollo to AppSync without using Amplify implementation("com.amplifyframework:apollo-appsync:1.0.0") }Apollo クライアントを使用して AWS AppSync に接続する
ApolloClient の作成
開始する前に、Amplify Data バックエンドのデプロイが必要です。開始するには、Set up Data を参照してください。
バックエンドをデプロイして amplify_outputs.json ファイルを作成したら、以下の手順で Amplify ライブラリを使用して設定値を読み取って取得できます:
// Use apiKey auth mode, reading configuration from AmplifyOutputsval connector = ApolloAmplifyConnector(context, AmplifyOutputs(R.raw.amplify_outputs))val apolloClient = ApolloClient.Builder() .appSync(connector.endpoint, connector.apiKeyAuthorizer()) .build()提供されている AWS AppSync エンドポイントとオーサライザークラスを使用して Apollo クライアントを作成できます。
val endpoint = AppSyncEndpoint("<your_appsync_endpoint>")// Continue Reading to see more authorizer examplesval authorizer = ApiKeyAuthorizer("[API_KEY]") val apolloClient = ApolloClient.Builder() .appSync(endpoint, authorizer) .build()AppSync Authorizer の提供
AWS AppSync Apollo Extensions ライブラリは、スキーマで使用されている可能性のあるさまざまな認可戦略に対応した多くの Authorizer クラスを提供します。認可戦略に対応する適切な Authorizer タイプを選択する必要があります。戦略と対応する認可モードの詳細については、利用可能な認可戦略 を参照してください。
一般的なものは以下の通りです
publicAPIkey戦略、apiKey認可モード、APIKeyAuthorizerguest戦略、identityPool認可モード、IAMAuthorizerowner戦略、userPool認可モード、AuthTokenAuthorizer
スキーマ内で複数の認可戦略を定義する場合、アプリで使用する各 Authorizer に対して個別の Apollo クライアントインスタンスを作成する必要があります。
API_KEY
ApiKeyAuthorizer は amplify_outputs.json から API キーを読み取ったり、ハードコードされた API キーを提供したり、何らかのソースから API キーを取得したりできます:
// Using ApolloAmplifyConnector to read API key from amplify_outputs.jsonval connector = ApolloAmplifyConnector(context, AmplifyOutputs(R.raw.amplify_outputs))val authorizer = connector.apiKeyAuthorizer()// or// Use a hard-coded API keyval authorizer = ApiKeyAuthorizer("[API_KEY]")// or// Fetch the API key from some source. This function may be called many times,// so it should implement appropriate caching internally.val authorizer = ApiKeyAuthorizer { fetchApiKey() }AMAZON_COGNITO_USER_POOLS
AmplifyApolloConnector を使用して、現在ログインしている Amplify ユーザーのトークンを提供する AuthTokenAuthorizer インスタンスを取得するか、トークン取得を自分で実装できます。
// Using ApolloAmplifyConnector to get the authorizer that connects to your // Amplify instanceval connector = ApolloAmplifyConnector(context, AmplifyOutputs(R.raw.amplify_outputs))val authorizer = connector.authTokenAuthorizer()// or// Using the ApolloAmplifyConnector companion functionval authorizer = AuthTokenAuthorizer { ApolloAmplifyConnector.fetchLatestCognitoAuthToken() }// or// Use your own token fetching. This function may be called many times,// so it should implement appropriate caching internally.val authorizer = AuthTokenAuthorizer { fetchLatestAuthToken()}AWS_LAMBDA および OPENID_CONNECT 認可モード用に、独自のカスタム fetchLatestAuthToken プロバイダーを提供できます。
AWS_IAM
ApolloAmplifyConnector を使用して、トークン取得とリクエスト署名を Amplify に委譲できます。
// Using ApolloAmplifyConnector to get the authorizer that connects to your // Amplify instanceval connector = ApolloAmplifyConnector(context, AmplifyOutputs(R.raw.amplify_outputs))val authorizer = connector.iamAuthorizer()// or// Using the ApolloAmplifyConnector companion functionval authorizer = IamAuthorizer { ApolloAmplifyConnector.signAppSyncRequest(it, "us-east-1") }AWS AppSync は以下の 認可モード をサポートしています。選択した認可タイプに対応する Authorizer を使用してください。
一般的なものは以下の通りです
- API Key Authorization -> APIKeyAuthorizer
- IAM Authorization -> IAMAuthorizer
- Cognito User Pools -> AuthTokenAuthorizer
スキーマに複数の認可ディレクティブを適用する場合、アプリで使用する各 Authorizer に対して個別の Apollo クライアントインスタンスを作成する必要があります。
API_KEY
ApiKeyAuthorizer はハードコードされた API キーを使用するか、何らかのソースからキーを取得することで使用できます:
// Use a hard-coded API keyval authorizer = ApiKeyAuthorizer("[API_KEY]")// or// Fetch the API key from some source. This function may be called many times,// so it should implement appropriate caching internally.val authorizer = ApiKeyAuthorizer { fetchApiKey() }AMAZON_COGNITO_USER_POOLS
AppSync で直接作業する場合は、トークン取得を自分で実装する必要があります。
// Use your own token fetching. This function may be called many times,// so it should implement appropriate caching internally.val authorizer = AuthTokenAuthorizer { fetchLatestAuthToken()}AWS_IAM
AppSync で直接作業する場合は、リクエスト署名を自分で実装する必要があります。
// Provide an implementation of the signing function. This function should implement the // AWS Sig-v4 signing logic and return the authorization headers containing the token and signature.val authorizer = IamAuthorizer { signRequestAndReturnHeaders(it) }AWS AppSync スキーマをダウンロードする
スキーマは Apollo のコード生成ツールによって使用され、GraphQL 操作を実行するのに役立つ API コードを生成します。以下の手順では、AppSync スキーマを Apollo のコード生成プロセスと統合します:
- AWS AppSync コンソール でお使いの API に移動します。
- 左側で Schema を選択します。
- Export schema ドロップダウンを選択し、
schema.jsonファイルをダウンロードします。 - Apollo ドキュメント で指示されたとおり、このファイルをプロジェクトに追加します。
Apollo クライアント用のクエリ、ミューテーション、サブスクリプションを生成する
Amplify が提供する .graphql ファイル
- Amplify Gen 2 バックエンド内で、以下を実行します:
npx ampx generate graphql-client-code --format graphql-codegen --statement-target graphql --out graphql - 生成されたファイル(
mutations.graphql、queries.graphql、subscriptions.graphql)を Apollo ドキュメント に示されているとおり{app}/src/main/graphqlフォルダーにコピーします。
手動
- AWS AppSync コンソール でお使いの API の Queries タブに移動します。ここで、GraphQL プレイグラウンドでクエリ、ミューテーション、サブスクリプションをテストできます。
- エディターに GraphQL 操作(クエリ、ミューテーション、またはサブスクリプション)を入力し、Run を選択して実行します。
- 結果でリクエストとレスポンスの構造を確認します。これにより、Apollo が使用する正確な呼び出しパターンと構造を理解できます。
- プレイグラウンドから GraphQL 操作をコピーし、Apollo ドキュメント に示されているとおり
{app}/src/main/graphqlフォルダーに渡します。
- AWS AppSync コンソール でお使いの API の Queries タブに移動します。ここで、GraphQL プレイグラウンドでクエリ、ミューテーション、サブスクリプションをテストできます。
- エディターに GraphQL 操作(クエリ、ミューテーション、またはサブスクリプション)を入力し、Run をクリックして実行します。
- 結果でリクエストとレスポンスの構造を確認します。これにより、Apollo が使用する正確な呼び出しパターンと構造を理解できます。
- プレイグラウンドから GraphQL 操作をコピーし、Apollo のコード生成ツールに渡して、プロジェクト用の対応する API コードを自動生成します。
AppSync スカラーのタイプマッピング
デフォルトでは、AWS AppSync Scalars は Any タイプになります。app/build.gradle[.kts] ファイルの apollo ブロックを編集して、これらのスカラーをより明示的なタイプにマッピングできます。以下の例では、いくつかの AppSync スカラータイプを Any の代わりに String にマッピングしています。カスタムクラスアダプター を作成することで、日付/時刻スカラーを Kotlin の日付/時刻クラスタイプに変換するための追加の改善を行うことができます。
apollo { service("{serviceName}") { packageName.set("{packageName}") mapScalarToKotlinString("AWSDateTime") mapScalarToKotlinString("AWSEmail") }}