ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ основному содСрТимому

Terraform-ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ для Tuna

Β· 3 ΠΌΠΈΠ½

Когда Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ, Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² ΠΈ шлюзов становится большС дСсятка, Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ Π² Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅ ΡƒΠΆΠ΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ: слоТно ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ окруТСния, нСпонятно, ΠΊΡ‚ΠΎ ΠΈ ΠΊΠΎΠ³Π΄Π° Ρ‡Ρ‚ΠΎ помСнял. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ выпустили Terraform-ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ yuccastream/tuna β€” Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ инфраструктуру Tuna ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² git рядом с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, Ρ€Π΅Π²ΡŒΡŽΠΈΡ‚ΡŒ Π² merge request'Π°Ρ… ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· terraform apply.

terraform {
required_providers {
tuna = {
source = "yuccastream/tuna"
}
}
}

resource "tuna_domain" "preview" {
subdomain = "myapp-preview"
location = "ru"
}

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒβ€‹

РСсурсЧто описываСт
tuna_domainΠ—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½: ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½ встроСнной Π·ΠΎΠ½Ρ‹, своСй Π·ΠΎΠ½Ρ‹ ΠΈΠ»ΠΈ собствСнный Π΄ΠΎΠΌΠ΅Π½
tuna_domain_zoneДомСнная Π·ΠΎΠ½Π°
tuna_tls_certificateTLS-сСртификат для Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ Π·ΠΎΠ½Ρ‹
tuna_gatewayШлюз с ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°
tuna_endpointTCP-ΠΏΠΎΡ€Ρ‚
tuna_ip_policy, tuna_ip_policy_ruleIP-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΈ Π΅Ρ‘ ΠΏΡ€Π°Π²ΠΈΠ»Π°
tuna_public_keyΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ SSH-ΠΊΠ»ΡŽΡ‡
tuna_temporal_tokenΠ’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½ для запуска Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ Π΄Π°Π½Π½Ρ‹Ρ… tuna_tunnels Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ рСсурсы ΠΈΠ· Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ Π² state Ρ‡Π΅Ρ€Π΅Π· terraform import.

ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Terraform 1.11+ ΠΈ с OpenTofu. ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ TLS-сСртификата пСрСдаётся Ρ‡Π΅Ρ€Π΅Π· write-only Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² state.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΡƒΠ½Π½Π΅Π»ΠΈ для CI​

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ сцСнарий β€” preview-окруТСния Π² CI. Terraform Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΠΌΠ΅Π½ ΠΈ выпускаСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½ с ограничСниями, Π° CI-Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΡƒΠ½Π½Π΅Π»ΡŒ с этим Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ. Основной API-ΠΊΠ»ΡŽΡ‡ Π² CI ΠΏΡ€ΠΈ этом Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚:

resource "tuna_temporal_token" "ci" {
description = "CI preview"
duration = "24h"
allow_http = true
allow_tcp = false
limit_by_active_tunnels = 5
limit_by_created_tunnels = 100
}

output "ci_tunnel_token" {
value = tuna_temporal_token.ci.token
sensitive = true
}
terraform apply
export TUNA_TOKEN="$(terraform output -raw ci_tunnel_token)"
tuna http 8080 --subdomain=myapp-preview

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: шлюз с ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ ΠΈΠ· файла​

Шлюз β€” это Π΄ΠΎΠΌΠ΅Π½ с ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π»Π΅ΠΆΠΈΡ‚ Π² сосСднСм Ρ„Π°ΠΉΠ»Π΅ ΠΈ мСняСтся Ρ‚Π°ΠΊ ΠΆΠ΅, Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅Π²ΡŒΡŽ:

resource "tuna_domain" "api" {
subdomain = "myapp-api"
location = "ru"
}

resource "tuna_gateway" "api" {
domain_id = tuna_domain.api.id
policy = file("${path.module}/policy.yaml")
}

Π•Ρ‰Ρ‘ нСсколько сцСнариСв β€” своя домСнная Π·ΠΎΠ½Π° с wildcard-сСртификатом, доступ ΠΏΠΎ IP Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· офиса β€” Π΅ΡΡ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

API-ΠΊΠ»ΡŽΡ‡ΠΈ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΏΠΎ продуктам​

ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρƒ Π½ΡƒΠΆΠ΅Π½ API-ΠΊΠ»ΡŽΡ‡, ΠΈ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ Π΅ΠΌΡƒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ доступ ΠΊ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρƒ Π½Π΅Π·Π°Ρ‡Π΅ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ вмСстС с ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠΌ API-ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ скоупы: ΠΊΠ»ΡŽΡ‡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ туннСлями, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠΌ, сСкрСтами, бастионом, ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ β€” Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π° запись. Для Terraform достаточно tunnels:write.

Π—Π°ΠΎΠ΄Π½ΠΎ ΠΌΡ‹ Π·Π°ΠΊΡ€Ρ‹Π»ΠΈ для API-ΠΊΠ»ΡŽΡ‡Π΅ΠΉ всё, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Π²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρƒ ΠΏΡ€ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ ΠΊΠ»ΡŽΡ‡Π°:

  • выпуск Π½ΠΎΠ²Ρ‹Ρ… API-ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈ смСна Ρ€ΠΎΠ»Π΅ΠΉ участников;
  • Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°: ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, MFA, WebAuthn, Ρ‚ΠΎΠΊΠ΅Π½ Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ, привязки ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² Π²Ρ…ΠΎΠ΄Π°;
  • ΠΎΠΏΠ»Π°Ρ‚Π° ΠΈ подписка: способ ΠΎΠΏΠ»Π°Ρ‚Ρ‹, смСна Ρ‚Π°Ρ€ΠΈΡ„Π°, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΠΈ счСтов, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹;
  • ΠΏΡ€ΠΎΠ΄Π»Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π²Π΅Π±-сСссий, ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈ mesh.

Всё это дСлаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π°. ΠšΠ»ΡŽΡ‡, Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Π±Π΅Π· скоупов, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ read_api β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

Π‘ Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒβ€‹

  1. ВыпуститС Π² Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅ API-ΠΊΠ»ΡŽΡ‡ со скоупом tunnels:write.
  2. ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρƒ Ρ‡Π΅Ρ€Π΅Π· export TUNA_API_KEY=....
  3. ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ рСсурс ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ terraform init && terraform apply.

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ всСм рСсурсам ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ β€” Π² Terraform Registry, ΠΎΠ±Π·ΠΎΡ€ ΠΈ сцСнарии β€” Π² нашСй Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ пСрвая вСрсия ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°: Ссли Π²Π°ΠΌ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ рСсурса, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π½Π°ΠΌ β€” Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ.

ΠžΡΡ‚Π°Π²ΡŒΡ‚Π΅ отзыв​

Если Π²Π°ΠΌ нравится ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Tuna, ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ Π²Ρ‹ Π½Π΅Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹ Ρ‡Π΅ΠΌ Π»ΠΈΠ±ΠΎ, Ρ‚ΠΎ поТалуйста ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΎΡ‚Π·Ρ‹Π².

Новости​

Анонсы Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ статСй ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π² Telegram-ΠΊΠ°Π½Π°Π»Π΅. ΠŸΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°ΠΉΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

ΠŸΠΎΠΌΠΎΡ‰ΡŒβ€‹

ΠœΡ‹ Ρ†Π΅Π½ΠΈΠΌ Π½Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌ всС обращСния, Ссли Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с tuna – ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ²ΡΠΆΠΈΡ‚Π΅ΡΡŒ с Π½Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· способов: