我用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版本)

尝试的内容

使用了一个库

ライブラリ名バージョンaws-cdk-lib2.25.0@aws-cdk/aws-appsync-alpha2.25.0-alpha.0
    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 后端完成,我会更新一些更加详细的内容。

以上的内容。

广告
将在 10 秒后关闭
bannerAds