[AWS×GraphQL] GraphQL로 AWSLambda를 invoke한다 feat.AWSAppSync

4775 단어 AppSyncGraphQLAWS
※이 기사는 GraphQL Advent Calendar 2018 21일째의 기사입니다.
※이 기사는 AWS 요소 많아서 보내 드리므로, 양해 바랍니다.

소개



갑자기 여러분은 어떻게 AWSLambda를 invoke하고 있습니까?
AWS 서비스에서 invoke하는 경우
  • APIGateway
  • KinesisDataStreams
  • SNS
  • IoTCore
  • DynamoDBStreams

  • 근처입니까?
    개인적으로 APIGateway에서 Lambda를 invoke하는 패턴이 일반적인 것일까? 라고 생각합니다.
    APIGateway를 세우면 RESTFull에 Lambda를 invoke 할 수 있습니다.
    그것인가 AWSSDK로부터 직접 Lambda를 invoke 한다고 하는 패턴도 있다고 생각합니다.

    이번 주역



    이번 주역은 AWSAppSync입니다!
    간략하게 설명하면 AWSAppSync는 GraphQL을 사용하여 다른 AWS 서비스와 연동할 수 있는 서비스입니다.
    이번 기사처럼 Lambda를 invoke하거나 DynamoDB의 데이터를 직접 조작할 수 있습니다.
    AWS 이용하고 있는 분으로 「GraphQL 시작하고 싶다―」라고 분에게는 추천입니다.



    Lambda 준비



    이번 기사의 내용에서 벗어나 버리므로, 이 순서에 대해서는 생략합니다.
    Lambda의 소스는 무엇이든 좋습니다.
    AppSync를 설정하기 전에 배포하십시오.
    이 기사에서 나오는 Lambda는 런타임 Node.js 8.10입니다.
    코드는 다음과 같습니다. event 의 내용을 출력하고 event.input 를 반환합니다.
    exports.handler = async (event) => {
      console.log(JSON.stringify(event));
      return event.input;
    };
    

    AppSync 설정



    DataSources 추가



    Lambda를 AppSync의 DataSources로 추가해야합니다.
    DataSources에는 Lambda는 물론 DynamoDB 테이블 등을 설정할 수 있습니다.
    DataSources는 요컨대, GraphQL의 Schema의 정의를 할 때, 그 처리의 대상이 되는 자원을 가리킵니다.
    이 처리는 이 Lambda를 invoke하는, 이 처리는 이 DynamoDB의 테이블을 조작하는 형태입니다.

    그럼 추가하겠습니다.
    DateSources 콘솔 화면 왼쪽 상단의 "Create data source"에서


    필요한 항목을 입력・선택하여 「Create」로 추가 완료입니다


    Schema의 정의 작성



    Schema 콘솔 화면에서 다음을 추가합니다.
    
    input InvokeLambdaFunctionInput {
      id: String!
      value: String!
    }
    
    type Mutation {
      // Mutationの一番下の行に追加
      invokeLambdaFunction(input: InvokeLambdaFunctionInput!): AWSJSON
    }
    

    Resolvers 설정



    방금 추가한 Schema의 DataSource를 선택합니다. 여기서 드디어 Lambda와 묶는 형태가 됩니다.
    오른쪽 창의 "Resolvers"열에서 "invokeLambdaFunction"의 "Attach"를 선택


    「Data source name」에서 방금 추가한 DataSource를 선택. 나머지는 기본값으로 "Save Resolver"를 선택합니다.


    이제 준비가 되셨습니다

    실제로 시도해 봅시다.



    Queries의 콘솔 화면에서 사용해 볼 수 있습니다.
    왼쪽 창에 다음과 같이 입력합니다.
    mutation invoke {
      invokeLambdaFunction (input: {
        id: "test invoke"
        value: "test desuyo !!!"
      })
    }
    

    오렌지 실행 버튼을 클릭하면 이렇게 돌아옵니다.
    {
      "data": {
        "invokeLambdaFunction": "{\"id\":\"test invoke\",\"value\":\"test desuyo !!!\"}"
      }
    }
    
    "{\"id\":\"test invoke\",\"value\":\"test desuyo !!!\"}" 라는 타입이 AWSJSON 이라는 타입이 됩니다.
    실제로 사용할 때는 JSON으로 변환할 필요가 있거나 하므로 주의를.

    사이고에게



    네. 이제 GraphQL에서 Lambda를 invoke 할 수있었습니다! 했어! ! !
    개인적으로는 APIGateway를 세우는 수고보다 AppSync로 하는 편이 편했습니다. Auth등에 대해서도 AppSync가 APIKey인증이나, Cognito인증을 하도록(듯이) 설정할 수도 있으므로 걱정은 없습니다.
    웹 앱에서 AppSync를 사용하려면 AWS Amplify를 권장합니다. 이것을 이용하면 비교적 간단하게 AppSync에서 정의한 GraphQL을 이용할 수 있습니다.
    이제 람다가 편리한 것이 되었습니다! 그럼 또! !

    좋은 웹페이지 즐겨찾기