서버 Less 컴퓨팅은 전통적인 서버 기반 아키텍처의 도전에 대한 대응策略으로 나타났습니다. 서버 Less를 사용하면 개발자는 수동으로 서버를 관리하거나 스케일링할 필요가 없습니다. 대신 雲 제공업체는 인프라 관리를 处理的하여 团队은 이를 통해 코드를 쓰고 배포하는 것 alone에 专注于할 수 있습니다.

서버 Less 솔루션은 수요에 따라 자동으로 스케일링되고 付出-与你-走 모델을 제공합니다. 이는 실제로 应用程序가 사용하는 자원에 대해 payment only를 받는다는 의미입니다. 이러한 접근은 operaional overhead를 dramically 줄이고 유연성을 높이며 開発 周期을 감소시키기 때문에 현대 응용 開発에서 매우 매력적인 옵션입니다.

서버 관리를 추상화하는 Serverless 플랫폼은 사업 로직과 응용 기능에 专注于할 수 있습니다. 이러한 접근은 더 快速な 배포를 위한 기회를 제공하며 革新을 도울 수 있습니다. Serverless 아키텍처는 이벤트 기반입니다. 这意味着 실시간 이벤트에 대한 자동 응답과 사용자 수요에 따라 스케일링을 行う 수 있습니다.

목차

  1. 이해해야 할 중요한 개념

  2. 사전 요구사항

  3. 우리의 사용 사례

  4. 튜토리얼 목표

  5. 시작 방법: Git 저장소 복제

  6. 스텝 1: 서버리스 프레임워크 환경 설정

  7. 스텝 2: 서버리스 YAML 파일에서 API 정의

  8. Step 3: CRUD operatio 의 Lamda 함수 開発

  9. 4단계: 개발 및 프로덕션 환경을 위한 CI/CD 파이프라인 다단계 배포 설정

  10. 5단계: 개발 및 프로덕션 파이프라인 테스트

  11. 6단계: Postman을 사용한 프로덕션 및 개발 API 테스트 및 검증

  12. 결론

기술적 세부 사항에 들어가기 전에 몇 가지 주요 배경 개념을 살펴보겠습니다.

중요한 개념 이해

응용 프로그래밍 인터페이스 (API)

응용 프로그래밍 인터페이스(API)는 서로 다른 소프트웨어 어플리케이션들이 통신하고 상호작용할 수 있도록 합니다. 그것은 어플리케이션들이 통합 및 데이터 공유를 위해 다양한 시스템間에 정보를 요청하고 교환할 수 있도록 하는 방법과 데이터 형식을 정의합니다.

HTTP 메서드

HTTP 메서드 또는 요청 메서드는 웹 서비스 및 API의 중요한 구성 요소입니다. 주어진 요청 URL의 자원에 수행할 원하는 동작을 나타냅니다.

RESTful API에서 가장 일반적으로 사용되는 메서드는 다음과 같습니다:

  • GET: 서버에서 데이터를 검색하는 데 사용됩니다.

  • POST: 요청 본문에 포함된 데이터를 사용하여 자원을 생성하거나 업데이트합니다.

  • PUT: 기��의 자원을 업데이트하거나 교체하거나, 없으면 새로운 자원을 생성합니다.

  • DELETE: 서버에서 지정된 데이터를 삭제합니다.

Amazon API Gateway

Amazon API Gateway는 개발자가 스케일 에이전트 API를 생성하고, publications, maintenance, monitoring 및 security를 어려움없이 관리할 수 있는 모든 관리 서비스입니다. 여러 API의 입장점을 지정하고, 웹 또는 모바일 응용 프로그램과 백 엔드 서비스 사이의 인teraction을 관리하고 제어합니다.

또한 요청 路由, 보안, 인증, キャッシング 및 速率 제한과 같은 다양한 기능을 제공하고 있으며, 이러한 기능은 API의 관리와 배포를 간단하게 도와줍니다.

Amazon DynamoDB

DynamoDB는 고 スケ일ability, 낮은 латеency 및 다양한 리엑션 영역에 数据的 replication을 지원하는 전문적인 NoSQL 데이터 베이스 서비스입니다.

DynamoDB는 스키마 없는 형식에서 데이터를 저장하며, 구조화된 또는 半구조화된 데이터의 유연한 저장 및 조회를 지원합니다. 이러한 특성은 雲기반 환경에서 스케일 가능하고 响応 적극적인 응용 프로그램을 構築할 때 일반적으로 사용되는 것입니다.

Serverless CRUD Application

Serverless CRUD application은 Create, Read, Update, Delete 데이터를 수행할 수 있는 능력을 의미합니다. 그러나 이러한 응용 프로그램의 구성 요소와 Architecture는 传统的 server-based application과 다릅니다.

