Amplify Function(Lambda)에서 AppSync를 치려고 할 때 401 Unauthorized가 돌아옵니다.

Amplify Function(Lambda)에서 AppSync를 사용할 때 401 Unauthorized가 반환되는 경우가 있습니다.그때 처리했던 일지를 남기겠습니다.
클라우드 포메이션에 대해 상세하지 않아 근본 원인을 알 수 없어 최우선인지 아닌지 모르겠다.

컨디션

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


    1. Amplify 설정


    API(AppSync)에는 Amplify CLI에서 function을 만들거나 업데이트할 때 설정된 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


    이렇게 램바다 안에서 앱Sync를 두드리면 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의 Statiment 컨텐트를 변경하는 중입니다.

    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"
                          },
                          "/*"
                        ]
                      ]
                    }
                  ]
                }
              ]
            }
          }
        }
      }
    }
    

    좋은 웹페이지 즐겨찾기