Создайте 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
- Нажмите на существующие данные.
В этом руководстве я щелкнул первое значение, то есть user:example_user
Затем откроется этот экран с более подробной информацией.
Докеризируйте свое приложение 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
* Пометьте свой образ 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 был успешно отправлен.
Разверните свой проект в 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, чтобы убедиться, что развертывание прошло успешно.
- Выберите cmd
Docker CMD
и нажмите кнопку Создать конечную точку
Это позволит вам открыть доступ к вашей базе данных в Интернете.
Реализация конвейера 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.
Такова теперь структура моих папок.
- Создать новый файл:
Создайте новый файл в только что созданном каталоге и назовите его 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 аутентификации.
Оригинал