AWS CDKのv2.55.0からAppSyncのAlphaモジュールで破壊的変更が入ったので修正してみた

AWS CDKのv2.55.0からAppSyncのAlphaモジュールで破壊的変更が入ったので修正してみた

Clock Icon2023.01.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アノテーション の中野です。

プロジェクトの各ライブラリのアップデートを行っている際に、CDKのデプロイ時にエラーが発生しました。

原因として、CDKのAppSyncのAlphaモジュール(@aws-cdk/aws-appsync-alpha)で、2.53.0-alpha.0から2.59.0-alpha.0の間のバージョンで破壊的変更が適用されていたためエラーが発生しました。

その際にドキュメントを読みながらコードに修正を加える必要がありましたので、実際に行った対応をご紹介します。

環境情報

結論

  • @aws-cdk/aws-appsync-alpha2.55.0-alpha.0より破壊的変更が入ってモジュールの使い方が変わった
  • @aws-cdk/aws-appsync-alphav2.60.0からexperimental版からstable版へ移行できるようになったことで、aws-cdk-libに含まれるようになった

エラーメッセージ

私の環境ではcdk deploy時に、2種類のエラーを確認しました。

1. Schemaプロパティが存在しない

error TS2339: Property 'Schema' does not exist on type 'typeof import("/*****/node_modules/@aws-cdk/aws-appsync-alpha/lib/index")'.

schema: appsync.Schema.fromAsset('../schema.graphql'),

このエラーメッセージは、AppSyncのAlphaモジュールにSchemaというプロパティは存在しないという意味です。

2. createResolverの引数は2つである必要がある

error TS2554: Expected 2 arguments, but got 1.

datasource.createResolver({
                   ~~~~~~~~~~~~~~~~
     typeName: 'Query',
    ~~~~~~~~~~~~~~~~~~~~~~
     fieldName: 'fieldName',
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   })
    ~~~~

こちらのエラーメッセージでは、createResolverの引数はこれまで一つでもよかったのですが、v2.55.0から2つの引数が必要ということを意味しています。

エラー原因

発生したエラーは、どこかのバージョンアップでコードの書き方の変更が入ったのだろうと推測しました。

そこで、AWS CDKのGitHubのリリースノートを確認してみることにしました。

すると、v2.55.0よりAppSyncのAlphaモジュールで破壊的な変更が適用されていました。

https://github.com/aws/aws-cdk/releases/tag/v2.55.0

BREAKING CHANGES TO EXPERIMENTAL FEATURES - appsync: DataSource.createResolver,DataSource.createFunction, and GraphQlApi.createResolver now require2 arguments instead of 1. - appsync: Renames Schema to SchemaFile that implements ISchema. Removes all addXxx type methods from GraphQlApi.

上記、リリースノートの通り

  • SchemaSchemaFileへ変更する必要がある
  • DataSource.createResolverDataSource.createFunctionGraphQlApi.createResolverは、2 つの引数が必要になった

とのことです。

修正したコード

「1. Schemaプロパティが存在しない」に対するコードの修正は以下の様に行いました。

  • Before
import * as appsync from '@aws-cdk/aws-appsync-alpha'

appsync.Schema.fromAsset('../schema.graphql')
  • After
import * as appsync from '@aws-cdk/aws-appsync-alpha'

appsync.SchemaFile.fromAsset('../schema.graphql')

「2. createResolverの引数は2つである必要がある」に対するコードの修正は以下の様に行いました。

  • Before
datasource.createResolver(
    {
         typeName: 'Query',
         fieldName: 'fieldName',
    }
)
  • After
datasource.createResolver(
    'QueryFieldNameResolver', // <- ADD: Resolverに指定するidを追加
    {
         typeName: 'Query',
         fieldName: 'fieldName',
    }
)

躓いたポイントと修正点

AppSync論理ID関連のエラー

上述の様に修正してから、cdk deploy 実行後に CloudFormation 上でエラーが発生しました。

  • CloudFormation エラーメッセージ
Only one resolver is allowed per field. (Service: AWSAppSync; Status Code: 400; Error Code: BadRequestException

こちらの原因についてGitHub Issueで調査しました。

私の修正したコードだと、古いリゾルバが削除されて、新しいリゾルバが作成されるときに論理IDが新たなものに置き換えられる挙動となりました。

この挙動によって、重複して同じ論理IDのものをCloudFormationが作ろうとすることでエラーとなることが報告されています。

参照: (aws-appsync): resolver replacement issues #issuecomment-1358835318

既存論理IDを利用するようにコード修正

GitHub Issueで報告されている回避策だと、論理IDは既存のリゾルバのものを使うことで、置き換えが発生せずにCloudFormation上でのエラーは回避できるとのことです。

参照: (aws-appsync): resolver replacement issues #issuecomment-1363154755

実際に以下のように修正したことで、エラーを回避しリゾルバの置き換えも発生しませんでした。
AppSyncモジュールのcreateResolverというメソッドではなく、Resolverというクラスを使うようにコードを変更しています。

  • Before
datasource.createResolver(
    'QueryFieldNameResolver',
    {
         typeName: 'Query',
         fieldName: 'fieldName',
    }
)
  • After
const resolverId = 'QueryFieldNameResolver'

new Resolver(dataSource, resolverId, { // <- resolverIdに既存リゾルバの論理IDを指定
  api: api
  dataSource: dataSource
    typeName: 'Query',
    fieldName: 'fieldName',
})

[補足] Alphaモジュールを安定版へ移行

実は、この対応している間にCDKのv2.60.0がリリースされました。

v2.60.0の変更点として、AppSyncのAlphaモジュールが実験版(experimental)から安定版(stable)へと移行していました。
この変更で、今まで実験版のモジュールのインポートはAlphaモジュールからやっていたものが、aws-cdk-libからインポートできるようになっています。

そのため、以下のようにAlphaモジュールをインポートしている箇所を安定版の方に差し替えても、コードは以前と同様に動作することを確認しました。

前提として、CDK をv1からv2へ移行後に、継続して同様のモジュールを利用するために、Alphaモジュールを使われていたプロジェクトもあるかと思います。
そのような場合は、これを期に安定版に移行してみてもよいかと思います。

  • Before
import * as appsync from '@aws-cdk/aws-appsync-alpha'
  • After
import * as appsync from 'aws-cdk-lib/aws-appsync'

さいごに

CDKで@aws-cdk/aws-appsync-alphaを利用していた方が、バージョンアップした際に躓いた場合の助けになると幸いです。

参考情報

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.