Create는 DynamoDB 테이블에 새로운 항목을 추가하는 것을 의미합니다. Read operaion은 DynamoDB 테이블에서 데이터를 꺼내는 것을 의미합니다. Update는 DynamoDB에 있는 기존 데이터를 갱신하는 것을 의미합니다. 그리고 Delete operation은 DynamoDBから 데이터를 지우는 것을 의미합니다.

The Serverless Framework

The Serverless Framework is an open-source tool that simplifies the deployment and management of serverless applications across multiple cloud providers, including AWS. It abstracts away the complexity of provisioning and managing infrastructure by allowing developers to define their infrastructure as code using a YAML file.

서버리스 프레임워크는 AWS를 포함한 여러 클라우드 제공자에서 서버리스 애플리케이션의 배포와 관리를简素화하는 오픈소스 도구입니다. YAML 파일을 사용하여 개발자가 인프라를 코드로 정의할 수 있도록 하여 인프라의 프로비저닝과 관리의 복잡성을 추상화 시킵니다.

GitHub Actions

GitHub Actions는 개발자가 GitHub 저장소에서 직접 소프트웨어 워크플로를 자동화할 수 있는 강력한 CI/CD 자동화 도구입니다.

GitHub Actions를 사용하면 코드 푸시, 풀 리퀘스트, 브랜치 병합과 같은 이벤트에 의해 触发되는 커스텀 파이프라인을 생성할 수 있습니다. 이러한 워크플로는 저장소 내 YAML 파일에 정의되며 응용 프로그램을 다양한 환경에 테스트, 빌드, 배포하는 등의 작업을 수행할 수 있습니다.

Postman

Postman는 API 디자인, 테스트, 문서화를简素화하는 인기 있는 협업 플랫폼입니다. 개발자는 HTTP 요청을 생성하고, API 엔드포인트를 테스트하며, 테스트 워크플로를 자동화할 수 있는 사용자 친화적인 인터페이스를 제공합니다.

알겠습니다, 이제 여기서 사용할 도구와 기술을 익숙해지셨으면, 실제로 시작해보겠습니다.

사전 조건

  • Node.js와 npm이 설치되어 있어야 합니다.

  • AWS CLI가 AWS 계정에 접근할 수 있도록 구성되어 있어야 합니다.

  • 서버리스 프레임워크 계정이 있어야 합니다.

  • 로컬 CLI에 전역으로 설치된 Serverlesss Framework

우리의 사용 사례

최근 서버리스 아키텍처를 배우고 있는 기업가 Alyx를 만나보세요. 그녀는 웹 어플리케이션의 백엔드를 구축하는 강력하고 효율적인 방법으로, 웹 어플리케이션 개발에 대한 더 현대적인 접근 방식이라는 것을 읽었습니다.

그녀는 AWS 서버리스 컴퓨팅의 기본 원리에 관해 배운 것을 적용하려고 합니다. 서버리스는 서버가 없는 것을 의미하지 않는다는 것을 그녀는 알고 있습니다. 실제로는 서버의 관리와 프로비전을 추상화하는 것일 뿐입니다. 이제 그녀는 코드 작성과 비지니스 로직 구현에만 집중하고 싶어졌습니다.

Alyx가 성공적으로 자신의 웹 어플리케이션의 백엔드에 서버리스 아키텍처를 활용하는 방법을 살펴보겠습니다.

Alyx의 Coffee Haven, 온라인 커피샵은 다양한 커피 블렌드와 간식을 판매합니다. 초기에 Alyx는 전통적인 웹 호스팅 서비스와 운영을 통해 가게의 주문과 재고를 관리했습니다. 여러 서버와 리소스를 다루는 것이었지만, 커피샵이 인기를 얻면서 주문 수가 증가하게 되었습니다. 특히 정점 시간과 계절적인 프로모션 시에는 더욱 그러합니다.

서버를 관리하고 응용 프로그램이 유입量的 폭증을 처리할 수 있음을 보장하는 것이 Alyx의 책임이 되었습니다. 그녀는 서버 용량, 확장성, 그리고 인프라의 유지 관리 비용에 대해 끊임없이 걱정하게 되었습니다.

그녀는 개인화된 추천 기능과 LOYALTY PROGRAMS과 같은 새로운 기능을 소개하고자 했지만, 전통적인 조직에서 제한 사항을 고려한 다음 어려운 일이 되었습니다.

그러자 Alyx는 서버 없이(serverless) 이야기를 들었습니다. 그녀는 서버 없이(serverless)의 백엔드를 珈琲 가게에서 자신이 신경 쓰지 않고 실시간으로 珈琲를 泡制하는 바스터가 되는 것과 유사하다고 생각했습니다.

