feat(corp/ops): configure state bucket for terraform
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>
This commit is contained in:
parent
0637ab3add
commit
111e1d38e5
3 changed files with 72 additions and 0 deletions
5
corp/ops/creds.fish
Normal file
5
corp/ops/creds.fish
Normal file
|
@ -0,0 +1,5 @@
|
|||
export YC_TOKEN=(yc iam create-token)
|
||||
export YC_CLOUD_ID=(yc config get cloud-id)
|
||||
export YC_FOLDER_ID=(yc config get folder-id)
|
||||
export AWS_ACCESS_KEY_ID="YCAJE6eRLY8Az-9kveNRtz4sh"
|
||||
export AWS_SECRET_ACCESS_KEY=(yc kms symmetric-crypto decrypt --name tvl-credentials --cloud-id b1ggu5m1btue982app12 --folder-name default --ciphertext-file encrypted-state-secret.key --plaintext-file /dev/stdout | head -n1)
|
BIN
corp/ops/encrypted-state-secret.key
Normal file
BIN
corp/ops/encrypted-state-secret.key
Normal file
Binary file not shown.
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue