かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

AWS Amplify GraphQL API で TypeScript の型が生成されないにハマる

上記の AWS Amplify のチュートリアルで Background に GraphQL を追加するステップで TypeScript の型が生成されなかったりと色々とハマったのでメモ

アプリが TypeScript かどうかは自動で判断してくれる訳ではない

チュートリアルに従って amplify add api で Background に GraphQL の API を追加、amplify/backend/api/<myapi>/schema.graphqlスキーマを追加し amplify push --y でデプロイをしました。
デプロイが完了するとアプリで使えるファイルが生成されますが、これはアプリが TypeScript かどうかは無関係に JavaScript で生成されます。またデフォルトで /src/graphql に出力されるので何処に出力するかを選ぶことができませんでした。

デフォルトで amplify push --y 直後の構成

/root
  |- /amplify
  |- /myapp
  |    |- /src
  |- /src
       |- /graphql
           |- mutations.js
           |- queries.js
           |- subscriptions.js

今回はアプリを /myapp ディレクトリ内に置いていたので、/myapp/src 内に .ts ファイルで出力させたい…

.graphqlconfig.yml でコードの出力を設定できる

When you deploy your GraphQL API to the cloud, you are prompted to configure codegen. When a project is configured to generate code with codegen, it stores all the configuration .graphqlconfig.yml file in the root folder of your project. To make changes to the configuration, use amplify configure codegen.
cf. https://docs.amplify.aws/cli/graphql/client-code-generation/

amplify configure codegen コマンドを対話式で .graphqlconfig.yml ができるようです!

$ amplify configure codegen
? Choose the code generation language target
 typescript
# どこにアプリで使える GraphQL のファイルを出力するか
? Enter the file name pattern of graphql queries, mutations and subscriptions
 myapp/src/graphql/**/*.ts
? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions
 Yes
? Enter maximum statement depth [increase from default if your schema is deeply nested]
 2
# TypeScript で使える GraphQL の型のファイル名と場所を指定
? Enter the file name for the generated code
 myapp/src/API.ts
? Do you want to generate code for your newly created GraphQL API
 Yes

target を TypeScript にしてパスを指定する質問で自分のアプリに合わせて出力したいパスを指定すればOK
質問が完了すると .graphqlconfig.yml がプロジェクトのルートに生成される

.graphqlconfig.yml

