Создайте DevOps для API-шлюза безопасной аутентификации с помощью Nodejs, Aptible Terraform и Redis.

Создайте DevOps для API-шлюза безопасной аутентификации с помощью Nodejs, Aptible Terraform и Redis.

9 января 2024 г.

Создание безопасного и масштабируемого шлюза API имеет решающее значение для современной разработки программного обеспечения. В этом контексте Node.js, Aptible Terraform и Redis — это три мощных инструмента, которые можно использовать для создания безопасного и масштабируемого шлюза API.

С помощью Node.js вы можете создавать быстрые и эффективные серверные приложения, а Aptible Terraform позволяет управлять ресурсами Aptible непосредственно из Terraform, позволяя использовать инфраструктуру как код (IaC).

С другой стороны, Redis — это хранилище структур данных в памяти с открытым исходным кодом, которое можно использовать в качестве базы данных, кэша и брокера сообщений.

Вместе эти инструменты помогут вам создать безопасный и масштабируемый шлюз API, который сможет обрабатывать множество запросов, обеспечивая при этом безопасность ваших данных.

Предварительные требования:

Чтобы создать безопасный и масштабируемый шлюз API с использованием Node.js, Aptible Terraform и Redis, вам потребуются следующие предварительные условия:

* Node.js: мощная среда выполнения JavaScript, образующая серверную часть с надежными библиотеками аутентификации, такими как Passport.js. * Aptible: бессерверная платформа, упрощающая развертывание, масштабирование и управление безопасностью приложений Node.js. Требуются базовые знания Aptible. * Redis: молниеносная база данных в памяти, которая действует как кэш и хранит важные данные аутентификации, такие как токены и пользовательские сеансы. * RedisInsight: графический пользовательский интерфейс Redis, который позволяет визуализировать данные Redis и взаимодействовать с ними. RedisInsight должен быть установлен и запущен на вашем локальном компьютере. * Terraform: инструмент «Инфраструктура как код» (IaC) с открытым исходным кодом, который позволяет безопасно и многократно управлять вашей инфраструктурой. Требуются базовые знания Terraform. * Docker: платформа контейнеризации, которая упаковывает ваше приложение и его зависимости в один контейнер. Требуются базовые знания Docker.

Инициализировать проект Node.js

  • Создайте новый каталог для своего проекта и инициализируйте проект Node.js, выполнив следующую команду:
npm init -y

* Установите необходимые пакеты:

npm install express redis body-parser jsonwebtoken

Настройка Express Server с аутентификацией

  • Создайте файл index.js в каталоге вашего проекта.
  • Настройте экспресс-сервер:
const express = require('express');

Настройка Redis для хранения данных

Убедитесь, что Redis установлен и работает в вашей системе.

  • Настройка клиента Redis:
const redisClient = new Redis();

Этот код инициализирует клиент Redis, который подключается к серверу Redis по умолчанию, работающему на localhost, через порт 6379.

Для создания клиента он использует конструктор Redis() из библиотеки Redis.

redisClient.on("connect", () => {...}); и redisClient.on("error", (err) => {. ..}); — это прослушиватели событий, которые обрабатывают события, когда клиент Redis успешно подключается или обнаруживает ошибку во время подключения.

* Быстрая установка промежуточного программного обеспечения:

app.use(bodyParser.json());

Это настроит приложение Express на использование промежуточного программного обеспечения bodyParser.json(), что позволит ему анализировать входящие запросы JSON.

* Конечная точка регистрации (POST '/register'):

app.post("/register", (req, res) => {
  const { username, password, email } = req.body;
  // Perform validation checks

  // Simulate storing user data in Redis
  redisClient.hmset(
    `user:${username}`,
    ["password", password, "email", email],
    (err, reply) => {
      if (err) {
        console.error(err);
        return res.status(500).json({ error: "Failed to register user" });
      }
      const token = jwt.sign({ username }, "your_secret_key", {
        expiresIn: "1h",
      });
      return res.json({ message: "User registered successfully", token });
    }
  );
});

Эта конечная точка обрабатывает регистрацию пользователя. Он извлекает имя пользователя, пароль и электронную почту из тела запроса, выполняет проверки, а затем имитирует сохранение пользовательских данных в Redis с помощью redisClient.hmset().