이 아이디어에 기쁨을 味어 AJAX Lambda, AJAX API 게이트웨이, 以及 Amazon DynamoDB를 사용하여 珈琲 가게의 백 엔드를 서버 없이(serverless) 플랫폼으로 이전하기로 결심했습니다. 이 조치는 그녀가 고객에게 완벽한 珈琲 혼코를 더욱 집중적으로 만들 수 있는 것을 의미합니다.

서버 없이(serverless)로, 각 고객의 주문은 이벤트가 되어 서버 없이(serverless) 함수의 시퀀스를 자동으로 실행시키는 것입니다. 각 AWS Lambda 함수가 주문을 처리하고 어ft-end에서 뒷剧院를 处理好하는 비즈니스 로직을 처리합니다. 예를 들어, 고객의 주문을 생성하고 그 주문을 가져올 수 있습니다. 또한 주문을 지우거나 주문 상태를 갱신할 수 있습니다.

Alyx는 이제 서버 관리를 해야하는 것을 더 이상 고민하지 않습니다. serverless 플랫폼은 들어오는 주문 요청에 따라 자동으로 확장하고 축소합니다. 또한, serverless의 비용 효율성은 Alyx에게 매우 커다란 이유입니다. 이를 사용하면, 함수들이 소비하는 실제 계산 시간에 따라 납기 schema를 적용할 수 있으며, 자신의 성장 하는 사업에 대한 더 적은 비용을 제안합니다.

그녀는 그것을 그곳에서 멈추지 않습니다! 그녀는 인프라스트럭쳐를 배포하고 어떤 변경이 있을 때마다 그녀의 응용 프로그램을 갱신하는 것을 자동화하고자 합니다. 서버 없이의 프레임워크를 사용하여 인프라스트럭쳐를 코드로 정의하고 이를 쉽게 관리할 수 있는 인프라스트럭쳐를 코드로 (IaC)을 사용하여, 모든 인프라스트럭쳐를 코드로 정의하고 관리할 수 있습니다.

그리고, 그녀는 GitHub Actions을 지속적인 통합과 배포(CI/CD)를 위해 설정합니다. 그녀가 하는 모든 변경은 개발 또는 생산에 대한 하이푼 수정이 있다면 이를 자동적으로 파이프라인을 통해 배포하게 되ます.

튜토리얼 목표

  • Serverless Framework 환경을 설정하는 것

  • YAML 파일에 API를 정의하는 것

  • AWS Lambda 함수를 개발하여 CRUD 操作을 처리하는 것

  • Dev와 Prod에 대한 다중 단계 배포 설정

  • Dev와 Prod 파이프라인을 시험하는 것

  • Postman을 사용하여 Dev와 Prod API를 시험하고 Validating하는 것

시작하는 方法: Git 저장소를 克隆하는 方法

이 튜토리얼을 더 有效地하게 따라가기 위해서, gitHub에서 저의 프로젝트 리ポ지토리를 克隆하시오. 그렇게 하기는 이 곳으로 가는 것이 가능합니다. 이제 forward로 가면, 필요하다면 파일을 edit 할 수 있습니다.

리ポ지토리를 克隆하면 다음 그림과 같이 폴더에 여러 파일이 있을 것입니다. 이 모든 파일을 이용하여 我们的无服务器咖啡店API를 만듭니다.

단계 1: 서버리스 Framework 환경 설정

자동 배포를 위한 서버리스 Framework 환경을 설정하려면, CLI를 통해 서버리스 Framework 계정을 인증해야 합니다.

이를 위해서는, CI/CD 헴대로 사용할 수 있는 접근 ключ을 생성해야 합니다. 이 헴대는 빌드 구성 파일에서 자동으로 서버리스 应用程序을 배포하기 위해 안전하게 계정에 접근하는 것을 허용합니다. 서버리스 계정에 로그인하고 접근 ключ을 생성하면, 헴대는 그 KEY를 秘密 変数として GitHub 리포지토리에 복사하고 보관해야 합니다.

이러한 작업을 하려면, 您의 서버리스 계정으로 접근 키 部分으로 이동하십시오. “+add를 클릭하고 SERVERLESS_ACCESS_KEY로 이름지정하고 키를 생성합니다.

접근 키를 생성한 후에는 안전하게 복사하고 보관해야 합니다. 이 열쇠를 GitHub 리ポ지토리에서 인증하고 您的CI/CD 헴대를 허가하기 위해 秘密 변수로 사용할 것입니다.

서버닝 프레임웍(Serverless Framework) 계정 접근 钥이 배포 프로세스 중에 제공됩니다. 이 钥을 尔 GitHub 저장소의 시크릿스에 尔后 추가하여, 尔의 パイプ라인이 钥를 使って 서버닝 자원을 배포하는 것을 안전하게 하고, 尔의 코드베이스에 敏愴 정보를 노출시키지 않는 것을 보장할 수 있습니다.

