Skip to content

Add ssm patch support #104

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

Merged
merged 53 commits into from
Jul 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
294928e
Adding SSM patch support
jamengual Jun 22, 2021
053ceae
Auto Format
cloudpossebot Jun 22, 2021
6133cbf
remove uneeded change
jamengual Jun 22, 2021
7eac546
Merge branch 'add_ssm_patch_support' of github.com:cloudposse/terrafo…
jamengual Jun 22, 2021
ad03b75
remove uneeded change
jamengual Jun 22, 2021
2b17d4e
Auto Format
cloudpossebot Jun 22, 2021
9219b10
Update main.tf
jamengual Jun 22, 2021
193d691
Update main.tf
jamengual Jun 22, 2021
07de895
Update variables.tf
jamengual Jun 22, 2021
9f1088c
Auto Format
cloudpossebot Jun 22, 2021
9f00bf2
Update main.tf
jamengual Jun 22, 2021
1a98cd1
Update main.tf
jamengual Jun 22, 2021
1edc0a8
Adding SSM patch support
jamengual Jun 22, 2021
b798e3a
Update main.tf
jamengual Jun 22, 2021
336799f
Auto Format
cloudpossebot Jun 22, 2021
7894217
Fixinf var name
jamengual Jun 22, 2021
271fe61
Fixinf var name
jamengual Jun 22, 2021
16ab864
Merge branch 'add_ssm_patch_support' of github.com:cloudposse/terrafo…
jamengual Jun 22, 2021
d4901ac
Fixing variable name for count
jamengual Jun 22, 2021
d52b935
Fixing variable name for count and adding label module + attribute
jamengual Jun 22, 2021
f60e8af
Auto Format
cloudpossebot Jun 22, 2021
c50f64b
Update main.tf
jamengual Jun 23, 2021
0ed01c4
Update main.tf
jamengual Jun 23, 2021
ebe00ab
Minor fixes
jamengual Jun 23, 2021
5b0e320
Fixing broken resource reference
jamengual Jun 27, 2021
143adf9
Fixing broken resource reference
jamengual Jun 27, 2021
c6007a7
Adding ssm_enabled variable
jamengual Jun 28, 2021
bf5a548
Auto Format
cloudpossebot Jun 28, 2021
9a1f4d5
removing ssm locals
jamengual Jun 28, 2021
4249afd
Merge branch 'add_ssm_patch_support' of github.com:cloudposse/terrafo…
jamengual Jun 28, 2021
d7bb430
Fixing count logic
jamengual Jun 28, 2021
e33737d
Auto Format
cloudpossebot Jun 28, 2021
ee6f944
Fixing count logic
jamengual Jun 28, 2021
b56b7b7
Fixing count logic
jamengual Jun 28, 2021
9a6d909
Fixing count logic
jamengual Jun 28, 2021
caad396
Fixing count logic
jamengual Jun 28, 2021
e6d3961
Fixing count logic
jamengual Jun 28, 2021
65f5dde
Update ssm_patch.tf
jamengual Jun 30, 2021
957753b
Update main.tf
jamengual Jun 30, 2021
a2d0b29
Update variables.tf
jamengual Jun 30, 2021
2799d5a
Update variables.tf
jamengual Jun 30, 2021
c9722d4
Auto Format
cloudpossebot Jun 30, 2021
2971069
more feedback fixes
jamengual Jun 30, 2021
660fba9
Merge branch 'add_ssm_patch_support' of github.com:cloudposse/terrafo…
jamengual Jun 30, 2021
b36d99e
more doc fixes
jamengual Jun 30, 2021
59dfce4
Removing duplicated resources
jamengual Jun 30, 2021
f146d74
Update ssm_patch.tf
jamengual Jul 1, 2021
f41d16a
Auto Format
cloudpossebot Jul 1, 2021
a740fa2
Addressing Feedback
jamengual Jul 1, 2021
dea8bb4
Merge branch 'add_ssm_patch_support' of github.com:cloudposse/terrafo…
jamengual Jul 1, 2021
10f2467
Auto Format
cloudpossebot Jul 1, 2021
99c9d8f
fixing local name
jamengual Jul 1, 2021
19fa1cf
reverting logic from master
jamengual Jul 2, 2021
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ Available targets:
| <a name="input_source_dest_check"></a> [source\_dest\_check](#input\_source\_dest\_check) | Controls if traffic is routed to the instance when the destination address does not match the instance. Used for NAT or VPNs | `bool` | `true` | no |
| <a name="input_ssh_key_pair"></a> [ssh\_key\_pair](#input\_ssh\_key\_pair) | SSH key pair to be provisioned on the instance | `string` | n/a | yes |
| <a name="input_ssm_patch_manager_enabled"></a> [ssm\_patch\_manager\_enabled](#input\_ssm\_patch\_manager\_enabled) | Whether to enable SSM Patch manager | `bool` | `false` | no |
| <a name="input_ssm_patch_manager_iam_policy"></a> [ssm\_patch\_manager\_iam\_policy](#input\_ssm\_patch\_manager\_iam\_policy) | IAM policy to allow Patch manager to manage the instance | `string` | `null` | no |
| <a name="input_ssm_patch_manager_iam_policy_arn"></a> [ssm\_patch\_manager\_iam\_policy\_arn](#input\_ssm\_patch\_manager\_iam\_policy\_arn) | IAM policy ARN to allow Patch Manager to manage the instance. If not provided, `arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore` will be used | `string` | `null` | no |
| <a name="input_ssm_patch_manager_s3_log_bucket"></a> [ssm\_patch\_manager\_s3\_log\_bucket](#input\_ssm\_patch\_manager\_s3\_log\_bucket) | The name of the s3 bucket to export the patch log to | `string` | `null` | no |
| <a name="input_stage"></a> [stage](#input\_stage) | Stage, e.g. 'prod', 'staging', 'dev', OR 'source', 'build', 'test', 'deploy', 'release' | `string` | `null` | no |
| <a name="input_statistic_level"></a> [statistic\_level](#input\_statistic\_level) | The statistic to apply to the alarm's associated metric. Allowed values are: SampleCount, Average, Sum, Minimum, Maximum | `string` | `"Maximum"` | no |
Expand Down
2 changes: 1 addition & 1 deletion docs/terraform.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@
| <a name="input_source_dest_check"></a> [source\_dest\_check](#input\_source\_dest\_check) | Controls if traffic is routed to the instance when the destination address does not match the instance. Used for NAT or VPNs | `bool` | `true` | no |
| <a name="input_ssh_key_pair"></a> [ssh\_key\_pair](#input\_ssh\_key\_pair) | SSH key pair to be provisioned on the instance | `string` | n/a | yes |
| <a name="input_ssm_patch_manager_enabled"></a> [ssm\_patch\_manager\_enabled](#input\_ssm\_patch\_manager\_enabled) | Whether to enable SSM Patch manager | `bool` | `false` | no |
| <a name="input_ssm_patch_manager_iam_policy"></a> [ssm\_patch\_manager\_iam\_policy](#input\_ssm\_patch\_manager\_iam\_policy) | IAM policy to allow Patch manager to manage the instance | `string` | `null` | no |
| <a name="input_ssm_patch_manager_iam_policy_arn"></a> [ssm\_patch\_manager\_iam\_policy\_arn](#input\_ssm\_patch\_manager\_iam\_policy\_arn) | IAM policy ARN to allow Patch Manager to manage the instance. If not provided, `arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore` will be used | `string` | `null` | no |
| <a name="input_ssm_patch_manager_s3_log_bucket"></a> [ssm\_patch\_manager\_s3\_log\_bucket](#input\_ssm\_patch\_manager\_s3\_log\_bucket) | The name of the s3 bucket to export the patch log to | `string` | `null` | no |
| <a name="input_stage"></a> [stage](#input\_stage) | Stage, e.g. 'prod', 'staging', 'dev', OR 'source', 'build', 'test', 'deploy', 'release' | `string` | `null` | no |
| <a name="input_statistic_level"></a> [statistic\_level](#input\_statistic\_level) | The statistic to apply to the alarm's associated metric. Allowed values are: SampleCount, Average, Sum, Minimum, Maximum | `string` | `"Maximum"` | no |
Expand Down
49 changes: 0 additions & 49 deletions main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ locals {
var.associate_public_ip_address && var.assign_eip_address && module.this.enabled ?
local.eip_public_dns : join("", aws_instance.default.*.public_dns)
)
ssm_path_log_bucket_enabled = local.enabled && var.ssm_patch_manager_enabled && var.ssm_patch_manager_s3_log_bucket != "" && var.ssm_patch_manager_s3_log_bucket != null
ssm_policy = var.ssm_patch_manager_iam_policy == null || var.ssm_patch_manager_iam_policy == "" ? "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" : var.ssm_patch_manager_iam_policy
}

data "aws_caller_identity" "default" {
Expand Down Expand Up @@ -53,40 +51,6 @@ data "aws_iam_policy_document" "default" {
effect = "Allow"
}
}

module "label_ssm_patch_s3_log_policy" {
source = "cloudposse/label/null"
version = "0.24.1"

attributes = ["ssm-patch-s3-logs"]
context = module.this.context
}

data "aws_iam_policy_document" "ssm_patch_s3_log_policy" {
count = local.ssm_path_log_bucket_enabled ? 1 : 0
statement {
sid = "AllowAccessToPathLogBucket"
actions = [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetEncryptionConfiguration",
]
resources = [
"arn:aws:s3:::${var.ssm_patch_manager_s3_log_bucket}/*",
"arn:aws:s3:::${var.ssm_patch_manager_s3_log_bucket}",
]
}
}

resource "aws_iam_policy" "ssm_patch_s3_log_policy" {
count = local.ssm_path_log_bucket_enabled ? 1 : 0
name = module.label_ssm_patch_s3_log_policy.id
path = "/"
description = "Policy to allow the local SSM agent on the instance to write the log output to the defined bucket"
policy = data.aws_iam_policy_document.ssm_patch_s3_log_policy[0].json
}

data "aws_ami" "default" {
count = var.ami == "" ? 1 : 0
most_recent = "true"
Expand Down Expand Up @@ -142,19 +106,6 @@ resource "aws_iam_role" "default" {
tags = module.this.tags
}

resource "aws_iam_role_policy_attachment" "ssm_core" {
count = local.enabled ? local.instance_profile_count : 0
role = aws_iam_role.default[count.index]
policy_arn = local.ssm_policy
}

resource "aws_iam_role_policy_attachment" "ssm_s3_policy" {
count = local.enabled && local.ssm_path_log_bucket_enabled ? local.instance_profile_count : 0
role = aws_iam_role.default[count.index]
policy_arn = aws_iam_policy.ssm_patch_s3_log_policy[0].arn
}


resource "aws_instance" "default" {
#bridgecrew:skip=BC_AWS_GENERAL_31: Skipping `Ensure Instance Metadata Service Version 1 is not enabled` check until BridgeCrew supports conditional evaluation. See https://github.com/bridgecrewio/checkov/issues/793
#bridgecrew:skip=BC_AWS_NETWORKING_47: Skiping `Ensure AWS EC2 instance is configured with VPC` because it is incorrectly flagging that this instance does not belong to a VPC even though subnet_id is configured.
Expand Down
53 changes: 53 additions & 0 deletions ssm_patch.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@

locals {
ssm_patch_log_bucket_enabled = local.ssm_enabled && var.ssm_patch_manager_s3_log_bucket != "" && var.ssm_patch_manager_s3_log_bucket != null
ssm_policy_arn = var.ssm_patch_manager_iam_policy_arn == null || var.ssm_patch_manager_iam_policy_arn == "" ? "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" : var.ssm_patch_manager_iam_policy_arn
ssm_enabled = local.enabled && var.ssm_patch_manager_enabled
}

module "label_ssm_patch_s3_log_policy" {
source = "cloudposse/label/null"
version = "0.24.1"

enabled = local.ssm_patch_log_bucket_enabled
attributes = ["ssm-patch-s3-logs"]
context = module.this.context
}

data "aws_iam_policy_document" "ssm_patch_s3_log_policy" {
count = local.ssm_patch_log_bucket_enabled ? 1 : 0
statement {
sid = "AllowAccessToPathLogBucket"
actions = [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetEncryptionConfiguration",
]
resources = [
"arn:aws:s3:::${var.ssm_patch_manager_s3_log_bucket}/*",
"arn:aws:s3:::${var.ssm_patch_manager_s3_log_bucket}",
]
}
}

resource "aws_iam_policy" "ssm_patch_s3_log_policy" {
count = local.ssm_patch_log_bucket_enabled ? 1 : 0
name = module.label_ssm_patch_s3_log_policy.id
path = "/"
description = "Policy to allow the local SSM agent on the instance to write the log output to the defined bucket"
policy = data.aws_iam_policy_document.ssm_patch_s3_log_policy[0].json
}


resource "aws_iam_role_policy_attachment" "ssm_core" {
count = local.ssm_enabled ? local.instance_profile_count : 0
role = aws_iam_role.default[count.index].name
policy_arn = local.ssm_policy_arn
}

resource "aws_iam_role_policy_attachment" "ssm_s3_policy" {
count = local.ssm_patch_log_bucket_enabled ? local.instance_profile_count : 0
role = aws_iam_role.default[count.index].name
policy_arn = aws_iam_policy.ssm_patch_s3_log_policy[0].arn
}
5 changes: 3 additions & 2 deletions variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -326,14 +326,15 @@ variable "ssm_patch_manager_enabled" {
description = "Whether to enable SSM Patch manager"
}

variable "ssm_patch_manager_iam_policy" {
variable "ssm_patch_manager_iam_policy_arn" {
type = string
default = null
description = "IAM policy to allow Patch manager to manage the instance"
description = "IAM policy ARN to allow Patch Manager to manage the instance. If not provided, `arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore` will be used"
}

variable "ssm_patch_manager_s3_log_bucket" {
type = string
default = null
description = "The name of the s3 bucket to export the patch log to"
}