* Конечная точка входа (POST '/login'):

app.post("/login", (req, res) => {
  const { username, password } = req.body;
  // Validate user credentials
  redisClient.hget(`user:${username}`, "password", (err, reply) => {
    if (err || reply !== password) {
      return res.status(401).json({ error: "Invalid credentials" });
    }
    // Assuming successful authentication, generate a JWT token
    const token = jwt.sign({ username }, "your_secret_key", {
      expiresIn: "1h",
    });
    return res.json({ message: "Login successful", token });
  });
});

Эта конечная точка обрабатывает вход пользователя. Он проверяет учетные данные пользователя, получая сохраненный пароль из Redis с помощью redisClient.hget().

Если учетные данные действительны, он генерирует токен JWT для аутентификации.

* Защищенный маршрут (GET '/protected'):

app.get("/protected", verifyToken, (req, res) => {
  // If the token is verified, allow access to the protected route
  return res.json({ message: "Access granted to protected route" });
});

Это пример защищенного маршрута, для доступа к которому требуется токен носителя. Он использует функцию промежуточного программного обеспечения verifyToken для проверки токена перед разрешением доступа к маршруту.

* Функция промежуточного программного обеспечения verifyToken:

function verifyToken(req, res, next) {
  const bearerHeader = req.headers["authorization"];
  if (typeof bearerHeader !== "undefined") {
    const bearerToken = bearerHeader.split(" ")[1]; // Extract token from header
    req.token = bearerToken;
    jwt.verify(req.token, "your_secret_key", (err, authData) => {
      if (err) {
        return res.status(403).json({ error: "Forbidden" });
      }
      // If token is valid, proceed to the next middleware/route handler
      next();
    });
  } else {
    // If no token provided, return Forbidden
    return res.status(403).json({ error: "Forbidden" });
  }
}

Эта функция промежуточного программного обеспечения проверяет наличие токена носителя в заголовке запроса Authorization. Если присутствует действительный токен, он проверяет его с помощью jwt.verify() и разрешает доступ к защищенным маршрутам. В противном случае возвращается запрещенная ошибка.

* Прослушивание сервера:

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

Этот код запускает сервер Express, прослушивающий указанный PORT, и записывает сообщение на консоль после запуска сервера.

Полный код:

const express = require("express");
const bodyParser = require("body-parser");
const Redis = require("ioredis");
const jwt = require("jsonwebtoken");

const app = express();
const PORT = process.env.PORT || 3000;

// Redis client setup to connect to a local Redis instance
const redisClient = new Redis(); // Connects to default localhost:6379

redisClient.on("connect", () => {
  console.log("Connected to Redis...");
});
redisClient.on("error", (err) => {
  console.error("Redis error:", err);
});

app.use(bodyParser.json());

// Routes
// Registration endpoint
app.post("/register", (req, res) => {
  const { username, password, email } = req.body;
  // Perform validation checks

  // Simulate storing user data in Redis
  redisClient.hmset(
    `user:${username}`,
    ["password", password, "email", email],
    (err, reply) => {
      if (err) {
        console.error(err);
        return res.status(500).json({ error: "Failed to register user" });
      }
      const token = jwt.sign({ username }, "your_secret_key", {
        expiresIn: "1h",
      });
      return res.json({ message: "User registered successfully", token });
    }
  );
});

// Login endpoint requiring a Bearer token for authentication
app.post("/login", (req, res) => {
  const { username, password } = req.body;
  // Validate user credentials
  redisClient.hget(`user:${username}`, "password", (err, reply) => {
    if (err || reply !== password) {
      return res.status(401).json({ error: "Invalid credentials" });
    }
    // Assuming successful authentication, generate a JWT token
    const token = jwt.sign({ username }, "your_secret_key", {
      expiresIn: "1h",
    });
    return res.json({ message: "Login successful", token });
  });
});

// Protected route example - requires a Bearer token for access
app.get("/protected", verifyToken, (req, res) => {
  // If the token is verified, allow access to the protected route
  return res.json({ message: "Access granted to protected route" });
});

// Middleware function to verify the Bearer token in the Authorization header
function verifyToken(req, res, next) {
  const bearerHeader = req.headers["authorization"];
  if (typeof bearerHeader !== "undefined") {
    const bearerToken = bearerHeader.split(" ")[1]; // Extract token from header
    req.token = bearerToken;
    jwt.verify(req.token, "your_secret_key", (err, authData) => {
      if (err) {
        return res.status(403).json({ error: "Forbidden" });
      }
      // If token is valid, proceed to the next middleware/route handler
      next();
    });
  } else {
    // If no token provided, return Forbidden
    return res.status(403).json({ error: "Forbidden" });
  }
}

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

Запустить сервер

Запустите сервер Redis:

redis-server

Ответ:

3444:C 07 Jan 2024 16:40:21.983 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3444:C 07 Jan 2024 16:40:21.983 * Redis version=7.2.3, bits=64, commit=00000000, modified=0, pid=3444, just started
3444:C 07 Jan 2024 16:40:21.983 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
3444:M 07 Jan 2024 16:40:21.984 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.2.3 (00000000/0) 64 bit
  .-`` .-```.  ```/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 3444
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3444:M 07 Jan 2024 16:40:21.985 # WARNING: The TCP backlog setting of 511 cannot be enforced because kern.ipc.somaxconn is set to the lower value of 128.
3444:M 07 Jan 2024 16:40:21.985 * Server initialized
3444:M 07 Jan 2024 16:40:21.986 * Loading RDB produced by version 7.2.3
3444:M 07 Jan 2024 16:40:21.986 * RDB age 67145 seconds
3444:M 07 Jan 2024 16:40:21.986 * RDB memory usage when created 1.38 Mb
3444:M 07 Jan 2024 16:40:21.986 * Done loading RDB, keys loaded: 3, keys expired: 0.
3444:M 07 Jan 2024 16:40:21.986 * DB loaded from disk: 0.001 seconds
3444:M 07 Jan 2024 16:40:21.986 * Ready to accept connections tcp

Откройте новый терминал, затем запустите сервер Node.js:

node app.js

Ответ:

Server running on port 3000
Connected to Redis...

Протестируйте конечные точки

Используйте такие инструменты, как curl или Postman, чтобы проверить конечные точки регистрации и входа. Убедитесь, что вы предоставили действительные данные JSON для конечных точек регистрации (/register) и входа в систему (/login).