이제, severless.yaml 钥에 AWS 자원을 코드로 정의하겠습니다.

과정 2: Serverless YAML 钥에 API 정의

이 钥에서, Serverless Framework의 YAML 구성을 사용하여 Coffee Shop API의 的核心 인fra结构和 기능을 정의합니다.

이 钥은 사용하고 있는 AWS 서비스를 정의하고자 합니다, 包括 API Gateway, CRUD 操作을 위한 Lambda 함수와 데이터 저장을 위한 DynamoDB를 포함합니다.

또한 Lambda 함수가 DynamoDB 서비스와 interact하는 것을 허용하는 IAM 역할을 구성합니다.

API Gateway는 들어오는 요청을 처리하고 해당하는 Lambda 함수를 켈라는 HTTP 방법 (POST, GET, PUT, DELETE)를 세팅합니다.

코드를 봐봅시다:

service: coffee-shop-api
frameworkVersion: '4'

provider:
  name: aws
  runtime: nodejs20.x
  region: us-east-1
  stage: ${opt:stage}
  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - dynamodb:PutItem
            - dynamodb:GetItem
            - dynamodb:Scan
            - dynamodb:UpdateItem
            - dynamodb:DeleteItem
          Resource: arn:aws:dynamodb:${self:provider.region}:*:table/CoffeeOrders-${self:provider.stage}

functions:
  createCoffee:
    handler: createCoffee.handler
    environment:
      COFFEE_ORDERS_TABLE: CoffeeOrders-${self:provider.stage}
    events:
      - http:
          path: coffee
          method: post

  getCoffee:
    handler: getCoffee.handler
    environment:
      COFFEE_ORDERS_TABLE: CoffeeOrders-${self:provider.stage}
    events:
      - http:
          path: coffee
          method: get

  updateCoffee:
    handler: updateCoffee.handler
    environment:
      COFFEE_ORDERS_TABLE: CoffeeOrders-${self:provider.stage}
    events:
      - http:  
          path: coffee  
          method: put  

  deleteCoffee:  
    handler: deleteCoffee.handler
    environment:
      COFFEE_ORDERS_TABLE: CoffeeOrders-${self:provider.stage}
    events:
      - http:
          path: coffee
          method: delete
resources:
  Resources:
    CoffeeTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: CoffeeOrders-${self:provider.stage}
        AttributeDefinitions:
          - AttributeName: OrderId
            AttributeType: S
          - AttributeName: CustomerName
            AttributeType: S
        KeySchema:
          - AttributeName: OrderId
            KeyType: HASH
          - AttributeName: CustomerName
            KeyType: RANGE
        BillingMode: PAY_PER_REQUEST

The serverless.yml 구성은 Alyx의 Coffee Shop API가 AWS에서 서버닝 환경에서 어떻게 运行할지 정의합니다. 尔의 Provider 節은 어떤 云 제공자를 사용하는지 지정하고, 어떤 런타임 환경을 사용하는지 Node.js를 지정합니다.

us-east-1에 설정된 지역과 stage 변수는 다양한 환경들, 예를 들어 dev와 prod 사이에서 동적으로 배포할 수 있게 해줍니다. 이는 같은 코드를 다른 환경에 배포할 수 있게 해줍니다. 리소스는 충돌을 피하고자 해당 환경에 맞게 이름을 부여합니다.

iam 섹션에서 Lambda 함수에 DynamoDB 테이블과 상호작용할 수 있는 권한을 부여합니다. ${self:provider.stage} 문법은 DynamoDB 테이블의 이름을 동적으로 지정하므로, 각 환경마다 별도의 리소스가 있을 수 있습니다. 예를 들어, 개발 환경의 경우 CoffeeOrders-dev, 프로덕션 환경의 경우 CoffeeOrders-prod입니다. 이러한 동적 이름 지정은 각각 다른 테이블을 수동으로 구성하지 않고도 여러 환경을 관리하는 데 도움이 됩니다.

functions 섹션은 네 개의 핵심 Lambda 함수를 정의합니다: createCoffee, getCoffee, updateCoffeedeleteCoffee. 이들은 Coffee Shop API의 CRUD 연산을 처리합니다.

각 함수는 API Gateway의 특정 HTTP 메소드와 연결되어 있으며, POST, GET, PUTDELETE입니다. 이러한 함수는 현재 스테이지에 따라 동적으로 이름이 지정된 DynamoDB 테이블과 상호작용합니다.

