Skip to content

add kms keys, use for sns and sqs #26

Merged
merged 5 commits into from
Mar 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,7 @@

* 0.2.4 -- 2022-03-28
- add code to enable sqs

* 0.2.5 -- 2022-03-29
- add kms.tf
- set CMS for sns, sqs, allow lambda to publish to sns
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ No modules.
| [aws_dynamodb_table.table](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/dynamodb_table) | resource |
| [aws_iam_role.role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
| [aws_iam_role_policy_attachment.role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
| [aws_kms_alias.key](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_alias) | resource |
| [aws_kms_key.key](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key) | resource |
| [aws_lambda_alias.lambda](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_alias) | resource |
| [aws_lambda_function.lambda](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource |
| [aws_lambda_permission.allow_cloudwatch](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource |
Expand All @@ -124,6 +126,9 @@ No modules.
| [aws_arn.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/arn) | data source |
| [aws_caller_identity.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source |
| [aws_iam_policy.lambda_policies](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy) | data source |
| [aws_iam_policy_document.empty](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
| [aws_iam_policy_document.key_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
| [aws_iam_policy_document.key_policy_combined](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
| [aws_iam_policy_document.lambda_assume](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
| [aws_iam_policy_document.lambda_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
| [aws_iam_policy_document.queue_sqs](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
Expand All @@ -142,6 +147,7 @@ No modules.
| <a name="input_dynamodb_table_name"></a> [dynamodb\_table\_name](#input\_dynamodb\_table\_name) | Different DynamoDB table name to override default of var.name | `string` | `null` | no |
| <a name="input_enable_sns"></a> [enable\_sns](#input\_enable\_sns) | Enable use of SNS for reporting errors | `bool` | `false` | no |
| <a name="input_enable_sqs"></a> [enable\_sqs](#input\_enable\_sqs) | Enable use of SQS for SNS to send errors. Requires the use of enable\_sns as well | `bool` | `false` | no |
| <a name="input_kms_key_name"></a> [kms\_key\_name](#input\_kms\_key\_name) | Different KMS Key (for SNS and SQS) to override default of var.name | `string` | `null` | no |
| <a name="input_lambda_environment_variables"></a> [lambda\_environment\_variables](#input\_lambda\_environment\_variables) | Map of lambda environment variables and values | `map(string)` | <pre>{<br> "DNS_RR_TimeToLive": 60,<br> "DynamoDBName": null,<br> "HeritageIdentifier": "dynr53",<br> "HeritageTXTRecordPrefix": "_txt",<br> "MaxApiRetry": 10,<br> "SleepTime": 60,<br> "SnsEnable": false,<br> "SnsTopicArn": "",<br> "TagKeyCname": "boc:dns:cname",<br> "TagKeyHostName": "boc:dns:name",<br> "TagKeyZone": "boc:dns:zone"<br>}</pre> | no |
| <a name="input_lambda_environment_variables_override"></a> [lambda\_environment\_variables\_override](#input\_lambda\_environment\_variables\_override) | Map of lambda environment variables and values to override from the defaults | `map(string)` | `{}` | no |
| <a name="input_lambda_name"></a> [lambda\_name](#input\_lambda\_name) | Different Lambda name to override default of var.name | `string` | `null` | no |
Expand Down
71 changes: 71 additions & 0 deletions kms.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
locals {
kms_name = var.kms_key_name != null ? var.kms_key_name : local.name
kms_key_name = format("%s%s", local._prefixes["kms"], local.kms_name)

kms_admin_root = format("arn:%v:iam::%v:root", data.aws_arn.current.partition, local.account_id)
# kms_admin_roles = compact(concat(local.kms_admin_root, var.kms_admin_roles))
kms_admin_roles = [local.kms_admin_root]
# kms_policy_document = length(var.kms_policy_document) > 0 ? var.kms_policy_document : data.aws_iam_policy_document.empty.json
kms_policy_document = data.aws_iam_policy_document.empty.json
}

# this only is used if we are creating the resources and SNS is enabled

resource "aws_kms_key" "key" {
count = var.create && var.enable_sns ? 1 : 0
description = "KMS CMK for ${local.kms_name}"
enable_key_rotation = true
policy = data.aws_iam_policy_document.key_policy_combined.json

tags = merge(
local.base_tags,
var.tags,
{ "Name" = local.kms_key_name },
)
}

resource "aws_kms_alias" "key" {
count = var.create && var.enable_sns ? 1 : 0
name = "alias/${local.kms_key_name}"
target_key_id = var.create && var.enable_sns ? aws_kms_key.key[0].key_id : null
}

data "aws_iam_policy_document" "key_policy" {
statement {
sid = "BuiltinKMSAdminRoles"
effect = "Allow"
actions = ["kms:*"]
principals {
type = "AWS"
identifiers = local.kms_admin_roles
}
resources = ["*"]
}
statement {
sid = "AllowSNS"
effect = "Allow"
actions = [
"kms:GenerateDataKey*",
"kms:Decrypt",
]
principals {
type = "Service"
identifiers = ["sns.amazonaws.com"]
}
resources = ["*"]
}
}

data "aws_iam_policy_document" "key_policy_combined" {
source_policy_documents = [
data.aws_iam_policy_document.key_policy.json,
local.kms_policy_document
]
}

data "aws_iam_policy_document" "empty" {}

# data "aws_kms_key" "incoming_key" {
# count = var.kms_key_arn == null ? 0 : 1
# key_id = var.kms_key_arn
# }
22 changes: 19 additions & 3 deletions role.tf
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,28 @@ data "aws_iam_policy_document" "lambda_policy" {
for_each = var.create && var.enable_sns ? toset(["1"]) : toset([])
iterator = s
content {
sid = "SNSLambdaAccess"
effect = "Allow"
actions = ["sns:Get*", "sns:Publish*"]
sid = "SNSLambdaAccess"
effect = "Allow"
actions = [
"sns:Get*",
"sns:Publish*",
]
resources = [var.create && var.enable_sns ? aws_sns_topic.topic[0].arn : ""]
}
}
dynamic "statement" {
for_each = var.create && var.enable_sns ? toset(["1"]) : toset([])
iterator = s
content {
sid = "AllowKMSforSNS"
effect = "Allow"
actions = [
"kms:GenerateDataKey*",
"kms:Decrypt",
]
resources = [var.create && var.enable_sns ? aws_kms_key.key[0].arn : ""]
}
}
}

data "aws_iam_policy_document" "lambda_assume" {
Expand Down
7 changes: 4 additions & 3 deletions sns.tf
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ locals {
}

resource "aws_sns_topic" "topic" {
count = var.create && var.enable_sns ? 1 : 0
name = local.sns_name
display_name = "dynr53"
count = var.create && var.enable_sns ? 1 : 0
name = local.sns_name
display_name = "dynr53"
kms_master_key_id = aws_kms_key.key[0].key_id
}

resource "aws_sns_topic_policy" "topic" {
Expand Down
9 changes: 5 additions & 4 deletions sqs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ resource "aws_sqs_queue" "queue_deadletter" {
receive_wait_time_seconds = 15
visibility_timeout_seconds = 3600

kms_master_key_id = "alias/aws/sqs"
kms_master_key_id = aws_kms_key.key[0].key_id
kms_data_key_reuse_period_seconds = 300

tags = merge(
Expand Down Expand Up @@ -71,7 +71,7 @@ resource "aws_sqs_queue" "queue" {
}
EOP

kms_master_key_id = "alias/aws/sqs"
kms_master_key_id = aws_kms_key.key[0].key_id
kms_data_key_reuse_period_seconds = 300

tags = merge(
Expand Down Expand Up @@ -100,8 +100,9 @@ data "aws_iam_policy_document" "queue_sqs" {
resources = [aws_sqs_queue.queue[0].arn]

principals {
type = "AWS"
identifiers = ["*"]
# type = "AWS"
type = "Service"
identifiers = ["sns.amazonaws.com"]
}

condition {
Expand Down
6 changes: 6 additions & 0 deletions variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ variable "sqs_queue_name" {
default = null
}

variable "kms_key_name" {
description = "Different KMS Key (for SNS and SQS) to override default of var.name"
type = string
default = null
}

variable "lambda_environment_variables" {
description = "Map of lambda environment variables and values"
type = map(string)
Expand Down
2 changes: 1 addition & 1 deletion version.tf
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
locals {
_module_version = "0.2.4"
_module_version = "0.2.5"
}