diff options
author | Vincent Ambo <mail@tazj.in> | 2023-04-21T16·13+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2023-04-24T10·56+0000 |
commit | 111e1d38e5ac177bcf4defe70aee1e853206bc6d (patch) | |
tree | 0670c6f3067a319859cd3d48b07d012e3ee11402 /corp/ops/main.tf | |
parent | 0637ab3add4f57359842a451ca9ffd70194524e2 (diff) |
feat(corp/ops): configure state bucket for terraform r/6109
This was a bit trickier than I anticipated, because there's no good ways to avoid passing the credentials around manually. What's basically happening now is that the credentials for the state bucket are checked in (encrypted), and sourcing `creds.fish` uses the cloud HSM to decrypt and load them into the environment. Change-Id: I3f5ce1c9bd9d5efbf1013414f94771a09ea3a488 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8494 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su>
Diffstat (limited to 'corp/ops/main.tf')
-rw-r--r-- | corp/ops/main.tf | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/corp/ops/main.tf b/corp/ops/main.tf index 98cea4c63175..1b87e95115ca 100644 --- a/corp/ops/main.tf +++ b/corp/ops/main.tf @@ -7,4 +7,71 @@ terraform { source = "yandex-cloud/yandex" } } + + # Credentials need to be sourced from creds.fish + backend "s3" { + endpoint = "storage.yandexcloud.net" + bucket = "su-tvl-terraform-state" + region = "ru-central1" + key = "corp/ops/terraform.tfstate" + + skip_region_validation = true + skip_credentials_validation = true + } +} + +provider "yandex" { + zone = "ru-central1-b" +} + +locals { + tvl_cloud_id = "b1ggu5m1btue982app12" + tvl_folder_id = "b1gmbeqt9o5kbl7rclln" + rih_cloud_id = "b1glccvcqggi2ruibgvt" + rih_folder_id = "b1gsavcrsjn059d1sbh9" +} + +# Storage state bucket configuration + +resource "yandex_iam_service_account" "tf_state_sa" { + folder_id = local.tvl_folder_id + name = "terraform-state" +} + +resource "yandex_resourcemanager_folder_iam_member" "tf_state_sa_storage" { + folder_id = local.tvl_folder_id + role = "storage.editor" + member = "serviceAccount:${yandex_iam_service_account.tf_state_sa.id}" +} + +resource "yandex_iam_service_account_static_access_key" "tf_state_sa_key" { + service_account_id = yandex_iam_service_account.tf_state_sa.id + description = "Static access key for Terraform state" +} + +resource "yandex_storage_bucket" "tf_state" { + access_key = yandex_iam_service_account_static_access_key.tf_state_sa_key.access_key + secret_key = yandex_iam_service_account_static_access_key.tf_state_sa_key.secret_key + bucket = "su-tvl-terraform-state" +} + +resource "yandex_dns_zone" "russiaishiring_com" { + name = "russiaishiring-com" + zone = "russiaishiring.com." + public = true + folder_id = local.rih_folder_id +} + +# Secret management configuration + +resource "yandex_kms_symmetric_key" "tvl_credentials_key" { + name = "tvl-credentials" + folder_id = local.tvl_folder_id + default_algorithm = "AES_256" + rotation_period = "2160h" # 90 days +} + +resource "yandex_kms_secret_ciphertext" "tf_state_key" { + key_id = yandex_kms_symmetric_key.tvl_credentials_key.id + plaintext = yandex_iam_service_account_static_access_key.tf_state_sa_key.secret_key } |