마지막으로 resources 섹션은 DynamoDB 테이블 자신을 정의합니다. 이 섹션에서 OrderIdCustomerName 속성을 사용하여 기본 키로 설정된 테이블을 구성합니다. 테이블은 Alyx의 성장하는 사업에 맞추어 cost-effective하게 pay-per-request billing 모드를 사용하도록 설정되어 있습니다.

이 리소스들의 배포를 Serverless Framework를 사용하여 자동화함으로써, Alyx는 인프라를 쉽게 관리할 수 있으며, 자원을 수동으로 프로비션하고 스케일링하는 부담에서 벗어날 수 있다.

Step 3: CRUD 연산을 위한 Lambda 함수 개발

이 단계에서, Alyx의 Coffee Shop API의 핵심 로직을 JavaScript로 작성한 Lambda 함수를 생성하여 createCoffee, getCoffee, updateCoffee 그리고 deleteCoffee와 같은 필수 CRUD 연산을 수행한다.

이 함수들은 AWS 서비스,尤其是 DynamoDB와 상호 작용하기 위해 AWS SDK를 사용한다. 각 함수는 새로운 주문 생성, 주문 조회, 주문 상태 업데이트, 주문 삭제와 같은 특정 API 요청을 처리하는 책임이 있다.

커피 Lambda 함수 생성

이 함수는 주문을 생성한다:

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
const { v4: uuidv4 } = require('uuid');

module.exports.handler = async (event) => {
  const requestBody = JSON.parse(event.body);
  const customerName = requestBody.customer_name;
  const coffeeBlend = requestBody.coffee_blend;
  const orderId = uuidv4();

  const params = {
    TableName: process.env.COFFEE_ORDERS_TABLE,
    Item: {
      OrderId: orderId,
      CustomerName: customerName,
      CoffeeBlend: coffeeBlend,
      OrderStatus: 'Pending'
    }
  };

  try {
    await dynamoDb.put(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'Order created successfully!', OrderId: orderId })
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: `Could not create order: ${error.message}` })
    };
  }
};

이 Lambda 함수는 DynamoDB 테이블에 새로운 커피 주문을 생성하는 처리를 담당한다. 우선 AWS SDK를 가져오고 DynamoDB와 상호 작용하기 위한 DynamoDB.DocumentClient를 초기화한다. 또한 고유한 주문 ID를 생성하기 위해 uuid 라이브러리를 가져온다.

handler 함수 안에서, 들어오는 요청 본문을 파싱하여 고객의 이름과 선호하는 커피 블렌드와 같은 고객 정보를 추출한다. 고유한 orderIduuidv4()를 사용하여 생성되고, 이 데이터는 DynamoDB에 삽입을 준비한다.

params 객체는 데이터를 저장할 테이블을 정의하며, TableName 는 runtime에서 환경 변수 COFFEE_ORDERS_TABLE의 값으로 동적으로 설정됩니다. 신규 주문은 OrderId , CustomerName , CoffeeBlend 등의 필드를 포함하고 초기 상태가 Pending 입니다.

try 块内で는 put() 方法을 사용하여 DynamoDB 테이블에 주문을 추가하려고 합니다. 성공하면 기능은 200 상태 코드와 성공 메시지以及 OrderId 를 반환합니다. 에러가 발생하면 이를 捕获하고 500 상태 코드와 에러 메시지를 반환합니다.

Get Coffee Lambda 함수

이 함수는 모든 コーヒー 아이템을 가져옵니다 :

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.handler = async () => {
  const params = {
    TableName: process.env.COFFEE_ORDERS_TABLE
  };

  try {
    const result = await dynamoDb.scan(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify(result.Items)
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: `Could not retrieve orders: ${error.message}` })
    };
  }
};

이 Lambda 함수는 DynamoDB 테이블에서 모든 コーヒー 주문을 가져오는 것에 대해 서버 없는 방식의 데이터 가져오기를 보여줍니다.

이번에는 AWS SDK를 사용하여 DynamoDB.DocumentClient 인스턴스를 초기화하여 DynamoDB와 interact하는 것입니다. handler 함수는 params 객체를 구성하고 있으며, TableName을 지정하고 있는데, 이는 COFFEE_ORDERS_TABLE 환경 변수를 사용하여 동적으로 설정되고 있습니다.

scan() 메소드는 테이블에서 모든 항목을 가져옵니다. 다시 말해, 연산이 성공하면 함수는 200 상태 코드와 JSON 형식으로 가져온 항목을 반환합니다. 에러가 발생하면 500 상태 코드와 에러 메시지가 반환됩니다.

커피 Lambda 함수 업데이트

