【AWS Amplify】functionの環境変数 "API_XXXX_GRAPHQLAPIENDPOINTOUTPUT" がデフォ値 "apixxxxGraphQLAPIEndpointOutput"になってしまう問題を無理矢理にでも解決する方法

# この記事の対象となる方

- 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`を選択し、
```command
 ◉ 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`ではなく、エンドポイントに使えない文字列が入っています。
![スクリーンショット 2022-11-30 10.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267110/9d721da1-0e5f-f687-d826-6d6dcb8008eb.png)
ちなみに、amplify-cliのバージョンは`10.5.1`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267110/042e7aed-4319-512e-2115-eb587cec519b.png)

# 結論から

解決方法は以下のとおりです。
1. とりあえず`amplify add function`や`amplify update function`コマンドで一通り権限を付ける。
1. 辛いけど`{project}/amplify/backend/backend-config.json`を編集。`GraphQLAPIEndpointOutput`を追加する。
    ```diff_json
    "funcXXXX": {
      "build": true,
      "providerPlugin": "awscloudformation",
      "service": "Lambda",
      "dependsOn": [
        :
        :
        {
          "category": "api",
          "resourceName": "{your-api-name}",
          "attributes": [
            "GraphQLAPIIdOutput",
    +       "GraphQLAPIEndpointOutput" ←← これを追加！！！
          ]
        },
        :
        :
      ]
    },
    ```
1. さらに辛いけど`amplify env checkout {your-env-name}`を実行する。
    - この手順がないと`{project}/amplify/backend/backend-config.json`の編集内容が`{project}/amplify/backend/amplify-meta.json`に反映されない。
1. `amplify push`でデプロイする。

すると、ちゃんとエンドポイントらしい文字列が入ります👏👏

![スクリーンショット 2022-11-30 11.24.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267110/7d5e7c8a-298c-b999-737f-68faefc0c500.png)

# 漁ったIssue

- 巧く行かない vs ちゃんとできたけど → `amplify-meta.json`を手で直せ
    - ※ 言うまでもないですが、`amplify-meta.json`はバージョン管理外にすべきですし、手で修正してはならないと[公式](https://docs.amplify.aws/cli/reference/files/#amplify-metajson "Files and Folders")で謳われています。

https://github.com/aws-amplify/amplify-cli/issues/3941

- `backend-config.json`は`amplify env checkout {your-env-name}`の実行で`amplify-meta.json`に反映されるよ😡

https://github.com/aws-amplify/amplify-cli/issues/3426

# この不具合(？)を再現するポイント

普通に`amplify add function`や`amplify update function`でapiへの権限のみを付与すると、`GraphQLAPIEndpointOutput`にちゃんとエンドポイントの文字列が設定されます。

Issueのコメントに出ていた「巧く行った」パターンは恐らくこれです。

ところが、storageのうち、DynamoDBのTableに対する権限を付与すると、突然`backend-config.json`から`dependsOn`の`GraphQLAPIEndpointOutput`が消失してしまうのです。恐らくamplify-cliのバグなのですが、特に修正されないまま放置されているようです。

今のところ、`API_XXXX_GRAPHQLAPIENDPOINTOUTPUT`の環境変数を、AppSyncのエンドポイントとして使おうと思うと、この方法でしか解決できそうにないです…。

それでは皆様、良いAmplifyライフを。