でのサーバー側のキャッシュとAPIペイロード圧縮の設定 AWS AppSync - AWS AppSync

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

でのサーバー側のキャッシュとAPIペイロード圧縮の設定 AWS AppSync

AWS AppSyncの AppSync のサーバー側のデータキャッシング機能は、データを高速インメモリキャッシュで利用できるようにし、パフォーマンスを高め、レイテンシーを減らします。これにより、データソースに直接アクセスする必要が少なくなります。キャッシングは、ユニットリゾルバーとパイプラインリゾルバーの両方で使用できます。

AWS AppSync では、ペイロードコンテンツのロードとダウンロードが高速化されるように、APIレスポンスを圧縮することもできます。これにより、アプリケーションへの負担を軽減できると同時に、データ転送料金も削減できる可能性があります。圧縮動作は設定可能で、独自の判断で設定できます。

でサーバー側のキャッシュと圧縮の望ましい動作を定義する方法については、このセクションを参照してください AWS AppSync API。

インスタンスのタイプ

AWS AppSync は、 と同じ AWS アカウントと AWS リージョンで Amazon ElastiCache (Redis OSS) インスタンスをホストします AWS AppSync API。

次の ElastiCache (Redis OSS) インスタンスタイプを使用できます。

small

1 v CPU、1.5 GiB RAM、低~中程度のネットワークパフォーマンス

medium

2 v CPU、3 GiB RAM、低~中程度のネットワークパフォーマンス

large

2 v CPU、12.3 GiB RAM、最大 10 ギガビットのネットワークパフォーマンス

xlarge

4 v CPU、25.05 GiB RAM、最大 10 ギガビットのネットワークパフォーマンス

2xlarge

8 v CPU、50.47 GiB RAM、最大 10 ギガビットのネットワークパフォーマンス

4xlarge

16 v CPU、101.38 GiB RAM、最大 10 ギガビットのネットワークパフォーマンス

8xlarge

32 v CPU、203.26 GiB RAM、10 ギガビットネットワークパフォーマンス (一部のリージョンでは使用できません)

12xlarge

48 v CPU、317.77 GiB RAM、10 ギガビットネットワークパフォーマンス

注記

従来は、特定のインスタンスタイプ ( t2.medium など) を指定しました。2020 年 7 月時点で、これらのレガシーインスタンスタイプは引き続き利用可能になりますが、使用は推奨されなくなります。ここで説明するジェネリックインスタンスタイプを使用することをお勧めします。

キャッシュの動作

以下は、キャッシュに関連する動作です。

なし

サーバー側のキャッシュはありません。

完全なリクエストのキャッシュ

データがキャッシュにない場合、データはデータソースから取得され、有効期間 (TTL) が終了するまでキャッシュに入力されます。に対する後続のすべてのリクエストAPIは、キャッシュから返されます。つまり、 TTLの有効期限が切れない限り、データソースには直接連絡されません。この設定でのキャッシュキーとして、context.arguments および context.identity マップのコンテンツを使用します。

リゾルバーごとのキャッシュ

この設定では、レスポンスをキャッシュするために、各リゾルバーを明示的にオプトインする必要があります。リゾルバーで TTLおよび キャッシュキーを指定できます。指定できるキャッシュキーは、これらのマップの最上位マップ context.argumentscontext.sourcecontext.identity、および/または文字列フィールドです。TTL 値は必須ですが、キャッシュキーはオプションです。キャッシュキーを何も指定しない場合、デフォルトは、context.argumentscontext.sourcecontext.identity マップの内容です。

たとえば、以下のようなコマンドを実行できます。

  • context.argumentscontext.source

  • context.argumentscontext.identity.sub

  • context.arguments.id または context.arguments.InputType.id

  • context.source.idcontext.identity.sub

  • context.identity.claims.username

のみを指定TTLし、キャッシュキーを指定しない場合、リゾルバーの動作はフルリクエストキャッシュと同じです。

キャッシュの存続時間 (TTL) 。

この設定は、キャッシュされたエントリがメモリに保存される時間を定義します。最大TTLは 3,600 秒 (1 時間) で、その後、エントリは自動的に削除されます。

キャッシュ暗号化

キャッシュ暗号化には次の 2 種類があります。これらは、 ElastiCache (Redis OSS) が許可する設定に似ています。暗号化設定は、 のキャッシュを最初に有効にするときにのみ有効にできます AWS AppSync API。

  • 転送中の暗号化 – AWS AppSync、キャッシュ、データソース (安全でないHTTPデータソースを除く) 間のリクエストは、ネットワークレベルで暗号化されます。エンドポイントでデータの暗号化と復号を行うにはある程度の処理が必要であるため、転送時の暗号化がパフォーマンスに影響を及ぼす可能性があります。

  • 保管時の暗号化: スワップオペレーション中にメモリからディスクに保存されたデータは、キャッシュインスタンスで暗号化されます。この設定はパフォーマンスにも影響します。

キャッシュエントリを無効にするには、 AWS AppSync コンソールまたは () AWS Command Line Interface を使用してフラッシュキャッシュAPIコールを実行できますAWS CLI。

詳細については、 AWS AppSync APIリファレンスApiCacheのデータ型を参照してください。

キャッシュエビクション

AWS AppSyncのサーバー側のキャッシュを設定する場合、最大 を設定できますTTL。これは、キャッシュされたエントリがメモリに保存される時間を定義します。キャッシュから特定のエントリを削除する必要がある場合は、リゾルバー AWS AppSyncのリクエストまたはレスポンスで のevictFromApiCache拡張機能ユーティリティを使用できます。(たとえば、データソース内のデータが変更され、キャッシュエントリが古くなった場合など)。キャッシュからアイテムをエビクトするには、そのキーを知っている必要があります。このため、アイテムを動的にエビクトする必要がある場合は、リゾルバーごとのキャッシュを使用し、キャッシュにエントリを追加するために使用するキーを明示的に定義することをおすすめします。

キャッシュエントリーのエビクション

キャッシュからアイテムを削除するには、evictFromApiCache 拡張ユーティリティを使用します。タイプ名とフィールド名を指定し、キーと値の項目のオブジェクトを指定して、エビクトするエントリのキーを作成します。オブジェクト内の各キーは、キャッシュされたリゾルバーの cachingKey リストで使用されている context オブジェクトからの有効なエントリを表します。各値は、キーの値を構成するために使用される実際の値です。オブジェクト内の項目は、キャッシュされたリゾルバーの cachingKey リストにあるキャッシュキーと同じ順序で配置する必要があります。

例えば、以下のスキーマを参照してください。

type Note { id: ID! title: String content: String! } type Query { getNote(id: ID!): Note } type Mutation { updateNote(id: ID!, content: String!): Note }

この例では、リゾルバーごとのキャッシュを有効にしてから、getNote クエリで有効にすることができます。次に、キャッシュキーを [context.arguments.id] で構成するように構成できます。

を取得しようとするとNote、 はgetNoteクエリの id 引数を使用してサーバー側のキャッシュでルックアップ AWS AppSync を実行します。

Note を更新するときは、次のリクエストでそのメモがバックエンドデータソースから取得されるように、特定のメモのエントリをエビクトする必要があります。これを行うには、リクエストハンドラーを作成する必要があります。

次の例は、このメソッドを使用してエビクションを処理する 1 つの方法を示しています。

import { util, Context } from '@aws-appsync/utils'; import { update } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { extensions.evictFromApiCache('Query', 'getNote', { 'ctx.args.id': ctx.args.id }); return update({ key: { id: ctx.args.id }, update: { context: ctx.args.content } }); } export const response = (ctx) => ctx.result;

または、レスポンスハンドラーでエビクションを処理することもできます。

updateNote ミューテーションが処理されると、 はエントリを削除 AWS AppSync しようとします。エントリが正常にクリアされると、レスポンスには削除されたエントリの数を示す apiCacheEntriesDeleted 値が extensions オブジェクトに含まれます。

