Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Kubernetes Secrets #149

Merged
merged 26 commits into from
Apr 20, 2020
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
9c361d4
Add Kubernetes Secrets
MartinPetkov Apr 15, 2020
53d7879
Move the secrets to their own deployment
MartinPetkov Apr 15, 2020
35ff198
Format the kubernetes/terragrunt.hcl file
MartinPetkov Apr 15, 2020
bcc7165
Fix for_each in secrets.tf
MartinPetkov Apr 15, 2020
6bd0529
Remove Secret Manager changes
MartinPetkov Apr 15, 2020
8f8f095
Rename to "my_studies_cluster" in the new code
MartinPetkov Apr 15, 2020
faf95ed
Merge branch 'terraform' into add-kubernetes-secrets
MartinPetkov Apr 15, 2020
fc53b5e
Merge branch 'terraform' into add-kubernetes-secrets
MartinPetkov Apr 16, 2020
e9f5fc3
Fix secret names
MartinPetkov Apr 16, 2020
d4a2d86
Remove extra line
MartinPetkov Apr 16, 2020
34e72da
Output the password in the data deployment
MartinPetkov Apr 16, 2020
a90169d
Refortmat terragrunt.hcl files
MartinPetkov Apr 16, 2020
87f786a
Remove the response-server-ws-gcloud-key user-registration-server-ws-…
MartinPetkov Apr 16, 2020
c4c3d31
Revert "Remove the response-server-ws-gcloud-key user-registration-se…
MartinPetkov Apr 16, 2020
92473dc
Create separate DB users and SAs for each app
MartinPetkov Apr 16, 2020
0e74ac6
Add project id to apps service accounts
MartinPetkov Apr 16, 2020
d36d022
Revert changes to apps/ and data/ deployments
MartinPetkov Apr 16, 2020
d829bdc
Remove file from another PR
MartinPetkov Apr 16, 2020
a34ca2d
Merge branch 'terraform' into add-kubernetes-secrets
MartinPetkov Apr 17, 2020
91d00f0
Retrieve the SQL user password from Secret Manager
MartinPetkov Apr 17, 2020
8dbe58d
terragrunt hclfmt
MartinPetkov Apr 17, 2020
5698ee3
Merge branch 'terraform' into add-kubernetes-secrets
MartinPetkov Apr 17, 2020
bd76112
Remove unused Kubernetes secrets
MartinPetkov Apr 17, 2020
8a48b80
Merge branch 'terraform' into add-kubernetes-secrets
MartinPetkov Apr 20, 2020
fbe30a5
Merge branch 'terraform' into add-kubernetes-secrets
MartinPetkov Apr 20, 2020
be87cad
Merge branch 'terraform' into add-kubernetes-secrets
MartinPetkov Apr 20, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
output "service_account" {
value = module.heroes_hat_cluster.service_account
}

