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

Deploy Opensearch #2341

Merged
merged 50 commits into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
668d7d0
opensearch spike
coilysiren Apr 19, 2024
7419e02
checkpoint-kai-1713808423
coilysiren Apr 22, 2024
82ff894
docs
coilysiren Apr 22, 2024
80b3531
checkpoint-kai-1713818731
coilysiren Apr 22, 2024
b982f46
cmk
coilysiren Apr 22, 2024
a89af33
remove docs
coilysiren Oct 2, 2024
7b5d055
Merge branch 'main' into kai/opensearch
coilysiren Oct 2, 2024
1b53aa0
add lockfile
coilysiren Oct 2, 2024
eeb1cdb
fix username password stuff
coilysiren Oct 2, 2024
0b0c29d
resize
coilysiren Oct 3, 2024
d9209cf
move into a module
coilysiren Oct 3, 2024
2879634
remove comments
coilysiren Oct 3, 2024
3db0a7e
password docs
coilysiren Oct 3, 2024
ccc7ec0
appease checkov
coilysiren Oct 3, 2024
9944768
more details in comment
coilysiren Oct 3, 2024
2ee4e7b
Merge branch 'main' into kai/opensearch
coilysiren Oct 3, 2024
13f5fd8
bump version
coilysiren Oct 7, 2024
e925f48
reduce number of configs per env
coilysiren Oct 7, 2024
e090f8f
add docs
coilysiren Oct 7, 2024
7db900a
more docs
coilysiren Oct 7, 2024
e2f838d
var name
coilysiren Oct 7, 2024
a1d8ab7
warm cold conf
coilysiren Oct 7, 2024
18adf3e
the longest password
coilysiren Oct 7, 2024
c9f51b7
docs
coilysiren Oct 7, 2024
13cdf6a
drop warm storage
coilysiren Oct 8, 2024
fddc284
revert lockfile
coilysiren Oct 9, 2024
7b4babf
Merge branch 'main' into kai/opensearch
coilysiren Oct 9, 2024
159621a
update configs
coilysiren Oct 9, 2024
1303dd4
appease checkov
coilysiren Oct 9, 2024
2d2fb4b
rename to search
coilysiren Oct 9, 2024
11a3308
add outputs
coilysiren Oct 9, 2024
859fb3e
appease checkov
coilysiren Oct 9, 2024
df81e96
username twice somehow
coilysiren Oct 9, 2024
03c750f
workon service auth
coilysiren Oct 9, 2024
2ed17a7
add search env vars
coilysiren Oct 9, 2024
61aed8f
workon kms
coilysiren Oct 9, 2024
7b9c2a2
fix kms policy
coilysiren Oct 9, 2024
ba6d7d3
add service to kms policy
coilysiren Oct 9, 2024
9fdcccd
Merge branch 'main' into kai/opensearch
coilysiren Oct 9, 2024
3f84d01
secrets refactor
coilysiren Oct 10, 2024
a382cee
remove plan
coilysiren Oct 10, 2024
3157982
fix horrible mistake
coilysiren Oct 10, 2024
885a74a
security enhancements
coilysiren Oct 10, 2024
e0b587d
appease checkov
coilysiren Oct 10, 2024
c162a3f
extreme KMS
coilysiren Oct 10, 2024
dbd0e06
rename stuff
coilysiren Oct 10, 2024
bd98fc3
workon checkov
coilysiren Oct 10, 2024
bc5aea0
workon checkov
coilysiren Oct 10, 2024
303dfe6
workon kms
coilysiren Oct 10, 2024
bb78f2e
fix env vars
coilysiren Oct 10, 2024
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
10 changes: 10 additions & 0 deletions infra/api/app-config/dev.tf
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@ module "dev_config" {
database_max_capacity = 16
database_min_capacity = 2

has_opensearch = true
opensearch_multi_az_with_standby_enabled = false
opensearch_zone_awareness_enabled = false
opensearch_dedicated_master_enabled = false
opensearch_dedicated_master_count = 1
opensearch_dedicated_master_type = "m6g.large.search"
opensearch_instance_count = 1
opensearch_instance_type = "or1.medium.search"
opensearch_availability_zone_count = 3

# Runs, but with everything disabled.
# See api/src/data_migration/command/load_transform.py for argument specifications.
load_transform_args = [
Expand Down
13 changes: 13 additions & 0 deletions infra/api/app-config/env-config/outputs.tf
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
output "opensearch_config" {
value = var.has_opensearch ? {
multi_az_with_standby_enabled = var.opensearch_multi_az_with_standby_enabled
zone_awareness_enabled = var.opensearch_zone_awareness_enabled
dedicated_master_enabled = var.opensearch_dedicated_master_enabled
instance_count = var.opensearch_instance_count
instance_type = var.opensearch_instance_type
dedicated_master_count = var.opensearch_dedicated_master_count
dedicated_master_type = var.opensearch_dedicated_master_type
availability_zone_count = var.opensearch_availability_zone_count
} : null
}

output "database_config" {
value = var.has_database ? {
region = var.default_region
Expand Down
36 changes: 36 additions & 0 deletions infra/api/app-config/env-config/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,42 @@ variable "default_region" {
type = string
}

variable "has_opensearch" {
type = bool
}

variable "opensearch_multi_az_with_standby_enabled" {
type = bool
}

variable "opensearch_zone_awareness_enabled" {
type = bool
}

variable "opensearch_dedicated_master_enabled" {
type = bool
}

variable "opensearch_dedicated_master_count" {
type = number
}

variable "opensearch_dedicated_master_type" {
type = string
}

variable "opensearch_instance_count" {
type = number
}

variable "opensearch_instance_type" {
type = string
}

variable "opensearch_availability_zone_count" {
type = number
}

variable "has_database" {
type = bool
}
Expand Down
10 changes: 10 additions & 0 deletions infra/api/app-config/prod.tf
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ module "prod_config" {
database_max_capacity = 32
database_min_capacity = 2

has_opensearch = true
opensearch_multi_az_with_standby_enabled = true
opensearch_zone_awareness_enabled = true
opensearch_dedicated_master_enabled = true
opensearch_instance_count = 3
opensearch_instance_type = "or1.medium.search"
opensearch_dedicated_master_count = 3
opensearch_dedicated_master_type = "m6g.large.search"
opensearch_availability_zone_count = 3

# See api/src/data_migration/command/load_transform.py for argument specifications.
load_transform_args = [
"poetry",
Expand Down
10 changes: 10 additions & 0 deletions infra/api/app-config/staging.tf
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@ module "staging_config" {
database_max_capacity = 16
database_min_capacity = 2

has_opensearch = true
opensearch_multi_az_with_standby_enabled = false
opensearch_zone_awareness_enabled = false
opensearch_dedicated_master_enabled = false
opensearch_dedicated_master_count = 1
opensearch_dedicated_master_type = "m6g.large.search"
opensearch_instance_count = 1
opensearch_instance_type = "or1.medium.search"
opensearch_availability_zone_count = 3

# See api/src/data_migration/command/load_transform.py for argument specifications.
load_transform_args = [
"poetry",
Expand Down
84 changes: 45 additions & 39 deletions infra/api/database/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions infra/api/database/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ locals {

environment_config = module.app_config.environment_configs[var.environment_name]
database_config = local.environment_config.database_config
opensearch_config = local.environment_config.opensearch_config
}

terraform {
Expand Down Expand Up @@ -77,6 +78,26 @@ data "aws_security_groups" "aws_services" {
}
}

module "opensearch" {
count = local.opensearch_config != null ? 1 : 0

source = "../../modules/opensearch"

name = "${local.prefix}${var.environment_name}"
cidr_block = data.aws_vpc.network.cidr_block
environment_name = var.environment_name
multi_az_with_standby_enabled = local.opensearch_config.multi_az_with_standby_enabled
zone_awareness_enabled = local.opensearch_config.zone_awareness_enabled
dedicated_master_enabled = local.opensearch_config.dedicated_master_enabled
dedicated_master_count = local.opensearch_config.dedicated_master_count
dedicated_master_type = local.opensearch_config.dedicated_master_type
instance_count = local.opensearch_config.instance_count
instance_type = local.opensearch_config.instance_type
availability_zone_count = local.opensearch_config.availability_zone_count
subnet_ids = slice(data.aws_subnets.database.ids, 0, local.opensearch_config.dedicated_master_count)
vpc_id = data.aws_vpc.network.id
}

module "database" {
source = "../../modules/database"

Expand Down
72 changes: 72 additions & 0 deletions infra/modules/opensearch/authentication.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
resource "random_password" "opensearch_username" {
length = 16
min_lower = 1
min_upper = 1
min_numeric = 1
special = true
override_special = "-"
}

# The master password must be generated 5 ~ 10 times before you can get a master password that meets the requirements.
# This is because the master password cannot be fully configured to meet opensearch requirements. The error message
# you'll get is:
#
# ValidationException: The master user password must contain at least one uppercase letter, one lowercase letter,
# one number, and one special character.
#
# The password generated is supposed to meet these requirements, but for some reason it often doesn't.
# Thusly, we generate the password multiple times until we get one that meets the requirements.
# You can regenerate the password by running:
#
# terraform state rm "module.opensearch[0].random_password.opensearch_password"
resource "random_password" "opensearch_password" {
length = 16
min_lower = 1
min_upper = 1
min_numeric = 1
special = true
override_special = "-"
}

resource "aws_ssm_parameter" "opensearch_username" {
name = "/opensearch/${var.environment_name}/username"
description = "The username for the OpenSearch domain"
type = "SecureString"
value = random_password.opensearch_username.result

}

resource "aws_ssm_parameter" "opensearch_password" {
name = "/opensearch/${var.environment_name}/password"
description = "The password for the OpenSearch domain"
type = "SecureString"
value = random_password.opensearch_password.result
}

data "aws_iam_policy_document" "opensearch_access" {
statement {
principals {
type = "AWS"
identifiers = ["arn:aws:iam::315341936575:root"]
}
effect = "Allow"
actions = ["es:*"]
resources = ["arn:aws:es:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:domain/${var.environment_name}/*"]
}
}

data "aws_iam_policy_document" "opensearch_cloudwatch" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["es.amazonaws.com"]
}
actions = [
"logs:PutLogEvents",
"logs:PutLogEventsBatch",
"logs:CreateLogStream",
]
resources = ["arn:aws:logs:*"]
}
}
Loading
Loading