Amplify をバージョンアップしたら push できなくなったので Amplify Overrideで解消する
Amplify CLI のバージョンを 4.x から 6.x に上げ、 pushに失敗、最新バージョンの7.xにあげてもpushに失敗し、よくわからないながらも色々やったら解消したのでメモに残しておきます。
Amplify CLI を バージョンアップしたら auth でコケる
使いたい機能があったので Amplify CLI のバージョンを上げ、 push したところ、 APIは更新したものの Auth は更新していないのにも関わらずエラーが出るようになり、MFA 関連のエラーでAmplify Pushに失敗するようになりました。
解決策
上記の 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