Amplifyで構築したAppSync(GraphQL Transformer v2)へPythonで接続する

2023.03.22

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

はじめに

データアナリティクス事業本部のkobayashiです。

以前書いた記事でAmplifyで構築したAppSyncへPythonで接続するといった内容を書きました。内容としてはAmplifyを使ってフロントエンドの開発を行い、他方バックエンド用途として時間のかかる処理をPythonを使って処理するというものでした。今回、久々に同じようなアプリケーションを構築していたのですが、Amplify GraphQL Transformer v2で同じような構成にしようとした際にPythonからの接続で認証エラーが発生し、追加設定が必要だったためまとめます。

AppSyncをPythonで扱う

PythonからAppSyncへ接続する際に使うスクリプトは以前書いたエントリと同じものを使います。

今回も前回と同じGraphQLのスキーマをschema.graphqlを定義し同じPythonモジュールと同一のPythonコードを使って見たところ、Not Authorized to access UserProfile on type Mutationのエラーが出てしまい以前のようなバックエンドのPythonを使っての接続ができませんでした。

Amplifyで構築したAppSync(v2)へPythonで接続する

同じような事例がないかを探していたところAmplify GraphQL Transformer v2では生成されるGraphQLのVTLの認証部分に変更があったためschema.graphqlのauthディレクティブの設定でIAMのAuthorization rulesを設定してもバックエンドのPythonからの認証が通らないと判明しました。

解決方法は簡単でAmplifyの公式ドキュメント(API (GraphQL) - Authorization rules - AWS Amplify Docs )にきちんと設定方法が記載されていました。これによると

  • schema.graphqlのauthディレクティブの設定のIAMルールはAmplifyで生成されたIAMロールのみ対象である
  • AppSyncで追加の認証プロバイダーとしてIAMを追加した際には許可リストを作る必要がある

ということでした。

従って、IAMロール(ユーザー)でバックエンドからPythonを使ってAppSyncに接続するためには追加設定としてその許可リストを作りamplipy pushする必要があります。

やることは単純でAmplifyのディレクトリのbackend/api/{project name}/custom-roles.jsonを追加し、そのファイルにアクセスを許可するIAMロール(ユーザー)のarnを追加するだけになります。

amplify/
└── backend
    └── api
        └── {project name}
            ├── cli-inputs.json
            ├── custom-roles.json <- 追加する
            ├── parameters.json
            ├── schema.graphql
            └── transform.conf.json

custom-roles.json

{
  "adminRoleNames": [
    "arn:aws:iam::1234567890:role/xxxxxxx",
    "arn:aws:iam::1234567890:user/yyyyyyy"
  ]
}

以上で追加設定は完了でamplipy pushした後は前回と同じコードを実行しても今までと同じ用にAppSyncへ接続してQuery,Mutationが行えます。

注意点としては、この方法で認証を追加したIAMロール(ユーザー)にはAppSync上では管理者権限が与えられるため、schema.graphqlのauthディレクティブで行うような細かい権限設定を行うにはIAMロール(ユーザー)に付与するIAMポリシーで制限をかける必要があります。

まとめ

Amplifyで構築したAppSyncへバックエンドのPythonで接続する際の追加設定についてまとめました。 内容としてはAmplify GraphQL Transformer v2で構築したAppSyncで追加の認証プロバイダーとしてIAMを設定した場合はcustom-roles.jsonファイルに接続に使うIAMロール(ユーザー)のarnを設定する必要があるということでした。

最後まで読んで頂いてありがとうございました。