이 함수는 ID로 커피 항목을 업데이트합니다:

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.handler = async (event) => {
  const requestBody = JSON.parse(event.body);
  const { order_id, new_status, customer_name } = requestBody;

  const params = {
    TableName: process.env.COFFEE_ORDERS_TABLE,
    Key: {
      OrderId: order_id,
      CustomerName: customer_name
    },
    UpdateExpression: 'SET OrderStatus = :status',
    ExpressionAttributeValues: {
      ':status': new_status
    }
  };

  try {
    await dynamoDb.update(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'Order status updated successfully!', OrderId: order_id })
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: `Could not update order: ${error.message}` })
    };
  }
};

이 Lambda 함수는 DynamoDB 테이블에서 특정 커피 주문의 상태를 업데이트하는 처리를 합니다.

handler 함수는 요청 본문에서 order_id, new_status, customer_name을 추출합니다. 그런 다음 params 객체를 구성하여 테이블 이름과 주문의 주요 키(사용 OrderIdCustomerName)를 지정합니다. UpdateExpression은 주문의 새 상태를 설정합니다.

try 블록에서는 update() 메소드를 사용하여 DynamoDB에서 주문을 업데이트하려고 합니다. 다시 말해, 성공하면 함수는 상태 코드 200와 성공 메시지를 반환합니다. 에러가 발생하면 에러를 잡고 500 상태 코드와 에러 메시지를 반환합니다.

커피 Lambda 함수 삭제

이 함수는 ID로 커피 항목을 삭제합니다:

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.handler = async (event) => {
  const requestBody = JSON.parse(event.body);
  const { order_id, customer_name } = requestBody;

  const params = {
    TableName: process.env.COFFEE_ORDERS_TABLE,
    Key: {
      OrderId: order_id,
      CustomerName: customer_name
    }
  };

  try {
    await dynamoDb.delete(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'Order deleted successfully!', OrderId: order_id })
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: `Could not delete order: ${error.message}` })
    };
  }
};

Lambda 함수는 DynamoDB 테이블에서 특정한 커피 주문을 삭제합니다. 핸들러 함수에서 코드는 요청 본문을 해석하여 order_idcustomer_name을 추출합니다. 이 값들은 테이블에서 삭제할 아이템을 식별하기 위한 기본 키로 사용됩니다. params 객체는 삭제할 아이템의 테이블 이름과 키를 지정합니다.

try 블록에서 코드는 delete() 메서드를 사용하여 DynamoDB에서 주문을 삭제하려고 시도합니다. 삭제가 성공하면 200 상태 코드와 성공 메시지를 반환하여 주문이 삭제되었음을 알립니다. 에러가 발생하면 코드는 에러를 잡고 500 상태 코드와 에러 메시지를 반환합니다.

이제 각 Lambda 함수를 설명했으니 GitHub 저장소에 AWS 시크릿을 설정하는 다음 단계로 넘어가겠습니다.

스텝 4: Dev 및 Prod 환경에 대한 CI/CD 파이프라인 다단계 배포 설정

GitHub 저장소에 AWS 시크릿을 설정하려면 먼저 저장소 설정으로 이동하세요. 우측 상단의 Settings을 선택한 다음, 좌하단에서 Secrets and variables.

를 선택하세요.Actions를 클릭하십시오:

그런 다음 New repository secret를 선택하여 시크릿을 생성합니다.

파이프라인을 위해 세 개의 시크릿이 필요합니다: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, SERVERLESS_ACCESS_KEY.

AWS 계정 액세스 키 자격 증명을 처음 두 변수에 사용하고, 그 후에 저장했던 서버리스 액세스 키를 사용하여 SERVERLESS_ACCESS_KEY를 생성합니다. 이러한 시크릿은 아래 이미지에서 볼 수 있듯이 CI/CD 파이프라인을 안전하게 인증합니다.

메인 브랜치를 “main“으로 명명하였는지 확인하십시오. 이 브랜치는 운영 브랜치로 사용됩니다. 그 다음, “dev“라는 새로운 브랜치를 개발 작업을 위해 생성합니다.

또한 “dev/feature”와 같은 특정 기능에 대한 브랜치도 생성할 수 있습니다. GitHub Actions는 이러한 브랜치를 사용하여 변경 사항을 자동으로 배포합니다. dev는 개발 환경을 나타내고, main은 운영 환경을 나타냅니다.

이 분기 전략을 사용하면 CI/CD 파이프라인을 효율적으로 관리할 수 있으며, dev 또는 prod 환경으로 병합되는 새 코드 변경 사항을 배포할 수 있습니다.

GitHub Actions를 사용하여 YAML 파일 배포 방법

Coffee Shop API의 배포 과정을 자동화하려면 GitHub Actions를 사용합니다. 이는 GitHub 저장소와 통합됩니다.

이 배포 파이프라인은 main 또는 dev 브랜치로 코드가 푸시되는 경우마다 트리거 됩니다. 환경별 배포를 구성하면 dev 브랜치의 업데이트가 개발 환경에 배포되고, main 브랜치의 변경 사항이 운영 배포를 트리거합니다.

