서버 없는 Lamba 함수를 Appsync 및 DynamoDB와 결합하는 방법
AWS Lambda 함수를 백엔드로 사용하여 AWS 클라우드에 배포하는 방법(첫 부분)
본 강좌에서 우리는 다음과 같은 내용을 배울 것이다
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 typescript
Typescript를 설치하지 않은 경우 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 프런트엔드를 연결하는 방법을 학습합니다.
너는 소셜 미디어를 통해 나에게 연락할 수 있다.
Github
Reference
이 문제에 관하여(서버 없는 Lamba 함수를 Appsync 및 DynamoDB와 결합하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/abdulwaqar844/how-to-use-serverless-lamba-function-with-appsync-and-dynamodb-2c4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)