서버 없는 Lamba 함수를 Appsync 및 DynamoDB와 결합하는 방법

AWS Lambda 함수를 백엔드로 사용하여 AWS 클라우드에 배포하는 방법(첫 부분)


본 강좌에서 우리는 다음과 같은 내용을 배울 것이다

  • CRUD 작업에 대한 Lamda 함수 코드를 작성하는 방법
  • Appsync 및:
  • 유형
  • 돌연변이
  • 쿼리
  • 2부에서는 Appsync Graphql Api와 React 프런트엔드를 연결합니다.


    이 자습서에는 AWS 계정이 필요합니다.고급 AWS 계정이 없으면 AWS with Freetier를 사용하여 AWS-CDK 응용 프로그램을 AWS 클라우드에 배치할 수 있습니다.그리고 우리는 로컬 PC나 노트북에 AWS를 설정해야 합니다. 만약에 AWS-CDK를 설정하지 않았다면 아래에 제시된 게시물에 따라 로컬 컴퓨터에 AWS-CDK를 설정할 수 있습니다.
    AWS S3 버킷에 정적 페이지를 배치하고 Cloud fron을 사용하여 이러한 페이지를 전달하는 방법에 관심이 있다면 다음 지침을 따르십시오.
    이 문서에서 AWS 서비스의 고급 주제를 학습합니다.
    터미널을 사용하여 간단한 AWS-CDK 응용 프로그램을 만듭니다.

    01단계


    typescript를 사용하여 AWS-CDK 응용 프로그램 초기화cdk init app --language typescriptTypescript를 설치하지 않은 경우 Typescript를 사용합니다. 이 명령을 실행하여 Typescript를 전역적으로 설치하십시오.npm -g install typescript

    02단계


    설치에 필요한 의존항입니다.모든 의존 항목은 하나의 명령을 통해 설치할 수도 있고, 하나씩 설치할 수도 있다.이 명령을 복사해서 필요한 의존항을 설치합니다npm i @aws-cdk/aws-appsync @aws-cdk/aws-lambda @aws-cdk/aws-dynamodb

    왜 AppSync입니까?


    조직은 GraphQL을 사용하여 API를 구축하기로 선택했다. 왜냐하면 전방 개발자들이 하나의 GraphQL 단점을 사용하여 여러 개의 데이터베이스, 마이크로 서비스, API를 조회할 수 있기 때문에 그들이 더욱 빨리 응용 프로그램을 개발할 수 있도록 돕기 때문이다.
    AWS AppSync는 AWS DynamoDB, Lambda 등 데이터 소스에 안전하게 연결되는 번거로운 작업을 처리함으로써 GraphQL API를 쉽게 개발할 수 있는 완전한 관리 서비스다.캐시를 추가하여 성능을 향상시키고 구독을 통해 실시간 업데이트를 지원하며 오프라인 클라이언트의 동기화를 유지하는 클라이언트 데이터 저장도 마찬가지로 간단하다.배포 후 AWS AppSync는 자동으로 GraphQL API 실행 엔진을 위아래로 확장하여 API 요청량을 충족시킵니다.다음과 같은 게시물에서도 도움을 받을 수 있습니다.
    Building Real-time Serverless APIs with PostgreSQL, CDK, TypeScript, and AWS AppSync
    응용 프로그램에서 AWS Appsync를 사용하기 때문에 Appsync를 사용할 때 가장 먼저 해야 할 일은 graphql 형식으로 형식, 조회, 변이를 정의하는 것입니다.
    type Todo {
      id: ID!
      title: String!
      done: Boolean!
    }
    
    input TodoInput {
      id: ID!
      title: String!
      done: Boolean!
    }
    
    type Query {
      getTodos: [Todo]
    }
    
    type Mutation {
      addTodo(todo: TodoInput!): Todo
      updateTodo(todo: TodoInput!): Todo
      deleteTodo(todoId: String!): String
    }
    
    이 코드를 복사해서 붙여넣습니다.graphQL/schema.gql\
    여기서 우리는 모든 TODO를 얻기 위한 검색을 정의했고, TODO를 추가, 업데이트, 삭제할 세 가지 돌연변이를 정의했다.우리는 또한 lambda 함수를 호출할 때 전달해야 할 매개 변수를 설명했다.
    다음 단계에서는/lib/todo 스택 상단의 Appsynct를 가져옵니다.다음과 같습니다.
    import * as appsync from '@aws-cdk/aws-appsync';
    
    그런 다음 다음과 같은 Appsync 구성을 발표했습니다.
     const api = new appsync.GraphqlApi(this, "GRAPHQL_API", {
          name: 'todo-api',
          schema: appsync.Schema.fromAsset('graphQL/schema.gql'),       ///Path specified for lambda
          authorizationConfig: {
            defaultAuthorization: {
              authorizationType: appsync.AuthorizationType.API_KEY,     ///Defining Authorization Type  
            },
          },
    
        })
    
    
    위 코드에서 Appsync API를 만들고 API 이름 및 패턴과 같은 필수 매개 변수를 전달했으며 응용 프로그램에서 이 매개 변수를 사용한 다음 인증 구성을 사용합니다.

    데이터 리소스로서의 Lamda 기능


    GraphQL 조회를 호출할 때, 응답할 데이터 원본이 필요합니다.이 문서에서 Lambda 함수를 Appsync API의 데이터 소스로 사용하여 TODO를 데이터베이스에 저장하고 레코드를 검색합니다.AWS lambda 함수의 인스턴스를 만듭니다.이 코드를 Lambda 함수에 사용합니다.가져오기* 위쪽 lambda
    import * as lambda from '@aws-cdk/aws-lambda';
    
    그리고 이 코드를 적어주세요.
     ///Lambda Fucntion
        const todoLambda = new lambda.Function(this, "TodoFucntion", {
          functionName:"todoHandler",
          runtime: lambda.Runtime.NODEJS_12_X,            ///set nodejs runtime environment
          code: lambda.Code.fromAsset("functions"),          ///path for lambda function directory
          handler: 'main.handler',                       ///specfic fucntion in specific file
        })
    
    이 코드를 설명해 봅시다. 우리는 lambda 함수의 실례를 만들고 필요한 설정을 통과했습니다.함수 이름 고유한 이름을 사용할 수 있습니다(기존 Lambda 함수에서 고유함)2.Lambda 함수에 사용되는 Nodejs 버전, 3을 설명합니다.디렉터리는 우리가 작성한 함수의 주요 코드다.루트 디렉터리의functions 폴더에 코드를 작성했습니다.그리고handler는 lambda 함수 코드의 함수 이름입니다.

    다음에 우리는 lambda 함수를 위해 코드를 작성할 것이다.


    const AWS = require('aws-sdk');
    const docClient = new AWS.DynamoDB.DocumentClient();
    // Function Declation to add New Todo
    async function addTodo(todo: Todo) {
        const params = {
            TableName: process.env.TODOS_TABLE,
            Item: todo
        }
        try {
            await docClient.put(params).promise();
            return todo;
        } catch (err) {
            console.log('DynamoDB error: ', err);
            return null;
        }
    }
    
    // Function Declation to Get all todo list
    async function getTodos() {
        const params = {
            TableName: process.env.TODOS_TABLE,
        }
        try {
            const data = await docClient.scan(params).promise()
            return data.Items
        } catch (err) {
            console.log('DynamoDB error: ', err)
            return null
        }
    }
    // Function Declation to Delete Todo
    async function deleteTodo(todoId: string) {
        const params = {
            TableName: process.env.TODOS_TABLE,
            Key: {
                id: todoId
            }
        }
        try {
            await docClient.delete(params).promise()
            return todoId
        } catch (err) {
            console.log('DynamoDB error: ', err)
            return null
        }
    }
    
    // Function Declation to Update Todo
    
    type Params = {
        TableName: string | undefined,
        Key: string | {},
        ExpressionAttributeValues: any,
        ExpressionAttributeNames: any,
        UpdateExpression: string,
        ReturnValues: string
    }
    
    async function updateTodo(todo: any) {
        let params: Params = {
            TableName: process.env.TODOS_TABLE,
            Key: {
                id: todo.id
            },
            ExpressionAttributeValues: {},
            ExpressionAttributeNames: {},
            UpdateExpression: "",
            ReturnValues: "UPDATED_NEW"
        };
        let prefix = "set ";
        let attributes = Object.keys(todo);
        for (let i = 0; i < attributes.length; i++) {
            let attribute = attributes[i];
            if (attribute !== "id") {
                params["UpdateExpression"] += prefix + "#" + attribute + " = :" + attribute;
                params["ExpressionAttributeValues"][":" + attribute] = todo[attribute];
                params["ExpressionAttributeNames"]["#" + attribute] = attribute;
                prefix = ", ";
            }
        }
    
        try {
            await docClient.update(params).promise()
            return todo
        } catch (err) {
            console.log('DynamoDB error: ', err)
            return null
        }
    }
    type Todo = {
        id: string;
        title: string;
        done: boolean;
    }
    type AppSyncEvent = {
        info: {
            fieldName: string
        },
        arguments: {
            todoId: string,
            todo: Todo
        }
    }
    exports.handler = async (event: AppSyncEvent) => {
        switch (event.info.fieldName) {
            case "addTodo":
                return await addTodo(event.arguments.todo);
            case "getTodos":
                return await getTodos();
            case "deleteTodo":
                return await deleteTodo(event.arguments.todoId);
            case "updateTodo":
                return await updateTodo(event.arguments.todo);
            default:
                return null;
        }
    }
    

    Appsync에 Lambda를 데이터 소스로 추가


    이 코드는 Appsync를 사용하여 lambda를 데이터 소스로 추가합니다.
     ////Set lambda as a datasource
        const lambda_data_source = api.addLambdaDataSource(
          "lamdaDataSource",
          todoLambda
        );
    

    다음에 데이터 원본을 위한 해상도를 만들 것입니다.


    현재 우리의 조회와 lambda 데이터 원본을 위한 해상도를 만듭니다.
    
        ///Describing resolver for datasource
    
        lambda_data_source.createResolver({
          typeName: "Query",
          fieldName: "getTodos",
        });
    
        lambda_data_source.createResolver({
          typeName: "Mutation",
          fieldName: "addTodo",
        });
    
        lambda_data_source.createResolver({
          typeName: "Mutation",
          fieldName: "deleteTodo",
        });
    
        lambda_data_source.createResolver({
          typeName: "Mutation",
          fieldName: "updateTodo",
        });
    
    
    

    DynamoDB 인스턴스 만들기


    마지막으로 DynamoDB의 실례를 만들어야 합니다.주요 기능 코드에서 DynamoDB를 사용하여 기록을 저장, 편집, 삭제, 업데이트할 것입니다.
    //Import this line at top of file 
    import * as ddb from "@aws-cdk/aws-dynamodb";
    /*
    Other Code
    ...
    ...
    ...*/
    // Createing DynmoDB instance
     const todosTable = new ddb.Table(this, "CDKTodosTable", {
          tableName: "13ATodotable",
          partitionKey: {
            name: "id",
            type: ddb.AttributeType.STRING,
          },
        });
        // Granting Full acces to our Lambda Function to read and write records.
        todosTable.grantFullAccess(todoLambda);
        // Adding  our DynamoDB Table as Envoirnemnt Variable to our lambda Function
        todoLambda.addEnvironment("TODOS_TABLE", todosTable.tableName);
    

    유용한 명령


    창고와 함수 설명,Graphql 모드 정의를 만든 후에 프로그램을 구축하고 실행할 것입니다npm run build이 명령은 typescript를 AWS에 배치할 수 있는 자바스크립트 코드로 컴파일합니다.
    응용 프로그램의 구축을 성공적으로 컴파일하고 만들면 다음 명령을 실행하여 AWS 클라우드에 배치할 수 있습니다cdk deploy이 명령은 AWS에 응용 프로그램을 배치합니다.

    어플리케이션의 작동 여부를 테스트하는 방법


    AWS 계정에 로그인하고 Appsync 서비스로 이동합니다.AWS는 GraphQL 조회와 변이를 테스트하기 위해 GraphQL 놀이터를 제공했다.여기서 너는 너의 조회와 변이를 테스트할 수 있다.


    * 이 애플리케이션의 전체 코드는 다음 웹 사이트에서 사용할 수 있습니다.
    Github Code *
    다음 자습서에서는 Graphql API와 React 프런트엔드를 연결하는 방법을 학습합니다.

    너는 소셜 미디어를 통해 나에게 연락할 수 있다.


    Facebook
    Github

    좋은 웹페이지 즐겨찾기