이제 코드를 검토해봅시다.

name: deploy-coffee-shop-api

on:
  push:
    branches:
      - main
      - dev

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '20.x'

    - name: Install dependencies
      run: |
        cd coffee-shop-api
        npm install

    - name: Install Serverless Framework
      run: npm install -g serverless

    - name: Deploy to AWS (Dev)
      if: github.ref == 'refs/heads/dev'
      run: |
        cd coffee-shop-api
        npx serverless deploy --stage dev
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        SERVERLESS_ACCESS_KEY: ${{secrets.SERVERLESS_ACCESS_KEY}}

    - name: Deploy to AWS (Prod)
      if: github.ref == 'refs/heads/main'
      run: |
        cd coffee-shop-api
        npx serverless deploy --stage prod
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        SERVERLESS_ACCESS_KEY: ${{secrets.SERVERLESS_ACCESS_KEY}}

GitHub Actions YAML 설정은 Coffee Shop API의 AWS 部署 과정을 Serverless Framework를 사용하여 자동화하는 것입니다. workflow은 주요 또는 開発 분기에 변경 사항이 推送되는 任何时候 이퀄라이저가 발생합니다.

이것은 저장소의 코드를 检出하고, Node.js 20.x 버전을 설정하여 Lambda 함수가 사용하는 runtime와 일치시키고, coffee-shop-api 디렉터리로 이동하여 npm install을 실행하여 项目 依存성을 설치합니다.

workflow은 Serverless Framework을 글로벌 설치하여 serverless CLI를 배포에 사용할 수 있도록 합니다. 更新的 분기에 따라 workflow은 적절한 환경으로 条件적으로 배포합니다.

변경 사항이 開発 분기로 推送되면 dev 阶段으로 배포합니다. 주요 분기로 推送되면 prod 阶段으로 배포합니다. 배포 명령어 npx serverless deploy --stage dev 또는 npx serverless deploy --stage prod을 coffee-shop-api 디렉터리 안에 실행합니다.

안전한 배포를 위해 workflow은 GitHub Secrets에 저장된 환경 변수를 통해 AWS 凭据과 Serverless 액세스 키에 접근하여 CI/CD 파이프라인이 AWS와 Serverless Framework과 인증하는 것을 허용합니다. 이렇게 Repository에 중요한 정보를 노출하지 않고 AWS와 Serverless Framework과 인증할 수 있습니다.

이제 pipeline을 시험하기 위해 진행할 수 있습니다.

단계 5: Dev와 Prod Pipeline를 시험합니다.

본 (prod) 분기를 “main“이라는 이름으로 확인하십시오. 그런 다음 “dev“라는 이름의 개발(dev) 분기를 생성하십시오. dev 분기에 유효한 변경 사항을 적용하고 커밋하면 GitHub Actions 파이프라인이 트리거되며, 개발 환경에 업데이트된 리소스가 자동으로 배포됩니다. dev에서 모든 것을 확인한 후에는 dev 분기를 main 분기로 병합할 수 있습니다.

main 분기로 변경 사항을 병합하면 생산 환경의 배포 파이프라인이 자동으로 트리거되어 모든 필요한 업데이트가 적용되고 생산 리소스가 부드럽게 배포됩니다.

GitHub 저장소의 Actions 탭으로 가면 GitHub Actions 실행의 자세한 로그를 검토하고 배포 과정을 모니터링할 수 있습니다.

로그는 파이프라인의 각 단계를 확인할 수 있도록 도와줍니다.

개발 환경과 생산 환경의 배포에 대한 자세한 로그를 검토하고자 하는 어떤 빌드 실행을 선택할 수 있으며, 진행 상황을 추적하고 모두 원활하게 실행되고 있는지 확인할 수 있습니다.

아래 이미지에 보여진 것처럼 GitHub Actions의 특정 빌드 실행으로 가서 개발 또는 생산 파이프라인의 실행 세부 사항과 결과를 볼 수 있습니다.

파이프라인이 성공적으로 실행되었는지 확인하기 위해 개발 및 생산 환경을 충분히 테스트하십시오.

액션 6: Postman을 사용하여 생산 및 개발 API를 테스트하고 검증하십시오.

APIs와 리소스가 배포되고 구성되었으며, AWS로부터 생성된 유니크한 API 엔드 포인트(URL)를 찾아야 함.

이 URL을 웹 브라우저에 붙여넣으면 API 기능을 쉽게 테스트할 수 있습니다. API URL은 CI/CD 빌드의 출력 결과에 있습니다.

이를 얻기 위해서는 GitHub Actions 로그로 이동하여 가장 최근 환경의 성공적인 빌드를 선택하고 deploy를 클릭하여 생성된 API 엔드 포인트에 대한 배포 detaails를 확인할 수 있습니다.

