使用 Black Belt Online Seminar 学习的内容,将 AWS AppSync 放在中心,进行总结
考虑使用AWS AppSync时,参考了【AWS Black Belt Online Seminar】关于AWS AppSync的内容,记录了可以做的事情。
AWS AppSync是什么?
可以立即开始使用GraphQL的托管服务。
AWS AppSync的特点是什么?
-
- GraphQLのマネージドサービス
-
- アカウントのDataSourceに接続
-
- データ同期、リアルタイム、オフライン機能を保持していること
-
- GraphQLファサード(複雑な内部処理を意識させることなく利用者にシンプルなインタフェースを提供するパターン)であること
-
- 競合の検出と解決
- セキュリティとしてAPI Key, IAM, Cognito, OIDCが利用可能
开发者面临的问题解决
-
- リアルタイムコラボレーション
-
- 同期を考慮したオフラインプログラミング
-
- 必要なデータのみの取得
-
- 複数のデータソースへのアクセス
- セキュリティを利用したアクセス制御
用例
在AWS AppSync中存在三个主要的应用场景。
-
- リアルタイム
最新の情報をウォッチするダッシュボード
ほぼリアルタイムでデータを更新
コラボレーション
複数ユーザが共同編集を行うアプリケーション
ドキュメント、画像、テキストメッセージ等、様々なコンテンツタイプを自動更新
ソーシャルメディア
ソーシャルメディアやチャット
複数ユーザ間でのメッセージング管理をサポート
オフライン時でもアプリケーションを操作でき、再接続時に自動Sync
AWS AppSync的概念
AWS App Sync Client:認証、オフラインロジックなどを含んだClient
Resolver:リクエスト/ レスポンスの処理を記述する関数
Data Source:DynamoDB/ Lambda/ Aurora Serverless(RDS)/ Elasticsearch/ HTTP Endpoint.(DynamoDBを利用する人が多い)
Identity:GraphQL Proxyへのリクエスト認証
GraphQL Proxy:リクエストのマッピング、コンフリクトのハンドリング、アクセスコントロール
Operation:Query/ Mutation/ SubscriptionなどGraphQLのオペレーション
快速原型制作
AppSync的试验步骤为:模式定义 → 与数据源的连接 → 客户端配置。
Schema的定义
-
- スキーマはサーバの機能を記述し、クエリが有効か透過を判断するために使われる。
-
- GraphQL APIは1つのGraphQL Schemaで定義され、SDL(Schema Definition Language)によって記述される
- Schemaの書き方
type Query {
# スカラー型、オブジェクト型、列挙型を利用可能
# リストが角かっこで表現
getTodos:[Todo]
}
typeTodo {
# Not Nullは感嘆符で表現
id:ID!
name:String
description:String
status:TodoStatus
}
enum TodoStatus{
done
pending
}
与数据源的连接
关于连接数据源和AppSync的解析器
关于Resolver映射模板
-
- マッピングテンプレートは、GraphQLリクエストをデータソースの命令に変換する方法とデータソースからの応答をGraphQLレスポンスに変換する方法を定義する。
- Resolverマッピングテンプレートは、VTL(Velocity Template Language)によって記述される。
使用解析器映射模板进行操作的示例。
-
- アクセスコントロール
-
- 新規アイテムのデフォルト値
-
- 入力のバリデーション、フォーマット
-
- データの変換と整形
-
- リスト、マップの加工
-
- ユーザーIDに基づいたレスポンスのフィルタリング/ 変更
- 複雑な権限チェック
两种映射模板
在映射模板中,有两种类型,一种用于请求(Request),一种用于响应(Response)。
请提供一个用于请求的模板(将请求转化为数据源命令)。
这个苹果是红色的。
{
"version" : "2017-02-28",
"operation" : "GetItem",
"key" : {
"id" : {"S" : "${context.atguments.id}"}
}
}
响应模板(数据源响应 -> GraphQL 响应)
如果默认返回的情况下:
$ utils.toJson($context.result)
如果要整合数据:
{
"id" : ${context.data.id},
"title" : "${context.data.theTitle}",
"content" : "${context.data.body1} ${context.data.body2}"
}
地图模板的描述方法 de
-
- AppSync上のエディタで直接記述
-
- No-code GraphQL API Builderを利用
-
- 記述したSchemaからリゾルバマッピングを直接ジェネレート
- 既存のDynamoDBをデータソースとして指定した場合、そのテーブル定義からマッピングテンプレートをジェネレート
客户设置
与GraphQL Endpoint的连接信息
使用API密钥的示例
export default {
"graphqlEndpoint": "https*//**.appsync-api.**.amazon.com/graphql",
"region": "us-east-1",
"authenticationType": "API_KEY",
"apiKey": "***"
}
客户的各种设置示例
客户配置的示例
const client = new AWSAppSyncClient({
url: awsconfig.ENDPOINT,
region: AWS.config.region,
auth: { type: AUTH_TYPE.AWS_IAM, credentials: Auth.currendCredentials() }
})
const WithProvider = () => (
<ApolloProvider client={client}>
<Rehydrated>
<AppWithData /> 自動でオフライン利用が可能に
</Rehydrated>
</ApolloProvider>
);
※ 亦可通过AWS Amplify直接注入。 在此情况下,还将创建一个可离线使用的模板。
客户端身份验证示例
使用API密钥进行身份验证的模板配置示例。
// API Key
const client = new AWSAppSyncClient({
url: awsconfig.ENDPOINT,
region: awsconfig.REGION,
auth: {type: AUTH_TYPE.API_KEY, apiKey: awsconfig.apiKey}
});
IAM認证的例子
// IAM認証
auth: { type: AUTH_TYPE.AWS_IAM,
credentials: Auth.currentCredentials()
}
Cognito认证的例子
auth: { type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
jwtToken: Auth.currentSession().accessToken.jwtToken
}
哪个更好,API网关还是不存在于视频中的?
API网关可以通过一个API提供多个终点,而AppSync只能提供一个终点来接收GraphQL代码。
根据用例来决定使用GraphQL还是使用REST,总结起来,使用GraphQL时应选择AppSync,而使用REST时则应选择API Gateway。
收费
请提供下列句子的中文本地化释义,仅需一种选择:
– 参考
- AppSync VS APIGateway 両者の違いをスタートアップCTOが本気で考えてみた!