๐Ÿ“Œ Step 4 : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์žฌ๊ณ ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” Lambda ํ•จ์ˆ˜ ์ƒ์„ฑ


Untitled

////    /stock-lambda/serverless.yaml    ////

service: stock-lambda
frameworkVersion: '3'

provider:
  name: aws
  runtime: nodejs14.x
  region: ap-northeast-2

functions:
  producer:
    handler: index.consumer
    events:
      - sqs: arn:aws:sqs:ap-northeast-2:517061613095:no-stock-sqs

plugins:
  - serverless-lift
////    /stock-lambda/index.js    ////

const consumer = async (event) =>{

  for (const record of event.Records) {
    
    console.log(`body๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ ํ™•์ธ : ${record.body}`);
    const json = JSON.parse(record.body).MessageAttributes
    
    console.log(`ํ•„์š” ๋ฐ์ดํ„ฐ : ${JSON.stringify(json)}`);
    console.log(`์š”์ฒญ์ž : ${json.MessageAttributeRequester.Value}`);
    console.log(`๋ฌผ๊ฑด ์•„์ด๋”” : ${json.MessageAttributeProductId.Value}`);
    console.log(`๊ณต์žฅ ์•„์ด๋”” : ${json.MessageAttributeFactoryId.Value}`);
    console.log(`์ˆ˜๋Ÿ‰ : ${json.MessageAttributeProductCnt.Value}`);   

  }
};

module.exports = {
  consumer,
};

AWS ์ฝ˜์†”์—์„œ ๋งŒ๋“  ๋žŒ๋‹คํ•จ์ˆ˜๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋™์ผํ•˜๊ฒŒ ๋กœ์ปฌ์—์„œ ํŽธ๋ฆฌํ•œ ๋ฐฐํฌ์™€ ์ˆ˜์ •์„ ์œ„ํ•ด sls๋กœ ์ƒ์„ฑ

Untitled

npm install axios

HTTP ๋ช…๋ น์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

Untitled

/////            sales-api/handler.js        /////

const serverless = require("serverless-http");
const express = require("express");
const app = express();
app.use(express.json())

const AWS = require("aws-sdk") // STEP 2
const sns = new AWS.SNS({ region: "ap-northeast-2" }) // STEP 2

const {
  connectDb,
  queries: { getProduct, setStock }
} = require('./database')

app.get("/product/donut", connectDb, async (req, res, next) => {
  const [ result ] = await req.conn.query(
    getProduct('CP-502101')
  )

  await req.conn.end()
  if (result.length > 0) {
    return res.status(200).json(result[0]);
  } else {
    return res.status(400).json({ message: "์ƒํ’ˆ ์—†์Œ" });
  }
});

app.post("/checkout", connectDb, async (req, res, next) => {
  const [ result ] = await req.conn.query(
    getProduct('CP-502101')
  )
  if (result.length > 0) {
    const product = result[0]
    if (product.stock >= 0 && product.stock >= req.body.MessageAttributeProductCnt) {
      await req.conn.query(setStock(product.product_id, product.stock - req.body.MessageAttributeProductCnt))
      return res.status(200).json({ message: `๊ตฌ๋งค ์™„๋ฃŒ! ๋‚จ์€ ์žฌ๊ณ : ${product.stock - req.body.MessageAttributeProductCnt}`});
    }
    else {
      await req.conn.end()

////
      const now = new Date().toString()
      const message = `๋„๋„ˆ์ธ  ์žฌ๊ณ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ œํ’ˆ์„ ์ƒ์‚ฐํ•ด์ฃผ์„ธ์š”! \\n๋ฉ”์‹œ์ง€ ์ž‘์„ฑ ์‹œ๊ฐ: ${now}`
      const params = {
        Message: message,
        Subject: '๋„๋„ˆ์ธ  ์žฌ๊ณ  ๋ถ€์กฑ',
        MessageAttributes: {
          MessageAttributeProductId: {
            StringValue: product.product_id,
            DataType: "String",
          },
          MessageAttributeFactoryId: {
            StringValue: req.body.MessageAttributeFactoryId,
            DataType: "String",
          },
          MessageAttributeRequester: {
            StringValue: req.body.MessageAttributeRequester,
            DataType: "String",
          },
          MessageAttributeProductCnt: {
            StringValue: req.body.MessageAttributeProductCnt,
            DataType: "String",
          }
        },
        TopicArn: process.env.TOPIC_ARN
      }

      const result = await sns.publish(params).promise()
////

      return res.status(200).json({ message: `๊ตฌ๋งค ์‹คํŒจ! ๋‚จ์€ ์žฌ๊ณ : ${product.stock}`});
    }
  } else {
    await req.conn.end()
    return res.status(400).json({ message: "์ƒํ’ˆ ์—†์Œ" });
  }
});

app.use((req, res, next) => {
  return res.status(404).json({
    error: "Not Found",
  });
});

module.exports.handler = serverless(app);
module.exports.app = app;
////       /stock-lambda/index.js          ////

const axios = require('axios').default

const consumer = async (event) =>{

  for (const record of event.Records) {
    
    console.log(`body๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ ํ™•์ธ : ${record.body}`);
    const json = JSON.parse(record.body).MessageAttributes
    
    console.log(`ํ•„์š” ๋ฐ์ดํ„ฐ : ${JSON.stringify(json)}`);
    console.log(`์š”์ฒญ์ž : ${json.MessageAttributeRequester.Value}`);
    console.log(`๋ฌผ๊ฑด ์•„์ด๋”” : ${json.MessageAttributeProductId.Value}`);
    console.log(`๊ณต์žฅ ์•„์ด๋”” : ${json.MessageAttributeFactoryId.Value}`);
    console.log(`์ˆ˜๋Ÿ‰ : ${json.MessageAttributeProductCnt.Value}`);    
    
    const payload = {
      MessageGroupId: 'stock-arrival-group',
      MessageAttributeProductId: json.MessageAttributeProductId.Value,
      MessageAttributeProductCnt: json.MessageAttributeProductCnt.Value,
      MessageAttributeFactoryId: json.MessageAttributeFactoryId.Value,
      MessageAttributeRequester: json.MessageAttributeRequester.Value,
      CallbackUrl: '<https://hk6rw1m3qg.execute-api.ap-northeast-2.amazonaws.com/product/donut>',
    };    

    axios.post('<http://project3-factory.coz-devops.click/api/manufactures>', payload)
    .then(function (response) {
      console.log(response);
    })
    .catch(function (error) {
      console.log(error);
    });

  }
};

module.exports = {
  consumer,
};

API ๋ฌธ์„œ ์ฐธ๊ณ ํ•˜์—ฌ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’์ด API๋ฌธ์„œ์™€ ๊ฐ™์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ ์ˆ˜์ •