😇

Amplify をバージョンアップしたら push できなくなったので Amplify Overrideで解消する

2022/02/13に公開

Amplify CLI のバージョンを 4.x から 6.x に上げ、 pushに失敗、最新バージョンの7.xにあげてもpushに失敗し、よくわからないながらも色々やったら解消したのでメモに残しておきます。

Amplify CLI を バージョンアップしたら auth でコケる

使いたい機能があったので Amplify CLI のバージョンを上げ、 push したところ、 APIは更新したものの Auth は更新していないのにも関わらずエラーが出るようになり、MFA 関連のエラーでAmplify Pushに失敗するようになりました。

解決策

https://github.com/aws-amplify/amplify-cli/issues/9363
上記の Issue のように、 CLI のバージョンを上げたら最新の Auth で update、既存の Auth と同じ構成で上書きすることにより解消されます。

注意点

既存の Auth が CloudFormation の形でカスタマイズされている場合、カスタマイズされている構成が消去されます。これは後述の override で解消することができます。最初に設定すべきものは override で同じ構成にしないとエラーになりハマります。(エイリアスなど)

override

amplify override auth で backend/auth/${API名}/override.ts でファイルが作成されます。これをカスタマイズし既存のカスタマイズと同じ構成にしていきます。基本的に CDK なので TS の補完をたよりにカスタマイズしていくことになると思います。(または CDK のドキュメントを読む)

カスタマイズ例

以下は

  • カスタム属性
  • ユーザー名とパスワード、またはemailとパスワードでもログインできるようにする
  • SESでメールを送信する

のカスタマイズ例になります。

import { AmplifyAuthCognitoStackTemplate } from '@aws-amplify/cli-extensibility-helper'

export function override(resources: AmplifyAuthCognitoStackTemplate) {
  // custom attributes
  const test1Attribute = {
    attributeDataType: 'String',
    mutable: true,
    name: 'test1',
    required: false,
    stringAttributeConstraints: {
      minLength: '1',
      maxLength: '256',
    },
  }
  
  const test2 = {
    attributeDataType: 'String',
    mutable: true,
    name: 'test2',
    required: false,
    stringAttributeConstraints: {
      minLength: '1',
      maxLength: '256',
    },
  }
  
  resources.userPool.schema = [
    {
      name: 'email',
      required: true,
      mutable: true,
    },
    {
      name: 'name',
      required: true,
      mutable: true,
    },
    test1,
    test2,
  ]

  const attrs = ['email', 'name', 'custom:test1', 'custom:test2']

  resources.userPoolClient.readAttributes = attrs
  resources.userPoolClient.writeAttributes = attrs

  resources.userPoolClientWeb.readAttributes = attrs
  resources.userPoolClientWeb.writeAttributes = attrs

  // alias これがあると email かユーザー名 + パスワードでログインできる。 変更は不可で、push する前にカスタマイズしないといけない
  resources.userPool.aliasAttributes = ['email']

  // email
  resources.userPool.emailConfiguration = {
    emailSendingAccount: 'DEVELOPER',
    from: 'サービス名 <noreply@example.com>',
    sourceArn: 'SESのARNを記述',
  }
}

resources.userPool.schema のところですでに設定されてる属性を取ってきてカスタム属性だけpushしようとしましたが型が解決できなかったので上記のように愚直に name 、 email の属性をセットしています。

おわりに

最近は CDK で色々できるようになったり GraphQLがバージョンアップされ更に便利になりましたが、色々ハマるポイントも多くなってきたように思います。(AppSync の管理画面で非ログイン状態のクエリがデフォルトで叩けなくて泣きました)
Amplify はサクッとアプリが作れますが、バージョンアップが激しいので Issue やコード読んでいく力がないと結構大変だなと数年間ずっと思い続けています。

Discussion