翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
では AWS AppSync、特定のフィルタリングロジックに基づいて、接続されたクライアントから WebSocket 接続を強制的にサブスクリプション解除して閉じる (無効化) ことができます。これは、ユーザーをグループから削除する場合など、承認関連のシナリオで役立ちます。
サブスクリプションの無効化は、ミューテーションで定義されたペイロードに応じて行われます。サブスクリプション接続の無効化に使用されるミューテーションは API の管理操作として扱い、その使用を管理ユーザー、グループ、またはバックエンドサービスに限定して、それに応じて権限の範囲を設定することをおすすめします。例えば、@aws_auth(cognito_groups:
["Administrators"])
または @aws_iam
などのスキーマ認可ディレクティブを使用します。詳細については、「その他の認可モードを使用する」を参照してください。
無効化フィルターは、拡張サブスクリプションフィルターと同じ構文とロジックを使用します。これらのフィルターは、以下のユーティリティを使用して定義します。
-
extensions.invalidateSubscriptions()
– GraphQL リゾルバーのミューテーションのレスポンスハンドラーで定義されます。 -
extensions.setSubscriptionInvalidationFilter()
– ミューテーションにリンクされたサブスクリプションの GraphQL リゾルバーのレスポンスハンドラーで定義されます。
無効化フィルタリング拡張機能の詳細については、「JavaScript リゾルバーの概要」を参照してください。
サブスクリプションの無効化の使用
サブスクリプション無効化の仕組みを確認するには AWS AppSync、次の GraphQL スキーマを使用します。
type User {
userId: ID!
groupId: ID!
}
type Group {
groupId: ID!
name: String!
members: [ID!]!
}
type GroupMessage {
userId: ID!
groupId: ID!
message: String!
}
type Mutation {
createGroupMessage(userId: ID!, groupId : ID!, message: String!): GroupMessage
removeUserFromGroup(userId: ID!, groupId : ID!) : User @aws_iam
}
type Subscription {
onGroupMessageCreated(userId: ID!, groupId : ID!): GroupMessage
@aws_subscribe(mutations: ["createGroupMessage"])
}
type Query {
none: String
}
removeUserFromGroup
ミューテーションリゾルバーコードで無効化フィルターを定義します。
import { extensions } from '@aws-appsync/utils';
export function request(ctx) {
return { payload: null };
}
export function response(ctx) {
const { userId, groupId } = ctx.args;
extensions.invalidateSubscriptions({
subscriptionField: 'onGroupMessageCreated',
payload: { userId, groupId },
});
return { userId, groupId };
}
ミューテーションが呼び出されると、payload
オブジェクトに定義されているデータを使用して、subscriptionField
で定義されたサブスクリプションの購読が解除されます。onGroupMessageCreated
サスクリプションのレスポンスマッピングテンプレートには無効化フィルターも定義されています。
extensions.invalidateSubscriptions()
ペイロードに、フィルターで定義されているサブスクライブされたクライアントの ID と一致する ID が含まれている場合、対応するサブスクリプションはサブスクライブ解除されます。さらに、WebSocket 接続は閉じられます。onGroupMessageCreated
サブスクリプションのサブスクリプションリゾルバーコードを定義します。
import { util, extensions } from '@aws-appsync/utils';
export function request(ctx) {
// simplfy return null for the payload
return { payload: null };
}
export function response(ctx) {
const filter = { groupId: { eq: ctx.args.groupId } };
extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));
const invalidation = { groupId: { eq: ctx.args.groupId }, userId: { eq: ctx.args.userId } };
extensions.setSubscriptionInvalidationFilter(util.transform.toSubscriptionFilter(invalidation));
return null;
}
サブスクリプションレスポンスハンドラーには、サブスクリプションフィルターと無効化フィルターの両方を同時に定義できることに注意してください。
例えば、クライアント A が次のサブスクリプションリクエストを使用して、その ID
を持つ新しいユーザーを ID group-1
のグループにサブスクライブするとします。user-1
onGroupMessageCreated(userId : "user-1
", groupId: :"group-1
"){...}
AWS AppSync はサブスクリプションリゾルバーを実行します。このリゾルバーは、前述のonGroupMessageCreated
レスポンスマッピングテンプレートで定義されているサブスクリプションフィルターと無効化フィルターを生成します。クライアント A の場合、サブスクリプションフィルタはへのデータ送信のみを許可し
、無効化フィルタは group-1
と user-1
の両方に定義されます。group-1
ここで、クライアント B が次のサブスクリプションリクエストを使用して、その ID
を持つユーザーをその ID user-2
のグループにサブスクライブすると仮定します。group-2
onGroupMessageCreated(userId : "user-2
", groupId: :"group-2
"){...}
AWS AppSync はサブスクリプションリゾルバーを実行し、サブスクリプションフィルターと無効化フィルターを生成します。クライアント B の場合、サブスクリプションフィルタはデータ送信先を
のみを許可し、無効化フィルタは group-2
と user-2
の両方に定義されます。group-2
次に、ID
の付いた新しいグループメッセージが、次の例のようにミューテーションリクエストを使用して作成されると仮定します。message-1
createGroupMessage(id: "message-1
", groupId :
"group-1
", message: "test message"){...}
定義されたフィルターに一致するサブスクライブされたクライアントは、WebSockets を介して次のデータペイロードを自動的に受信します。
{
"data": {
"onGroupMessageCreated": {
"id": "message-1",
"groupId": "group-1",
"message": "test message",
}
}
}
フィルター条件が定義済みのサブスクリプションフィルターと一致するため、クライアント A はメッセージを受信します。ただし、ユーザーは
に参加していないため、クライアント B はメッセージを受信しません。また、リクエストはサブスクリプションリゾルバーで定義されているサブスクリプションフィルターと一致しません。group-1
最後に、
が次のミューテーションリクエストの使用して user-1
から削除されたと仮定します。group-1
removeUserFromGroup(userId: "user-1", groupId : "group-1"){...}
ミューテーションは、extensions.invalidateSubscriptions()
リゾルバーレスポンスハンドラーコードで定義されているサブスクリプションの無効化を開始します。 AWS AppSync その後、クライアント A のサブスクリプションを解除し、WebSocket 接続を閉じます。ミューテーションで定義された無効化ペイロードがユーザーまたはグループと一致しないため、クライアント B は影響を受けません。
が接続 AWS AppSync を無効にすると、クライアントはサブスクリプション解除されたことを確認するメッセージを受け取ります。
{
"message": "Subscription complete."
}
サブスクリプション無効化フィルターでのコンテキスト変数の使用
拡張サブスクリプションフィルターと同様に、サブスクリプション無効化フィルター拡張のcontext
変数を使用して特定のデータにアクセスできます。
例えば、ミューテーションの無効化ペイロードとして E メールアドレスを設定し、そのアドレスを Amazon Cognito ユーザープールまたは OpenID Connect で認証されたサブスクライブユーザーからのメール属性またはクレームと照合することができます。extensions.setSubscriptionInvalidationFilter()
サブスクリプション無効化ツールで定義された無効化フィルターは、ミューテーションの extensions.invalidateSubscriptions()
ペイロードによって設定されたメールアドレスが、context.identity.claims.email
でユーザーの JWT トークンから取得したメールアドレスと一致するかどうかを確認し、無効化を開始します。