output "gke_cluster" {
value = module.heroes_hat_cluster
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ variable "network_project_id" {
type = string
}


variable "gke_region" {
description = "The region to host the clusters in"
type = string
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
terraform {
backend "gcs" {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
data "google_container_cluster" "gke_cluster" {
name = var.heroes_hat_cluster.name
location = var.heroes_hat_cluster.location
project = var.project_id
}


provider "kubernetes" {
host = data.google_container_cluster.gke_cluster.endpoint
client_certificate = base64decode(data.google_container_cluster.gke_cluster.master_auth.0.client_certificate)
client_key = base64decode(data.google_container_cluster.gke_cluster.master_auth.0.client_key)
cluster_ca_certificate = base64decode(data.google_container_cluster.gke_cluster.master_auth.0.cluster_ca_certificate)
}


# Data sources from Secret Manager.

MartinPetkov marked this conversation as resolved.
Show resolved Hide resolved
data "google_secret_manager_secret_version" "secrets" {
provider = google-beta
project = var.secrets_project_id
secret = each.key

for_each = toset([
MartinPetkov marked this conversation as resolved.
Show resolved Hide resolved
"my-studies-sql-default-user-password",
"registration_client_id",
"registration_client_secret",
"wcp_user",
"wcp_pass",
"email_address",
"email_password",
])
}

# Secrets from Secret Manager.
resource "kubernetes_secret" "cloudsql_db_credentials" {
metadata {
name = "cloudsql-db-credentials"
}

data = {
username = var.sql_instance_user
MartinPetkov marked this conversation as resolved.
Show resolved Hide resolved
password = data.google_secret_manager_secret_version.secrets["my-studies-sql-default-user-password"].secret_data
dbname = var.sql_instance_name
}
}

resource "kubernetes_secret" "response_server_credentials" {
metadata {
name = "response-server-credentials"
}

data = {
REGISTRATION_CLIENT_ID = data.google_secret_manager_secret_version.secrets["registration_client_id"].secret_data
REGISTRATION_CLIENT_SECRET = data.google_secret_manager_secret_version.secrets["registration_client_secret"].secret_data
WCP_USER = data.google_secret_manager_secret_version.secrets["wcp_user"].secret_data
WCP_PASS = data.google_secret_manager_secret_version.secrets["wcp_pass"].secret_data
}
}

resource "kubernetes_secret" "email_credentials" {
metadata {
name = "email-credentials"
}

data = {
email_address = data.google_secret_manager_secret_version.secrets["email_address"].secret_data
email_password = data.google_secret_manager_secret_version.secrets["email_password"].secret_data
}
}

# Secrets from service accounts.
resource "google_service_account_key" "gke_cluster_service_account_key" {
service_account_id = var.heroes_hat_cluster.service_account
}

resource "kubernetes_secret" "cloudsql_instance_credentials" {
metadata {
name = "cloudsql-instance-credentials"
}
data = {
"sql_credentials.json" = base64decode(google_service_account_key.gke_cluster_service_account_key.private_key)
}
}

resource "kubernetes_secret" "response_server_ws_gcloud_key" {
metadata {
name = "response-server-ws-gcloud-key"
}
data = {
"key.json" = base64decode(google_service_account_key.gke_cluster_service_account_key.private_key)
}
}

resource "kubernetes_secret" "user_registration_server_ws_gcloud_key" {
metadata {
name = "user-registration-server-ws-gcloud-key"
}
data = {
"key.json" = base64decode(google_service_account_key.gke_cluster_service_account_key.private_key)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
project_id = "heroes-hat-dev-apps"
secrets_project_id = "heroes-hat-dev-devops"
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
include {
path = find_in_parent_folders()
}

dependency "apps" {
config_path = "../apps"

mock_outputs = {
gke_cluster = {
name = "mock-name"
location = "mock-location"
service_account = "mock-service-account"
}
}
}

dependency "data" {
config_path = "../../project.heroes-hat-dev-data/data/"

mock_outputs = {
instance_name = "mock-db"
instance_user = "mock-db-user"
}
}

inputs = {
sql_instance_name = dependency.data.outputs.instance_name
sql_instance_user = dependency.data.outputs.instance_user
heroes_hat_cluster = dependency.apps.outputs.gke_cluster
MartinPetkov marked this conversation as resolved.
Show resolved Hide resolved
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
variable "project_id" {
description = "The GCP project id"
type = string
}

variable "sql_instance_name" {
description = "The name of the SQL instance"
type = string
}

variable "sql_instance_user" {
description = "The name of the user to use to log into the SQL instance"
type = string
}

variable "secrets_project_id" {
type = string
}

variable "heroes_hat_cluster" {
description = "The GKE cluster module"
type = object({
name = string
location = string
service_account = string
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
output "instance_name" {
value = module.my_studies_cloudsql.instance_name
}

# This is not outputted by the safer_sql module, but allow dependents to treat
# it like it is.
output "instance_user" {
value = "default"
}