projects:
  amplifyhandson:
    schemaPath: amplify/backend/api/<MyAppName>/build/schema.graphql
    includes:
      - myapp/src/graphql/**/*.ts
    excludes:
      - ./amplify/**
    extensions:
      amplify:
        codeGenTarget: typescript
        generatedFileName: myapp/src/API.ts
        docsFilePath: myapp/src/graphql
        region: ap-northeast-1
        apiId: null
        maxDepth: 2

ファイル生成するかの質問に Yes と回答しているとこの時点で GraphQL 関連のファイルが生成されている。
Schema を変更した後など改めて生成する場合は下記コマンドを実行すればOK

$ amplify codegen
✔ Generated GraphQL operations successfully and saved at myapp/src/graphql
✔ Code generated successfully and saved in file myapp/src/API.ts

👇 生成後

/root
  |- /amplify
  |- /myapp
  |    |- /src
  |        |- API.ts
  |        |- /graphql
  |            |- mutations.js
  |            |- queries.js
  |            |- subscriptions.js
  |- .graphqlconfig.yml

これで適時 API.ts などから型ファイルをインポートすればエディタ上で型の保管などが効くようになる!

.js ファイルをそのままにしているとハマりがち

特殊ケースだと思いますが今回私は、対話式で設定ファイルが作成できることを知らなかったので初回に生成された .js ファイルを手動で myapp/src/graphql 内に移動させていて、その後設定ファイルで TypeScript にできることを知り改めてファイル生成を行ったので下記のように同名の .js.ts ファイルが同階層に存在する状態になっていました。

/root
  |- /amplify
  |- /myapp
  |    |- /src
  |        |- API.ts
  |        |- /graphql
  |            |- mutations.js
  |            |- mutations.ts
  |            |- queries.js
  |            |- queries.ts
  |            |- subscriptions.js
  |            |- subscriptions.ts
  |- .graphqlconfig.yml

この状態で import { listNotes } from './graphql/queries'; のようにクエリをインポートしていたのですが、schema を変更しても一向に変更が反映されず数時間溶かしてしまいました。

原因としては単純で .graphqlconfig.yml に TypeScript の設定を追加した後は amplify codegen で出力されるのは .ts のファイルだけで、.js のファイルは古い状態のままになっていて、アプリでインポートされているのが .js ファイルだったというオチでした。

無駄にハマりを避けるために .graphqlconfig.yml を変更した後は先に生成されていたファイルは一度全て消してしまうのが良さそうです。( import されているのが .js の方だと気づくまでマジで数時間とかした… )

所感

教訓。
設定を変更したら、生成されているファイルは削除しておこう

チュートリアルの箇所に TypeScript の場合のリンク貼っておいて欲しいデス… お願いします AWS 様〜 (ᐡ o̴̶̷̤ ﻌ o̴̶̷̤ ᐡ)


[参考]

Firebase Hosting に Google Domains で取った独自ドメインを割り当てる

Firebase Hosting で公開するサイトに GoogleDomains で取った独自ドメインを割り当てたメモ

前提

1. Firebase Hosting でカスタムドメインの設定を行う

Hosting → 「カスタムドメインを追加」を選択
firebaseに独自ドメインを追加する

カスタムドメインを追加の部分に GoogleDomains で取得したドメインを入力して次へ 独自ドメインを追加

所有権の確認が終わったらセットアップモードが表示される
GoogleDomains を使っている場合 クイックセットアップに表示されているAレコードを追加するだけでOKだった。ホスト部分に追加したドメインが表示されている事を確認して値をコピーするなどして保存しておく

Aレコードを保存する
終了してモーダルを閉じるとこの値が確認できないっぽいので値の保存を忘れないように注意

www 付きでアクセスされた場合の設定

ドメインが追加できると www.ドメインも追加するかの確認が表示される
www 付きでアクセスされた場合 www 無しのドメインにリダイレクトさせたいので「追加」を選択する
www付きドメイン

www.自身のドメイン が入力されている状態でモーダルが開く
www付きドメインの追加 問題なければ次へ

同様に www付きドメイン用の Aレコードの値を保存する

GoogleDomains に DNSを追加して Firebase Hosting に接続する

GoogleDomains の DNS から「カスタムリソースレコード」を選択

リソースレコードのタイプを A にしてデータの部分に保存しておいた Aレコードの値を設定する GoogleDomainsとFirebaseHostingを接続する

通常のドメインはホスト名を空白に、www付きドメインwww を入力する
保存をするとドメインの反映待ちになる

独自ドメインの接続が完了すると Firebase Hosting に表示されるステータスが「接続されています」になる 独自ドメインの接続完了

接続完了になったら独自ドメインで Firebase Hosting でホストしているサイトにアクセスできるようになる

所感

今回は急遽独自ドメインを割当てた静的サイトが必要になりました。 AWS の Route53 + S3 と Firebase Hosting で検討して、Firebase Hosting の方が設定事項が少なくホスティングも無料内ででき、元から SSL も付いているので Firebase を選択しました。

同じ Google だからか設定も簡単でした。


[参考]

ホスティング

Tips AWS Amplify のプロジェクトが削除できなくなった

AWS Amplify のチュートリアルをしていてプロジェクトが削除できなくなってハマったのメモ

ResourceNotFoundException 3S bucket にアクセスできない?

AWS のコンソールからプロジェクトを削除しようとしたら次のようなエラーが出て操作できなくなってしまった

Delete backend dev failed with reason: ResourceNotFoundException - An error occurred while processing your request: S3 bucket amplify-XXXXXX-deployment or object #current-cloud-backend.zip was not found.

AWS-CLI のコマンドで環境を削除する

  • Amplify で S3 bucket を使っているのは Backend 環境
  • amplify-cli ではなく aws-cli のコマンドを使って Amplify の Backend 環境を削除できる

Amplify の Backend 環境を削除するコマンド

$ aws amplify delete-backend-environment --app-id <アプリID> --environment-name <環境名>

アプリID, 環境名

  1. AWS Amplify のコンソールから Backend environments のタブをクリック
  2. 「バックエンドを編集」をクリック
  3. 表示されるコード内に アプリID, 環境名 が含まれている 👇
$ amplify pull --appId <アプリID> --envName <環境名>

Amplify Backend 環境の削除

削除が成功すると削除した環境の情報が表示される

$ aws amplify delete-backend-environment --app-id <アプリID> --environment-name <環境名>
{
    "backendEnvironment": {
        "backendEnvironmentArn": "arn:aws:amplify:ap-northeast-1:XXXXX:apps/XXXXX/backendenvironments/<環境名>",
        "environmentName": "<環境名>",
        "stackName": "XXXXXX",
        "deploymentArtifacts": "XXXXXX-deployment",
        "createTime": "2022-06-07T17:33:20.425000+09:00",
        "updateTime": "2022-06-07T17:33:20.425000+09:00"
    }
}

Troubleshooting

You must specify a region.

削除完了の表示が出ずに You must specify a region. という案内が表示されてしまう

$ aws amplify delete-backend-environment --app-id <アプリID> --environment-name <環境名>
You must specify a region. You can also configure your region by running "aws configure".
aws configure で Profile の再ヒモ付を行う

AWS-CLI に紐付けられている IAM Profile と Amplify を操作できる IAM Profile が異なるか、認証が切れているのではないかと思われる。
aws configure で Amplify を操作できる IAM Profile と紐付けたら削除できるようになった

$ aws configure
AWS Access Key ID: <Access Key ID>
AWS Secret Access Key: <Secret Access Key>
Default region name [None]: <Reasion> # ap-northeast-1
Default output format [None]: # json
# Profile の再設定後に削除を実行すればOK
$aws amplify delete-backend-environment --app-id <アプリID> --environment-name <環境名>
{
    "backendEnvironment": {
        "backendEnvironmentArn": "arn:aws:amplify:ap-northeast-1:XXXXX:apps/XXXXX/backendenvironments/<環境名>",
        "environmentName": "<環境名>",
        "stackName": "XXXXXX",
        "deploymentArtifacts": "XXXXXX-deployment",
        "createTime": "2022-06-07T17:33:20.425000+09:00",
        "updateTime": "2022-06-07T17:33:20.425000+09:00"
    }
}

所感

チュートリアルに書かれているコマンドが古いのか、やっているてもチュートリアルで書かれている通りにならず環境再構築とか繰り返しているとコンソールから操作不能になってしまってかなり焦りました。
何とか危機を脱しましたが AWS Amplify サクッと環境できて便利だけど、AWSの理解が浅いとトラブルとブラックボックス過ぎてなんもわからん…ってなるからトラブルとチョット困る。


[参考]