Terraform-ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅Ρ Π΄Π»Ρ Tuna
ΠΠΎΠ³Π΄Π° ΡΡΠ½Π½Π΅Π»Π΅ΠΉ, Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² ΠΈ ΡΠ»ΡΠ·ΠΎΠ² ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π΄Π΅ΡΡΡΠΊΠ°, Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΠΈΡ
ΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ Π² Π»ΠΈΡΠ½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅ΡΠ΅ ΡΠΆΠ΅ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ: ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΊΡΠΎ ΠΈ ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΠ». ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²ΡΠΏΡΡΡΠΈΠ»ΠΈ 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_certificate | TLS-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π΄Π»Ρ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ Π·ΠΎΠ½Ρ |
tuna_gateway | Π¨Π»ΡΠ· Ρ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΎΠΉ ΡΡΠ°ΡΠΈΠΊΠ° |
tuna_endpoint | TCP-ΠΏΠΎΡΡ |
tuna_ip_policy, tuna_ip_policy_rule | IP-ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΠΈ Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° |
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 β ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅.
Π‘ ΡΠ΅Π³ΠΎ Π½Π°ΡΠ°ΡΡβ
- ΠΡΠΏΡΡΡΠΈΡΠ΅ Π² Π»ΠΈΡΠ½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅ΡΠ΅ API-ΠΊΠ»ΡΡ ΡΠΎ ΡΠΊΠΎΡΠΏΠΎΠΌ
tunnels:write. - ΠΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ Π΅Π³ΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΡ ΡΠ΅ΡΠ΅Π·
export TUNA_API_KEY=.... - ΠΠΏΠΈΡΠΈΡΠ΅ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΅ΡΡΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅
terraform init && terraform apply.
Π‘ΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ ΠΈ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌ β Π² Terraform Registry, ΠΎΠ±Π·ΠΎΡ ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ β Π² Π½Π°ΡΠ΅ΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΡΠΎ ΠΏΠ΅ΡΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°: Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΡΠ΅ΡΡΡΡΠ°, Π½Π°ΠΏΠΈΡΠΈΡΠ΅ Π½Π°ΠΌ β ΡΠ°ΡΡΠΈΡΠΈΠΌ.
ΠΡΡΠ°Π²ΡΡΠ΅ ΠΎΡΠ·ΡΠ²β
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠ°Π²ΠΈΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Tuna, ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ Π²Ρ Π½Π΅Π΄ΠΎΠ²ΠΎΠ»ΡΠ½Ρ ΡΠ΅ΠΌ Π»ΠΈΠ±ΠΎ, ΡΠΎ ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ° ΠΎΡΡΠ°Π²ΡΡΠ΅ ΠΎΡΠ·ΡΠ².
ΠΠΎΠ²ΠΎΡΡΠΈβ
ΠΠ½ΠΎΠ½ΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΡΡΠ°ΡΠ΅ΠΉ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌ Π² Telegram-ΠΊΠ°Π½Π°Π»Π΅. ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΠΉΡΠ΅ΡΡ, ΡΡΠΎΠ±Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ.
ΠΠΎΠΌΠΎΡΡβ
ΠΡ ΡΠ΅Π½ΠΈΠΌ Π½Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΠΈΠ·ΡΡΠ°Π΅ΠΌ Π²ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ tuna β ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²ΡΠΆΠΈΡΠ΅ΡΡ Ρ Π½Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ²: