翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
でのサーバー側のキャッシュと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.arguments
、context.source
、context.identity
、および/または文字列フィールドです。TTL 値は必須ですが、キャッシュキーはオプションです。キャッシュキーを何も指定しない場合、デフォルトは、context.arguments
、context.source
、context.identity
マップの内容です。たとえば、以下のようなコマンドを実行できます。
-
context.arguments と context.source
-
context.arguments と context.identity.sub
-
context.arguments.id または context.arguments.InputType.id
-
context.source.id と context.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 ユーザー名をプライマリキーとして使用し、Note
の id
(スラッグ) をパーティションキーとして使用する複合キーがあります。これはマルチテナントシステムで、複数のユーザーがプライベートオブジェクトをホストして更新できますが、プライベート 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 コンソールのクエリエクスプローラーは、デフォルトでリクエストのヘッダー値を自動的に設定します。応答が十分大きいクエリを実行した場合、ブラウザの開発者ツールを使用して圧縮を確認できます。