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, ΠΎΠ±Π·ΠΎΡ ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ β Π² Π½Π°ΡΠ΅ΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΡΠΎ ΠΏΠ΅ΡΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°: Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΡΠ΅ΡΡΡΡΠ°, Π½Π°ΠΏΠΈΡΠΈΡΠ΅ Π½Π°ΠΌ β ΡΠ°ΡΡΠΈΡΠΈΠΌ.
Leave feedbackβ
If you enjoy using Tuna, or on the contrary you are not happy with something, please leave feedback.
Newsβ
We announce new features and posts on our Telegram channel. Subscribe so you don't miss anything.
Helpβ
We value our users and carefully review every request. If you have any problems with tuna, please contact us in one of the following ways: