Membangun DevOps untuk Secure Auth API Gateway menggunakan Nodejs, Aptible Terraform, dan Redis

· 14 min read
Membangun DevOps untuk Secure Auth API Gateway menggunakan Nodejs, Aptible Terraform, dan Redis
Photo by Growtika / Unsplash

Membangun gateway API yang aman dan skalabel sangat penting bagi pengembangan perangkat lunak modern. Dalam konteks ini, Node.js, Aptible Terraform, dan Redis adalah tiga alat canggih yang dapat digunakan untuk membangun gateway API yang aman dan skalabel.

Dengan Node.js, Anda dapat membangun aplikasi sisi server yang cepat dan efisien, sementara Aptible Terraform memungkinkan Anda mengelola sumber daya Aptible langsung dari Terraform, mengaktifkan infrastruktur sebagai kode (IaC).

Redis adalah penyimpanan struktur data dalam memori sumber terbuka yang dapat digunakan sebagai basis data, cache, dan perantara pesan.

Bersama-sama, alat-alat ini dapat membantu Anda membuat gateway API yang aman dan berskala yang dapat menangani banyak permintaan sekaligus memastikan keamanan data Anda.

Prasyarat:

Untuk membangun gateway API yang aman dan skalabel menggunakan Node.js, Aptible Terraform, dan Redis, Anda memerlukan prasyarat berikut:

  • Node.js : Runtime JavaScript canggih yang membentuk pusat kekuatan backend dengan banyak pustaka autentikasi.
  • Aptible : Platform tanpa server yang menyederhanakan penerapan, penskalaan, dan manajemen keamanan untuk aplikasi Node.js. Pengetahuan dasar tentang Aptible diperlukan.
  • Redis : Basis data dalam memori secepat kilat yang berfungsi sebagai cache dan menyimpan data autentikasi penting seperti token dan sesi pengguna.
  • RedisInsight : Antarmuka pengguna grafis (GUI) untuk Redis yang memungkinkan Anda memvisualisasikan dan berinteraksi dengan data Redis Anda. RedisInsight harus diinstal dan dijalankan di komputer lokal Anda.
  • Terraform : Alat infrastruktur sebagai kode (IaC) sumber terbuka yang memungkinkan Anda mengelola infrastruktur secara aman dan berulang. Pengetahuan dasar tentang Terraform diperlukan.
  • Docker : Platform kontainerisasi yang mengemas aplikasi dan dependensinya ke dalam satu kontainer. Pengetahuan dasar tentang Docker diperlukan.

Inisialisasi Proyek Node.js

  • Buat direktori baru untuk proyek Anda dan inisialisasi Node.jsproyek dengan menjalankan perintah ini:
npm init -y

  • Instal paket yang diperlukan:
npm install express redis body-parser jsonwebtoken

Menyiapkan Server Ekspres dengan Autentikasi

  • Buat file index.js di direktori proyek Anda.
  • Konfigurasikan server Express:
const express = require('express');

Siapkan Redis untuk Penyimpanan Data

Pastikan Redis terinstal dan berjalan pada sistem Anda.

  • Pengaturan Klien Redis:
const redisClient = new Redis();

Kode ini menginisialisasi klien Redis yang terhubung ke server Redis default yang berjalan localhostpada port 6379.

Ia menggunakan Redis()konstruktor dari pustaka Redis untuk membuat klien.

redisClient.on("connect", () => {...});dan redisClient.on("error", (err) => {...});merupakan pendengar peristiwa yang menangani peristiwa saat klien Redis berhasil tersambung atau menemui kesalahan selama penyambungan.

  • Pengaturan Middleware Ekspres:
app.use(bodyParser.json());

Ini menyiapkan aplikasi Express untuk menggunakan bodyParser.json()middleware, yang memungkinkannya mengurai permintaan JSON yang masuk.

  • Titik Akhir Pendaftaran (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 });
    }
  );
});

Titik akhir ini menangani pendaftaran pengguna. Titik akhir ini mengambil usernamepassword, dan emaildari badan permintaan, melakukan pemeriksaan validasi, lalu mensimulasikan penyimpanan data pengguna di Redis menggunakan redisClient.hmset().

  • Titik Akhir Login (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 });
  });
});

