この記事の対象となる方
- 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ライフを。