我用CDK构建了AppSync&Aurora Serverless的GraphQL后端!(2022/05/24版)
记载导致陷入困境的原因
首先
迄今为止,我只实现过使用API Gateway + Lambda + RDS(或Aurora Serverless)作为REST API后端的应用。但是,我现在参与的开发项目中首次实现了AppSync + Aurora Serverless作为GraphQL后端,所以我想简要介绍一下我目前正在实施中的CDK代码的一些研究结果。
如果您想查看关于Aurora Serverless的CDK代码的后续文章,请点击此处。
我们已经尝试使用CDK v2来构建Aurora Serverless V2!(2022/05/24版本)
尝试的内容
使用了一个库
- AppSync は、GraphQLスキーマとリゾルバ(VTLファイル)を分離して参照する形にしたかったので aws-appsync-alpha の方を試してみました。
代码示例
目录结构
.
└ lib
│ ├ api
│ │ ├ schema.graphql
│ │ └ resolvers
│ │ └ items
│ │ ├ get-items-req.vtl
│ │ └ get-items-resp.vtl
│ ├ stack
│ │ └ xxx-stack.tsx
GraphQL模式
图形模式定义文件.graphql
type Item {
id: ID!
name: String
}
type Query {
getItemss: [Item]
}
schema {
query: Query
}
- はじめてのお試しなので Model と Query だけ(Mutation はまだ未定義)
解決者 zhě)
获取物品请求.vtl
## SQLステートメントの定義
#set ($statement = "SELECT * FROM item")
## リクエストテンプレートの定義
## @see https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-rds-resolvers.html
{
"version": "2018-05-29",
"statements": [
$util.toJson(${statement})
]
}
SQLステートメントは複数行で整形して書くこともできる模様
AppSync Resolver multiline string · Issue #2331 · aws-amplify/amplify-cli
version って何のバージョンなのか、まだ未確認
入力データがある場合は、セキュリティ対策のためにサニタイズが必要ということだが、現時点では条件なしの一覧検索なので未確認
获取物品响应.vtl
## レスポンステンプレートの定義
## @see https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-rds-resolvers.html
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0])
- 検索結果をそのまま返すだけなら、お作法に従うだけのよう
堆栈
import * as rds from 'aws-cdk-lib/aws-rds';
import * as appsync from '@aws-cdk/aws-appsync-alpha';
/**
* Aurora Serverless をバックエンドに持つ AppSync GraphQL API の定義
* @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-appsync-alpha-readme.html
* @param scope
* @param cluster ★前回の記事で作成した Aurora Serverless のクラスター★
*/
const graphqlApi = (scope: Construct, cluster: rds.ServerlessCluster) => {
const api = new appsync.GraphqlApi(scope, 'GraphqlApi', {
name: 'GraphqlApi',
schema: appsync.Schema.fromAsset('./lib/api/schema.graphql'),
xrayEnabled: true,
});
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const dataSource = api.addRdsDataSource('RdsDataSource', cluster, cluster.secret!, env.rdsDatabaseName());
dataSource.createResolver({
typeName: 'Query',
fieldName: 'getItems',
requestMappingTemplate: appsync.MappingTemplate.fromFile('./lib/api/resolvers/items/get-items-req.vtl'),
responseMappingTemplate: appsync.MappingTemplate.fromFile('./lib/api/resolvers/items/get-items-resp.vtl'),
});
return api;
};
-
- GraphqlApi
GraphqlApiProps の schema 属性に、schema.graphql ファイルから読み込んだスキーマ定義を指定します
GraphqlApiProps の authorizationConfig 属性を省略すると、既定値は API キーによる認証モードが適用されます
RdsDataSource の createResolver
BaseResolverProps の typeName に GraphQL の操作種別(Query or Mutation)を指定します
BaseResolverProps のと fieldName に、schema.grapql で定義したクエリの名前を指定します
requestMappingTemplate、responseMappingTemplate に、リクエスト・レスポンスそれぞれのリゾルバーファイルから読み込んだテンプレート定義を指定します
看一下代码堆栈,我觉得写得还挺清晰的呢。
与从OpenAPI Spec文件创建API Gateway相比,似乎需要多写一些额外的内容…
迷上了 (Mí
在初次部署时,似乎创建 AWSServiceRoleForAppSync 失败。
14:16:46 | CREATE_FAILED | AWS::AppSync::GraphQLApi | GraphqlApiXXXXXXXX
Failed to assume service-linked role arn:aws:iam::xxxxxxxxxxxx:role/aws-service-role/appsync.amazonaws.com/AWSServiceRoleForAppSync, please retry. (Service: AWSAppSync; Status Code: 403; Error Code: AccessDeniedException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx; Proxy: null)
❌ XxxxStack failed: Error: The stack named XxxxStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Failed to assume service-linked role arn:aws:iam::xxxxxxxxxxxx:role/aws-service-role/appsync.amazonaws.com/AWSServiceRoleForAppSync, please retry. (Service: AWSAppSync; Status Code: 403; Error Code: AccessDeniedException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx; Proxy: null)
at prepareAndExecuteChangeSet (/xxxx/node_modules/aws-cdk/lib/api/deploy-stack.ts:385:13)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
at CdkToolkit.deploy (/xxxx/node_modules/aws-cdk/lib/cdk-toolkit.ts:209:24)
at initCommandLine (/xxxx/node_modules/aws-cdk/lib/cli.ts:341:12)
The stack named XxxxStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Failed to assume service-linked role arn:aws:iam::xxxxxxxxxxxx:role/aws-service-role/appsync.amazonaws.com/AWSServiceRoleForAppSync, please retry. (Service: AWSAppSync; Status Code: 403; Error Code: AccessDeniedException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx; Proxy: null)
问题编号#16598
在撰写时,似乎存在未解决的问题。
重新部署后将正常运行,若出现错误,请重新执行即可正常运作。
最后
一旦 AppSync 和 Aurora Serverless 的 GraphQL 后端完成,我会更新一些更加详细的内容。
以上的内容。