Titik akhir ini menangani proses masuk pengguna. Titik akhir ini memvalidasi kredensial pengguna dengan mengambil kata sandi yang tersimpan dari Redis menggunakan redisClient.hget().

Jika kredensialnya valid, ia menghasilkan token JWT untuk autentikasi.

  • Rute yang Dilindungi (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" });
});

Ini adalah contoh rute terlindungi yang memerlukan token Bearer untuk akses. verifyTokenFungsi middleware digunakan untuk memverifikasi token sebelum mengizinkan akses ke rute.

  • Fungsi Middleware 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" });
  }
}

Fungsi middleware ini memeriksa keberadaan token Bearer di Authorizationheader permintaan. Jika terdapat token yang valid, fungsi ini akan memverifikasinya menggunakan jwt.verify()dan mengizinkan akses ke rute yang dilindungi.

Jika tidak, akan muncul kesalahan Terlarang.

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

Kode ini memulai server Express, mendengarkan yang ditentukan PORT, dan mencatat pesan ke konsol setelah server berjalan.

Kode lengkap:

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}`);
});

Jalankan Server

Mulai server Redis:

redis-server

Tanggapan:

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

Buka terminal baru, lalu mulai server Node.js:

node app.js

Tanggapan:

Server running on port 3000
Connected to Redis...

Uji Titik Akhir

Gunakan alat seperti curlPostman atau Postman untuk menguji titik akhir registrasi dan login. Pastikan Anda menyediakan data JSON yang valid untuk titik akhir registrasi ( /register) dan login ( /login).

Dokumentasi API

  • Daftarkan Pengguna

Kirim permintaan POST ke http://localhost:3000/registerdengan badan berikut (contoh):

{
  "username": "example_user",
  "password": "example_password",
  "email": "[email protected]"
}

Tanggapan:

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

  • Masuk dan Ambil Token

Kirim permintaan POST ke http://localhost:3000/logindengan kredensial pengguna di badan:

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

Tanggapan:

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

Lihat info basis data Redis secara lokal:

RedisInsight menawarkan tampilan basis data Redis yang komprehensif, yang memungkinkan pengguna menjelajahi dan menganalisis konten basis data.

  • Buka wawasan baru

Klik pada nilai Alias Database yang127.0.0.1:6379

Alias basis data Redisinsight.

Alias basis data Redisinsight.

  • Klik pada data yang ada.

Untuk tutorial ini, saya mengklik nilai pertama yaituuser:example_user

Data yang ada dalam basis data.

Data yang ada dalam basis data.

Kemudian, layar ini akan terbuka dengan rincian lebih lanjut.

Keterangan lebih lanjut.

Keterangan lebih lanjut.

Dockerisasi Aplikasi Node.js Anda:

Anda harus memiliki akun Docker Hub. Jika belum, daftar di Docker Hub.

Pastikan Anda telah menginstal dan menjalankan Docker di komputer lokal Anda.

  • Buat Dockerfile  di direktori root proyek Node.js Anda.
# 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"]

Struktur folder setelah menambahkanDockerfile

Struktur folder.

Struktur folder.

  • Tandai citra Docker Anda:  Buka terminal, navigasikan ke direktori root Node.jsaplikasi Anda, tempat Anda Dockerfileberada.Jalankan perintah berikut untuk membangun citra Docker Anda dan menandainya dengan nama pengguna Docker Hub dan nama repositori yang diinginkan:
docker build -t your-docker-username/auth-app:latest .

Ganti  your-docker-username dengan nama pengguna Docker Hub Anda dan  auth-app dengan nama repositori yang Anda inginkan.

Anda akan mendapatkan respons serupa seperti ini:

[+] 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
  • Masuk ke Docker Hub:  Autentikasi klien Docker Anda dengan akun Docker Hub Anda dengan menjalankan perintah berikut:
docker login

Masukkan Docker Hub Anda usernamedan passwordketika diminta, Anda akan mendapatkan respons serupa jika berhasil.

Authenticating with existing credentials...
Login Succeeded

  • Dorong citra Docker ke Docker Hub:  Setelah masuk, dorong tag yang Anda buat Docker imageke repositori Docker Hub menggunakan perintah berikut:
 docker push your-docker-username/auth-app:latest

Perintah ini mengunggah citra lokal Anda ke Docker Hub di bawah repositori yang Anda tentukan.

Tanggapan:

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

Verifikasi Dorongan:  Buka akun Docker Hub Anda di web dan navigasikan ke repositori Anda untuk mengonfirmasi bahwa citra Docker Anda telah berhasil didorong.

Verifikasi dorongan

Verifikasi dorongan

Terapkan proyek Anda ke Aptible.

Tutorial ini mengasumsikan Anda memiliki pemahaman dasar tentang cara menyiapkan  lingkungan ,  aplikasi ,  titik akhir,  dan  basis data  pada platform Aptible. Tutorial ini menggunakan Redis sebagai basis data dan menggunakan Direct Docker untuk penerapannya.

  • Masuk ke Aptible melalui CLI menggunakan perintah berikut:
aptible login

Anda akan diminta memasukkan emaildan password. Jika berhasil, Anda akan menerima respons seperti ini:

Token written to /Users/wisdomnwokocha/.aptible/tokens.json
This token will expire after 7 days (use --lifetime to customize)
  • Sekarang, terapkan aplikasi Anda menggunakan perintah berikut:

Sintaksis:

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

Contoh perintah:

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

Anda akan menerima respons serupa berikut ini:

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.

  • Kunjungi Dasbor Aptible untuk mengonfirmasi bahwa penerapan berhasil.

Dasbor Aptible

Dasbor Aptible

  • Pilih cmd Docker CMDdan klik tombol Buat Titik Akhir

Ini akan memungkinkan Anda untuk mengekspos basis data Anda ke internet publik.

Terapkan kode Anda

Terapkan kode Anda

Implementasikan Pipeline CI/CD dengan Aptible Terraform

Sebelum Anda melanjutkan dengan bagian ini, Anda harus memiliki akun cloud Terraform dan Terraform CLI yang terpasang.

Penyedia  Aptible Terraform  memungkinkan Anda mengelola sumber daya Aptible langsung dari Terraform.

Hal ini memungkinkan Anda menggunakan  infrastruktur sebagai kode (IaC)  alih-alih memulai operasi secara manual dari Aptible Dashboard atau Aptible CLI.

Dengan Aptible Terraform provider, Anda dapat mengotomatiskan pengaturan lingkungan baru, termasuk membuat, menskalakan, memodifikasi, dan membatalkan penyediaan aplikasi dan basis data.

  • Masuk ke Terraform melalui CLI

Di terminal Anda, gunakan  terraform login perintah untuk membuat token API dan konfigurasikan CLI Anda untuk menggunakannya.

terraform login

  • Buat direktori baru : Buat direktori baru untuk proyek Terraform Anda.

Ini adalah struktur folder saya sekarang.

Struktur folder

Struktur folder

  • Buat berkas baru :

Buat file baru di direktori yang baru saja Anda buat dan beri nama main.tf

  • Tambahkan informasi penyedia dan sumber daya : Dalam  main.tf file, tambahkan informasi penyedia untuk layanan cloud yang Anda inginkan.Misalnya, jika Anda ingin menggunakan AWS, tambahkan kode berikut:
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"
}

Terapkan perubahan : Terakhir, jalankan perintah berikut untuk menerapkan perubahan:

terraform apply

Buat rencana eksekusi : Jalankan perintah berikut untuk membuat rencana eksekusi:

terraform plan

Inisialisasi Terraform : Di terminal Anda, navigasikan ke direktori tempat Anda membuat proyek Terraform dan jalankan perintah berikut untuk menginisialisasi Terraform:

terraform init

Kesimpulan

Mengintegrasikan Node.js, Aptible Terraform, dan Redis menawarkan kerangka kerja yang kuat dan efisien untuk membangun gateway API autentikasi yang aman dan terukur.

Sekian dan Terimakasih