"extensions": { "apiCacheEntriesDeleted": 1}

ID に基づくキャッシュエントリのエビクション

context オブジェクトの複数の値に基づいてキャッシュキーを作成できます。

たとえば、Amazon Cognito ユーザープールをデフォルトの認証モードとして使用し、Amazon DynamoDB データソースを基盤とする次のスキーマを考えてみましょう。

type Note { id: ID! # a slug; e.g.: "my-first-note-on-graphql" title: String content: String! } type Query { getNote(id: ID!): Note } type Mutation { updateNote(id: ID!, content: String!): Note }

Note オブジェクトタイプは DynamoDB テーブルに保存されます。このテーブルには、Amazon Cognito ユーザー名をプライマリキーとして使用し、Noteid (スラッグ) をパーティションキーとして使用する複合キーがあります。これはマルチテナントシステムで、複数のユーザーがプライベートオブジェクトをホストして更新できますが、プライベート Note オブジェクトは決して共有されません。

これは読み取り負荷の高いシステムであるため、getNote クエリはリゾルバーごとのキャッシュを使用してキャッシュされ、キャッシュキーは [context.identity.username, context.arguments.id] で構成されます。Note が更新されると、その特定のエントリをエビクトできます。Noteリゾルバーの cachingKeys リストで指定されているのと同じ順序でコンポーネントをオブジェクトに追加する必要があります。

次の例でこれを示します。

import { util, Context } from '@aws-appsync/utils'; import { update } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { extensions.evictFromApiCache('Query', 'getNote', { 'ctx.identity.username': ctx.identity.username, 'ctx.args.id': ctx.args.id, }); return update({ key: { id: ctx.args.id }, update: { context: ctx.args.content } }); } export const response = (ctx) => ctx.result;

バックエンドシステムでも Note を更新してエントリをエビクトできます。例として、このミューテーションを取り上げます。

type Mutation { updateNoteFromBackend(id: ID!, content: String!, username: ID!): Note @aws_iam }

エントリはエビクトできますが、キャッシュキーのコンポーネントは cachingKeys オブジェクトに追加できます。

次の例では、エビクションはリゾルバーの応答で行われます。

import { util, Context } from '@aws-appsync/utils'; import { update } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { return update({ key: { id: ctx.args.id }, update: { context: ctx.args.content } }); } export function response(ctx) { extensions.evictFromApiCache('Query', 'getNote', { 'ctx.identity.username': ctx.args.username, 'ctx.args.id': ctx.args.id, }); return ctx.result; }

バックエンドデータが の外部で更新された場合は AWS AppSync、NONEデータソースを使用するミューテーションを呼び出すことで、キャッシュから項目を削除できます。

API レスポンスの圧縮

AWS AppSync は、クライアントが圧縮ペイロードをリクエストできるようにします。リクエストされた場合、APIレスポンスは圧縮され、圧縮されたコンテンツが望ましいことを示すリクエストに応答して返されます。圧縮APIレスポンスのロード速度が向上し、コンテンツのダウンロード速度が向上し、データ転送料金も削減される可能性があります。

注記

圧縮は、2020 年 6 月 1 日以降にAPIs作成されたすべての新しい で使用できます。

AWS AppSync は、ベストエフォートベースでオブジェクトを圧縮します。まれに、現在の容量など、さまざまな要因に基づいて圧縮をスキップ AWS AppSync することがあります。

AWS AppSync は、GraphQL クエリペイロードサイズを 1,000 ~ 10,000,000 バイトに圧縮できます。圧縮を有効にするには、クライアントは gzip 値を含む Accept-Encoding ヘッダーを送信する必要があります。圧縮は、応答 (gzip) Content-Encoding 内のヘッダーの値をチェックすることで確認できます。

AWS AppSync コンソールのクエリエクスプローラーは、デフォルトでリクエストのヘッダー値を自動的に設定します。応答が十分大きいクエリを実行した場合、ブラウザの開発者ツールを使用して圧縮を確認できます。