😇

Amplify Function (Lambda) からAppSyncを叩こうとしたときに401 Unauthorizedが返ってくる

2021/03/23に公開

AmplifyのFunction (Lambda)からAppSyncを利用する際、401 Unauthorizedが返ってくるケースがありました。そのときに対処したログを残しておきます。

CloudFormationに詳しくなくて根本原因はわかっていないので、最適解であるかはわかりません。

環境

  • PC: macOS Big Sur (11.2.3)
  • Amplify CLI: ver 4.45.2
  • Lambda Runtime: Node.js 14.x

エラー内容

1. Amplifyで設定

Amplify CLIでfunctionを作る際または更新する際の設定で、API(AppSync)へのcreate権限をつけました。

? Which setting do you want to update? Resource access permissions
? Select the categories you want this function to have access to. api
? Select the operations you want to permit on cheersake create

2. 401 Unauthorized

このままLambda内でAppSyncを叩くと、401 Unauthorizedが返ってきます。AppSyncから返ってくるエラーは以下のようでした。

{
  "graphQLErrors": [
    {
      "path": ["<フィールド名>"],
      "data": null,
      "errorType": "Unauthorized",
      "errorInfo": null,
      "locations": [{ "line": 2, "column": 3, "sourceName": null }],
      "message": "Not Authorized to access <メソッド名> on type Mutation"
    },
    {
      "path": ["<フィールド名>"],
      "data": null,
      "errorType": "Unauthorized",
      "errorInfo": null,
      "locations": [{ "line": 7, "column": 3, "sourceName": null }],
      "message": "Not Authorized to access <メソッド名> on type Mutation"
    }
  ],
  "networkError": null,
  "message": "GraphQL error: Not Authorized to access <メソッド名> on type Mutation\\nGraphQL error: Not Authorized to access <メソッド名> on type Mutation"
}

対処

Functionのxxxxxx-cloudformation-template.jsonを以下のように変更することで同じエラーが起きなくなりました。

PolicyDocumentのStatementの中身を変えています。

Before

xxxxxx-cloudformation-template.json
{
  ...
  "Resources": {
    ...
    "AmplifyResourcesPolicy": {
      "DependsOn": ["LambdaExecutionRole"],
      "Type": "AWS::IAM::Policy",
      "Properties": {
        "PolicyName": "amplify-lambda-execution-policy",
        "Roles": [
          {
            "Ref": "LambdaExecutionRole"
          }
        ],
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": ["appsync:GraphQL"],
              "Resource": [
                {
                  "Fn::Join": [
                    "",
                    [
                      "arn:aws:appsync:",
                      {
                        "Ref": "AWS::Region"
                      },
                      ":",
                      {
                        "Ref": "AWS::AccountId"
                      },
                      ":apis/",
                      {
                        "Ref": "apicheersakeGraphQLAPIIdOutput"
                      },
                      "/types/create/*"
                    ]
                  ]
                }
              ]
            }
          ]
        }
      }
    }
  }
}

After

xxxxxx-cloudformation-template.json
{
...
  "Resources": {
  ...
  "AmplifyResourcesPolicy": {
      "DependsOn": [
        "LambdaExecutionRole"
      ],
      "Type": "AWS::IAM::Policy",
      "Properties": {
        "PolicyName": "amplify-lambda-execution-policy",
        "Roles": [
          {
            "Ref": "LambdaExecutionRole"
          }
        ],
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "appsync:Create*",
                "appsync:StartSchemaCreation",
                "appsync:GraphQL"
              ],
              "Resource": [
                {
                  "Fn::Join": [
                    "",
                    [
                      "arn:aws:appsync:",
                      {
                        "Ref": "AWS::Region"
                      },
                      ":",
                      {
                        "Ref": "AWS::AccountId"
                      },
                      ":apis/",
                      {
                        "Ref": "apicheersakeGraphQLAPIIdOutput"
                      },
                      "/*"
                    ]
                  ]
                }
              ]
            }
          ]
        }
      }
    }
  }
}

Discussion