この記事の対象となる方
- AWS Amplifyを使用して、Lambda(function)を作成しデプロイしている
- Lambda(function)にAppSync(api)を叩く権限を与えたい
- さらにLambda(function)にDynamoDB参照・更新などの権限を与えたい
- しかし巧く行かない
- 作成される環境変数
API_XXXX_GRAPHQLAPIENDPOINTOUTPUTがヘンなのでAppSyncのエンドポイント取得に使えない…。
- 作成される環境変数
問題の中身
基本的に、amplify add functionやamplify update functionコマンドから? Do you want to configure advanced settings?でyesを選択し、
◉ auth
◉ storage
◯ function
❯◉ api
◯ custom
こんな感じで選択すれば、それぞれのリソースへの権限が解決されるはずです。
自動でIAMロールが付与されるので、Lambdaのコード内でAppSyncを使用する際に殆ど意識する必要がないのはホントに素晴らしい( 環境変数のAWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN、API_XXXX_GRAPHQLAPIENDPOINTOUTPUTを使えば万事OK。あ、api側にIAMによるアクセスを許可する必要はありますよ )・・・ですが・・・。
デプロイすると、Lambda内で使いたい環境変数API_XXXX_GRAPHQLAPIENDPOINTOUTPUTが、何故かデフォ値のapixxxxGraphQLAPIEndpointOutputになってしまうのです。デプロイ後のコンソールを見ると、https://xxxxxxxx/graphqlではなく、エンドポイントに使えない文字列が入っています。

ちなみに、amplify-cliのバージョンは10.5.1です。

結論から
解決方法は以下のとおりです。
- とりあえず
amplify add functionやamplify update functionコマンドで一通り権限を付ける。 - 辛いけど
{project}/amplify/backend/backend-config.jsonを編集。GraphQLAPIEndpointOutputを追加する。"funcXXXX": { "build": true, "providerPlugin": "awscloudformation", "service": "Lambda", "dependsOn": [ : : { "category": "api", "resourceName": "{your-api-name}", "attributes": [ "GraphQLAPIIdOutput", + "GraphQLAPIEndpointOutput" ←← これを追加!!! ] }, : : ] }, - さらに辛いけど
amplify env checkout {your-env-name}を実行する。- この手順がないと
{project}/amplify/backend/backend-config.jsonの編集内容が{project}/amplify/backend/amplify-meta.jsonに反映されない。
- この手順がないと
-
amplify pushでデプロイする。
すると、ちゃんとエンドポイントらしい文字列が入ります👏👏
漁ったIssue
- 巧く行かない vs ちゃんとできたけど →
amplify-meta.jsonを手で直せ- ※ 言うまでもないですが、
amplify-meta.jsonはバージョン管理外にすべきですし、手で修正してはならないと公式で謳われています。
- ※ 言うまでもないですが、
-
backend-config.jsonはamplify env checkout {your-env-name}の実行でamplify-meta.jsonに反映されるよ😡
この不具合(?)を再現するポイント
普通にamplify add functionやamplify update functionでapiへの権限のみを付与すると、GraphQLAPIEndpointOutputにちゃんとエンドポイントの文字列が設定されます。
Issueのコメントに出ていた「巧く行った」パターンは恐らくこれです。
ところが、storageのうち、DynamoDBのTableに対する権限を付与すると、突然backend-config.jsonからdependsOnのGraphQLAPIEndpointOutputが消失してしまうのです。恐らくamplify-cliのバグなのですが、特に修正されないまま放置されているようです。
今のところ、API_XXXX_GRAPHQLAPIENDPOINTOUTPUTの環境変数を、AppSyncのエンドポイントとして使おうと思うと、この方法でしか解決できそうにないです…。
それでは皆様、良いAmplifyライフを。