Этот фрагмент кода обновляет процесс регистрации для хранения пользовательских данных, таких как имя пользователя, пароль и адрес электронной почты, в Redis, используя хэш с ключом, названным в честь каждого пользователя (user:${username).

Документация по API

  • Зарегистрировать пользователя

Отправьте запрос POST на адрес http://localhost:3000/register со следующим телом (пример):

{
  "username": "example_user",
  "password": "example_password",
  "email": "example@example.com"
}

Ответ:

{
    "message": "User registered successfully",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImV4YW1wbGVfdXNlciIsImlhdCI6MTcwNDU2ODA3OSwiZXhwIjoxNzA0NTcxNjc5fQ.tXernOwDwtYI3iJycBKYTcShalFEcFgE6VFFjbCqtsY"
}

* Войдите в систему и получите токен

Отправьте запрос POST на адрес http://localhost:3000/login с учетными данными пользователя в теле:

{
  "username": "example_user",
  "password": "example_password"
}

Ответ:

{
    "message": "Login successful",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Indpc2RvbSIsImlhdCI6MTcwNDU2NzkzNSwiZXhwIjoxNzA0NTcxNTM1fQ.CZm0yLgA0BsfESGBORdrTLtQ5Kw3SIxSc8PuAaYBRV4"
}

Просмотрите информацию о базе данных локально:

RedisInsight предлагает комплексное представление базы данных Redis, позволяя пользователям исследовать и анализировать ее содержимое.

* Открыть новый взгляд

Нажмите на значение Псевдоним базы данных, то есть 127.0.0.1:6379

Redisinsight database alias.

  • Нажмите на существующие данные.

В этом руководстве я щелкнул первое значение, то есть user:example_user

Existing data in the database.

Затем откроется этот экран с более подробной информацией.

More details.

Докеризируйте свое приложение Node.js:

Вам необходима учетная запись Docker Hub. Если вы еще его не создали, зарегистрируйтесь в Docker Hub.

:::информация Убедитесь, что Docker установлен и работает на вашем локальном компьютере.

:::

  • Создайте Dockerfile в корневом каталоге вашего проекта Node.js.
# Use an official Node.js runtime as the base image
FROM node:16

# Set the working directory in the container
WORKDIR /usr/src/app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./

# Install app dependencies
RUN npm install

# Copy the rest of the application files to the working directory
COPY . .

# Expose the port the app runs on
EXPOSE 3000

# Define the command to run the app
CMD ["node", "blog.js"]

Структура папок после добавления Dockerfile

Folder structure.

* Пометьте свой образ Docker: откройте терминал , перейдите в корневой каталог вашего приложения Node.js, где находится ваш Dockerfile< /code> находится.

Выполните следующую команду, чтобы создать образ Docker и пометить его своим именем пользователя Docker Hub и желаемым именем репозитория:

docker build -t your-docker-username/auth-app:latest .

Замените your-docker-username на свое имя пользователя Docker Hub и blogpost-app на желаемое имя репозитория.

Вы получите аналогичный ответ:

[+] Building 8.4s (11/11) FINISHED                                                                                              docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                            0.0s
 => => transferring dockerfile: 487B                                                                                                            0.0s
 => [internal] load .dockerignore                                                                                                               0.0s
 => => transferring context: 2B                                                                                                                 0.0s
 => [internal] load metadata for docker.io/library/node:16                                                                                      4.1s
 => [auth] library/node:pull token for registry-1.docker.io                                                                                     0.0s
 => [1/5] FROM docker.io/library/node:16@sha256:f77a1aef2da8d83e45ec990f45df50f1a286c5fe8bbfb8c6e4246c6389705c0b                                0.0s
 => [internal] load build context                                                                                                               0.3s
 => => transferring context: 4.55MB                                                                                                             0.3s
 => CACHED [2/5] WORKDIR /usr/src/app                                                                                                           0.0s
 => [3/5] COPY package*.json ./                                                                                                                 0.0s
 => [4/5] RUN npm install                                                                                                                       3.5s
 => [5/5] COPY . .                                                                                                                              0.2s
 => exporting to image                                                                                                                          0.1s 
 => => exporting layers                                                                                                                         0.1s 
 => => writing image sha256:23304094353243bf75417ea2db7794ddaf0c788b3695c9d2c5e9257887e113cf                                                    0.0s
 => => naming to docker.io/wise4rmgod/auth-app:latest                                                                                       1.0s
  • Войдите в Docker Hub: аутентифицируйте свой клиент Docker с помощью своей учетной записи Docker Hub, выполнив следующую команду:
docker login

Введите имя пользователя и пароль вашего Docker Hub. При появлении запроса и в случае успеха вы получите аналогичный ответ.

Authenticating with existing credentials...
Login Succeeded

* Отправьте образ Docker в Docker Hub: После входа в систему отправьте помеченный образ Docker в репозиторий Docker Hub с помощью следующей команды:

 docker push your-docker-username/auth-app:latest

Эта команда загружает локальный образ в Docker Hub в указанном вами репозитории.

Ответ:

6198dc681375: Pushed 
9214cb11fa0d: Pushed 
0bec55053fbf: Pushed 
dd387bc6b362: Mounted from wise4rmgod/blogpost-app 
8ae0c889ca84: Mounted from wise4rmgod/blogpost-app 
be36d2a441aa: Mounted from wise4rmgod/blogpost-app 
c91ec53bcc27: Mounted from wise4rmgod/blogpost-app 
03f6e3800bbe: Mounted from wise4rmgod/blogpost-app 
ad3b30eb29d3: Mounted from wise4rmgod/blogpost-app 
2a7587eb01b6: Mounted from wise4rmgod/blogpost-app 
a10e482288d1: Mounted from wise4rmgod/blogpost-app 
f9cfc9f6b603: Mounted from wise4rmgod/blogpost-app 
latest: digest: sha256:8cde1cdf557e8f84b435ab7d8c07780e37049351cb1220b7e4df1a193fe84027 size: 2842

Проверка отправки. Перейдите в свою учетную запись Docker Hub в Интернете и перейдите в свой репозиторий, чтобы подтвердить, что ваш образ Docker был успешно отправлен.

Verify the push

Разверните свой проект в Aptible.

Обязательное условие

:::совет В этом руководстве предполагается, что у вас есть базовые знания о настройке среды, приложения, конечной точки и базы данных на Подходящая платформа. В руководстве в качестве базы данных используется CouchDB, а для развертывания используется Direct Docker.

:::

  • Войдите в Aptible через CLI, используя следующую команду:
aptible login

Вам будет предложено ввести адрес электронной почты и пароль. В случае успеха вы получите ответ, подобный этому:

Token written to /Users/wisdomnwokocha/.aptible/tokens.json
This token will expire after 7 days (use --lifetime to customize)
  • Теперь разверните свое приложение с помощью следующей команды:

Синтаксис:

aptible deploy --app <app name> --docker-image <docker image in cloud>

Пример команды:

aptible deploy --app reactgame --docker-image wise4rmgod/auth-app

Вы получите ответ, подобный следующему:

Deploying app...
INFO -- : Starting App deploy operation with ID: 62628758
INFO -- : Deploying without git repository
INFO -- : Writing .aptible.env file...
INFO -- : Fetching app image: wise4rmgod/auth-app...
INFO -- : Pulling from wise4rmgod/auth-app
INFO -- : 26ee4ff96582: Pulling fs layer
INFO -- : 446eab4103f4: Pulling fs layer
INFO -- : 2e3c22a0f840: Pulling fs layer
INFO -- : a7ab8ad9b408: Pulling fs layer
INFO -- : 3808fdf0c601: Pulling fs layer
INFO -- : ab9e4075c671: Pulling fs layer
INFO -- : 362360c8cef6: Pulling fs layer
INFO -- : 928b5d11ac66: Pulling fs layer
INFO -- : dc87e077ac61: Pulling fs layer
INFO -- : 8a5fcbf535dc: Pulling fs layer
INFO -- : 469401a1d41f: Pulling fs layer
INFO -- : eed607c017df: Pulling fs layer
INFO -- : 2e3c22a0f840: Downloading: 515 KB / 49.8 MB
INFO -- : 446eab4103f4: Downloading: 173 KB / 16.6 MB
INFO -- : 26ee4ff96582: Downloading: 495 KB / 47 MB
INFO -- : a7ab8ad9b408: Downloading: 527 KB / 175 MB
INFO -- : 2e3c22a0f840: Downloading: 25.2 MB / 49.8 MB
INFO -- : ab9e4075c671: Downloading: 352 KB / 33.4 MB
INFO -- : a7ab8ad9b408: Downloading: 35.4 MB / 175 MB
INFO -- : 26ee4ff96582: Pull complete
INFO -- : 446eab4103f4: Pull complete
INFO -- : 2e3c22a0f840: Pull complete
INFO -- : a7ab8ad9b408: Downloading: 70.8 MB / 175 MB
INFO -- : a7ab8ad9b408: Downloading: 106 MB / 175 MB
INFO -- : a7ab8ad9b408: Downloading: 140 MB / 175 MB
.
INFO -- : a7ab8ad9b408: Pull complete
INFO -- : 3808fdf0c601: Pull complete
INFO -- : ab9e4075c671: Pull complete
INFO -- : 362360c8cef6: Pull complete
INFO -- : 928b5d11ac66: Pull complete
INFO -- : dc87e077ac61: Pull complete
INFO -- : 8a5fcbf535dc: Pull complete
INFO -- : 469401a1d41f: Pull complete
INFO -- : eed607c017df: Pull complete
INFO -- : Digest: sha256:8cde1cdf557e8f84b435ab7d8c07780e37049351cb1220b7e4df1a193fe84027
INFO -- : Status: Downloaded newer image for wise4rmgod/auth-app:latest
INFO -- : No Procfile found in git directory or /.aptible/Procfile found in Docker image: using Docker image CMD
INFO -- : No .aptible.yml found in git directory or /.aptible/.aptible.yml found in Docker image: no before_release commands will run
INFO -- : Pushing image dualstack-v2-registry-i-0a7c34b9c3e849206.aptible.in:46022/app-65706/e305b9c9-c6e5-487b-a4f2-6b07306c5cd6:latest to private Docker registry...
INFO -- : The push refers to repository [dualstack-v2-registry-i-0a7c34b9c3e849206.aptible.in:46022/app-65706/e305b9c9-c6e5-487b-a4f2-6b07306c5cd6]
INFO -- : 8ae0c889ca84: Pushed
INFO -- : dd387bc6b362: Pushed
INFO -- : c91ec53bcc27: Pushing: 522 KB / 93.6 MB
INFO -- : 6198dc681375: Pushed
INFO -- : 0bec55053fbf: Pushed
INFO -- : 9214cb11fa0d: Pushed
INFO -- : 2a7587eb01b6: Pushing: 544 KB / 137 MB
INFO -- : ad3b30eb29d3: Pushing: 542 KB / 444 MB
INFO -- : c91ec53bcc27: Pushing: 31.3 MB / 93.6 MB
INFO -- : be36d2a441aa: Pushed
INFO -- : 03f6e3800bbe: Pushed
INFO -- : 2a7587eb01b6: Pushing: 34.9 MB / 137 MB
INFO -- : a10e482288d1: Pushing: 338 KB / 30.7 MB
INFO -- : f9cfc9f6b603: Pushing: 513 KB / 103 MB
INFO -- : c91ec53bcc27: Pushing: 62.7 MB / 93.6 MB
INFO -- : f9cfc9f6b603: Pushing: 35.1 MB / 103 MB
INFO -- : 2a7587eb01b6: Pushing: 69.4 MB / 137 MB
INFO -- : f9cfc9f6b603: Pushing: 69.2 MB / 103 MB
INFO -- : ad3b30eb29d3: Pushing: 45 MB / 444 MB
INFO -- : a10e482288d1: Pushed
INFO -- : 2a7587eb01b6: Pushing: 104 MB / 137 MB
INFO -- : c91ec53bcc27: Pushed
INFO -- : ad3b30eb29d3: Pushing: 90.5 MB / 444 MB
INFO -- : f9cfc9f6b603: Pushed
INFO -- : 2a7587eb01b6: Pushed
INFO -- : ad3b30eb29d3: Pushing: 135 MB / 444 MB
INFO -- : ad3b30eb29d3: Pushing: 178 MB / 444 MB
INFO -- : ad3b30eb29d3: Pushing: 223 MB / 444 MB
INFO -- : ad3b30eb29d3: Pushing: 267 MB / 444 MB
INFO -- : ad3b30eb29d3: Pushing: 311 MB / 444 MB
INFO -- : ad3b30eb29d3: Pushing: 357 MB / 444 MB
INFO -- : ad3b30eb29d3: Pushing: 401 MB / 444 MB
INFO -- : ad3b30eb29d3: Pushed
INFO -- : latest: digest: sha256:8cde1cdf557e8f84b435ab7d8c07780e37049351cb1220b7e4df1a193fe84027 size: 2842
INFO -- : Pulling from app-65706/e305b9c9-c6e5-487b-a4f2-6b07306c5cd6
INFO -- : Digest: sha256:8cde1cdf557e8f84b435ab7d8c07780e37049351cb1220b7e4df1a193fe84027
INFO -- : Status: Image is up to date for dualstack-v2-registry-i-0a7c34b9c3e849206.aptible.in:46022/app-65706/e305b9c9-c6e5-487b-a4f2-6b07306c5cd6:latest
INFO -- : Image app-65706/e305b9c9-c6e5-487b-a4f2-6b07306c5cd6 successfully pushed to registry.
INFO -- : STARTING: Register service cmd in API
INFO -- : COMPLETED (after 0.27s): Register service cmd in API
INFO -- : STARTING: Derive placement policy for service cmd
INFO -- : COMPLETED (after 0.13s): Derive placement policy for service cmd
INFO -- : STARTING: Create new release for service cmd
INFO -- : COMPLETED (after 0.25s): Create new release for service cmd
INFO -- : STARTING: Schedule service cmd
...
INFO -- : COMPLETED (after 13.5s): Schedule service cmd
INFO -- : STARTING: Stop old app containers for service cmd
INFO -- : COMPLETED (after 0.0s): Stop old app containers for service cmd
INFO -- : STARTING: Start app containers for service cmd
INFO -- : WAITING FOR: Start app containers for service cmd

INFO -- : WAITING FOR: Start app containers for service cmd
INFO -- : COMPLETED (after 18.56s): Start app containers for service cmd
INFO -- : STARTING: Delete old containers for service cmd in API
INFO -- : COMPLETED (after 0.0s): Delete old containers for service cmd in API
INFO -- : STARTING: Commit app containers in API for service cmd
INFO -- : COMPLETED (after 0.26s): Commit app containers in API for service cmd
INFO -- : STARTING: Commit service cmd in API
INFO -- : COMPLETED (after 0.13s): Commit service cmd in API
INFO -- : STARTING: Cache maintenance page
INFO -- : COMPLETED (after 0.28s): Cache maintenance page
INFO -- : STARTING: Commit app in API
INFO -- : COMPLETED (after 0.18s): Commit app in API
INFO -- : App deploy successful.

* Посетите панель управления Aptible, чтобы убедиться, что развертывание прошло успешно.

Aptible Dashboard

  • Выберите cmd Docker CMD и нажмите кнопку Создать конечную точку

Это позволит вам открыть доступ к вашей базе данных в Интернете.

Deploy your code

Реализация конвейера CI/CD с помощью Aptible Terraform

:::предупреждение Прежде чем продолжить работу с этим разделом, у вас должна быть установлена ​​облачная учетная запись Terraform и интерфейс командной строки Terraform.

:::

Поставщик Aptible Terraform позволяет вам управлять ресурсами Aptible непосредственно из Terraform.

:::совет Это позволяет вам использовать инфраструктуру как код (IaC) вместо запуска операций вручную из Aptible Dashboard или Aptible CLI.

:::

С помощью поставщика Aptible Terraform вы можете автоматизировать настройку новых сред, включая создание, масштабирование, изменение и деинициализацию приложений и баз данных.

* Войти в Terraform через CLI

В своем терминале используйте команду terraform login, чтобы создать токен API и настроить CLI для его использования.

terraform login

* Создать новый каталог: создайте новый каталог для вашего проекта Terraform.

Такова теперь структура моих папок.

Folder structure

  • Создать новый файл:

Создайте новый файл в только что созданном каталоге и назовите его main.tf

* Добавьте информацию о поставщике и ресурсах. В файле main.tf добавьте информацию о поставщике облачной службы, которую вы хотите использовать. Например, если вы хотите использовать AWS, добавьте следующий код:

resource "aptible_app" "example-app" {
    env_id = data.aptible_environment.example.env_id
    handle = "example-app"
    config = {
        "REDIS_URL": aptible_database.example-redis-db.default_connection_url,
        "DATABASE_URL": aptible_database.example-pg-db.default_connection_url,
    }
    service {
        process_type           = "cmd"
        container_count        = 1
        container_memory_limit = 1024
    }
}

resource "aptible_database" "example-redis-b" {
  env_id         = data.aptible_environment.example.env_id
  handle         = "example-redis-db"
  database_type  = "redis"
  container_size = 512
  disk_size      = 10
  version        = "5.0"
}

* Инициализировать Terraform. В терминале перейдите в каталог, в котором вы создали проект Terraform, и выполните следующую команду для инициализации Terraform:

Javascript инициализация терраформирования * Создать план выполнения. Чтобы создать план выполнения, выполните следующую команду:

Javascript план терраформирования * Применить изменения. Наконец, выполните следующую команду, чтобы применить изменения:

Javascript применить терраформ

Вывод

Интеграция Node.js, Aptible Terraform и Redis предлагает надежную и эффективную платформу для создания безопасного и масштабируемого шлюза API аутентификации.


Оригинал