diff --git a/CHANGELOG.md b/CHANGELOG.md index 8393157..2a81d23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/README.md b/README.md index 5d82a6f..3e36b78 100644 --- a/README.md +++ b/README.md @@ -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 | @@ -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 | @@ -142,6 +147,7 @@ No modules. | [dynamodb\_table\_name](#input\_dynamodb\_table\_name) | Different DynamoDB table name to override default of var.name | `string` | `null` | no | | [enable\_sns](#input\_enable\_sns) | Enable use of SNS for reporting errors | `bool` | `false` | no | | [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 | +| [kms\_key\_name](#input\_kms\_key\_name) | Different KMS Key (for SNS and SQS) to override default of var.name | `string` | `null` | no | | [lambda\_environment\_variables](#input\_lambda\_environment\_variables) | Map of lambda environment variables and values | `map(string)` |
{
"DNS_RR_TimeToLive": 60,
"DynamoDBName": null,
"HeritageIdentifier": "dynr53",
"HeritageTXTRecordPrefix": "_txt",
"MaxApiRetry": 10,
"SleepTime": 60,
"SnsEnable": false,
"SnsTopicArn": "",
"TagKeyCname": "boc:dns:cname",
"TagKeyHostName": "boc:dns:name",
"TagKeyZone": "boc:dns:zone"
} | no |
| [lambda\_environment\_variables\_override](#input\_lambda\_environment\_variables\_override) | Map of lambda environment variables and values to override from the defaults | `map(string)` | `{}` | no |
| [lambda\_name](#input\_lambda\_name) | Different Lambda name to override default of var.name | `string` | `null` | no |
diff --git a/kms.tf b/kms.tf
new file mode 100644
index 0000000..e7dee95
--- /dev/null
+++ b/kms.tf
@@ -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
+# }
diff --git a/role.tf b/role.tf
index 3ea54f3..87d6c2d 100644
--- a/role.tf
+++ b/role.tf
@@ -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" {
diff --git a/sns.tf b/sns.tf
index 4a8e744..6335287 100644
--- a/sns.tf
+++ b/sns.tf
@@ -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" {
diff --git a/sqs.tf b/sqs.tf
index 8f18e3d..7b5df87 100644
--- a/sqs.tf
+++ b/sqs.tf
@@ -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(
@@ -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(
@@ -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 {
diff --git a/variables.tf b/variables.tf
index d98a927..d95a318 100644
--- a/variables.tf
+++ b/variables.tf
@@ -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)
diff --git a/version.tf b/version.tf
index c0869d8..d4b22ca 100644
--- a/version.tf
+++ b/version.tf
@@ -1,3 +1,3 @@
locals {
- _module_version = "0.2.4"
+ _module_version = "0.2.5"
}