GitHub Actions 로그에서 선택한 환경(Prod 또는 Dev)의 Deploy to AWS 단계를 클릭합니다. 그 때 API URL을 찾을 수 있습니다.

이 URL을 복사하고 저장하십시오. 이 URL은 API 기능을 테스트할 때 필요합니다.

이제 생성된 API URL의 하나를 브라우저에 붙여넣습니다. 응답으로 공백 ARRAY 또는 리스트가 보여지게 됩니다. 이는 API가 정상적으로 동작하고 DynamoDB 테이블から 데이터를 성공적으로 가져오는 것을 확인합니다.

空っぽ의 리스트로 though는 있지만, API가 데이터베이스로 연결하고 정보를 돌려주는 것을 나타냅니다.

API가 두 개의 모든 환경에서 동작하는지 확인하기 위해서는 다른 API 환경(Prod와 Dev)에 대한 단계를 반복하십시오.

웹 테스트를 위해 우리는 Postman을 사용하여 모든 API 메서드를 테스트할 것입니다, 생성, 읽기, 업데이트 그리고 삭제, 이러한 테스트는 개발 환경과 프로덕션 환경 둘 다에 대해 수행할 것입니다.

GET 메서드를 테스트하려면, Postman을 사용하여 URL을 통해 API의 엔드포인트로 GET 요청을 보내세요. 그러면 아래 그림에서 볼 수 있는 것처럼 빈 커피 주문 목록을 받게 됩니다. 이는 API가 데이터를 성공적으로 조회할 수 있음을下面的图像所示。

실제 주문을 생성하려면 POST 메서드를 테스트하십시오. 다시 Postman을 사용하여 API 엔드포인트로 POST 요청을 만들고, 아래와 같이 요청 본문에 고객의 이름과 커피 블렌드를 제공합니다 :

{
  "customer_name": "REXTECH",
  "coffee_blend": "Black"
}

응답은 성공 메시지와 배치된 주문의 고유한 OrderId입니다。

새로운 주문이 환경별 테이블에 저장되었는지를 확인하려면 아이템을 검토하십시오 :

PUT 메서드를 테스트하려면, 아래와 같이 이전 주문 ID와 새 주문 상태를 요청 본문에 제공하여 API 엔드포인트로 PUT 요청을 보내세요 :

{                                                 
  "order_id": "42a81c27-1421-4025-9bef-72b14e723c34",
  "new_status": "Ready",                                             
  "customer_name": "REXTECH"                                             
}

응답은 배치된 주문의 OrderId와 함께 성공적인 주문 업데이트 메시지입니다。

또한 DynamoDB 테이블 아이템에서 주문 상태가 업데이트되었는지 확인할 수 있습니다。

DELETE 메서드를 테스트하려면, Postman을 사용하여, 아래와 같이 이전 주문 ID와 고객 이름을 요청 본문에 제공하여 DELETE 요청을 보내세요:

{                                                 
  "order_id": "42a81c27-1421-4025-9bef-72b14e723c34",
  "customer_name": "REXTECH"
}

주문이 삭제되었습니다. 삭제된 주문의 주문 ID는

다음과 같습니다. 다시 한 번, DynamoDB 테이블에서 주문이 삭제되었음을 확인할 수 있습니다.

결론

마지막으로, 축하합니다! 모든 단계를 성공적으로 완료하셨습니다. API Gateway, Lambda, DynamoDB, Serverless Framework 및 Node.js로 CRUD (생성, 조회, 업데이트, 삭제) 기능을 지원하는 서버리스 REST API를 구축했으며, Github Actions를 통해 승인된 코드 변경을 자동 배포합니다.

이 글을 이렇게까지 읽어주셨다면, 읽어주셔서 감사합니다! 이 글이 여러분에게 가치 있었으면 좋겠습니다.

Ifeanyi Otuonye는 6X AWS 인증 클라우드 엔지니어로 DevOps, 기술적 글쓰기 및 교육 전문성을 갖춘 기술 강사입니다. 그는 배움과 발전的热情으로 자극받으며 협업적 환경에서 잘 살아갑니다. 클라우드로 전환하기 전에는 6년간 전문적인 러닝 경기선수였습니다.

2022년 초에는 자습과 6개월 간의 가속화 클라우드 프로그램에 참가하여 클라우드/DevOps 엔지니어가 되는 미션을 전략적으로 수행하기 시작했습니다.

2023년 5월, 그 목표를 달성하고 첫 클라우드 엔지니어로의 업무를 시작하며, 이제 다른 사람들의 클라우드 여정을 지원하는 또 다른 개인 미션을 설정했습니다.