Skip to content
This repository was archived by the owner on Jan 16, 2025. It is now read-only.

Commit 0ba06c8

Browse files
authored
feat: Add Support for Alternative Partitions in ARNs (like govcloud) (#1815)
* arn partition is not always aws * correct typo * missed a variable handoff * missing CR at the end * updates to formatting and docs from tflint and terraform-docs
1 parent d3e6950 commit 0ba06c8

18 files changed

+53
-20
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ In case the setup does not work as intended follow the trace of events:
395395
|------|-------------|------|---------|:--------:|
396396
| <a name="input_ami_filter"></a> [ami\_filter](#input\_ami\_filter) | List of maps used to create the AMI filter for the action runner AMI. By default amazon linux 2 is used. | `map(list(string))` | `null` | no |
397397
| <a name="input_ami_owners"></a> [ami\_owners](#input\_ami\_owners) | The list of owners used to select the AMI of action runner instances. | `list(string)` | <pre>[<br> "amazon"<br>]</pre> | no |
398+
| <a name="input_aws_partition"></a> [aws\_partition](#input\_aws\_partition) | (optiona) partition in the arn namespace to use if not 'aws' | `string` | `"aws"` | no |
398399
| <a name="input_aws_region"></a> [aws\_region](#input\_aws\_region) | AWS region. | `string` | n/a | yes |
399400
| <a name="input_block_device_mappings"></a> [block\_device\_mappings](#input\_block\_device\_mappings) | The EC2 instance block device configuration. Takes the following keys: `device_name`, `delete_on_termination`, `volume_type`, `volume_size`, `encrypted`, `iops` | `map(string)` | `{}` | no |
400401
| <a name="input_cloudwatch_config"></a> [cloudwatch\_config](#input\_cloudwatch\_config) | (optional) Replaces the module default cloudwatch log config. See https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html for details. | `string` | `null` | no |

Diff for: main.tf

+6-5
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,12 @@ module "webhook" {
8383
module "runners" {
8484
source = "./modules/runners"
8585

86-
aws_region = var.aws_region
87-
vpc_id = var.vpc_id
88-
subnet_ids = var.subnet_ids
89-
environment = var.environment
90-
tags = local.tags
86+
aws_region = var.aws_region
87+
aws_partition = var.aws_partition
88+
vpc_id = var.vpc_id
89+
subnet_ids = var.subnet_ids
90+
environment = var.environment
91+
tags = local.tags
9192

9293
s3_bucket_runner_binaries = module.runner_binaries.bucket
9394
s3_location_runner_binaries = local.s3_action_runner_url

Diff for: modules/runners/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ yarn run dist
115115
|------|-------------|------|---------|:--------:|
116116
| <a name="input_ami_filter"></a> [ami\_filter](#input\_ami\_filter) | Map of lists used to create the AMI filter for the action runner AMI. | `map(list(string))` | `null` | no |
117117
| <a name="input_ami_owners"></a> [ami\_owners](#input\_ami\_owners) | The list of owners used to select the AMI of action runner instances. | `list(string)` | <pre>[<br> "amazon"<br>]</pre> | no |
118+
| <a name="input_aws_partition"></a> [aws\_partition](#input\_aws\_partition) | (optional) partition for the base arn if not 'aws' | `string` | `"aws"` | no |
118119
| <a name="input_aws_region"></a> [aws\_region](#input\_aws\_region) | AWS region. | `string` | n/a | yes |
119120
| <a name="input_block_device_mappings"></a> [block\_device\_mappings](#input\_block\_device\_mappings) | The EC2 instance block device configuration. Takes the following keys: `device_name`, `delete_on_termination`, `volume_type`, `volume_size`, `encrypted`, `iops` | `map(string)` | `{}` | no |
120121
| <a name="input_cloudwatch_config"></a> [cloudwatch\_config](#input\_cloudwatch\_config) | (optional) Replaces the module default cloudwatch log config. See https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html for details. | `string` | `null` | no |

Diff for: modules/runners/policies-runner.tf

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ resource "aws_iam_role_policy" "ssm_parameters" {
2626
role = aws_iam_role.runner.name
2727
policy = templatefile("${path.module}/policies/instance-ssm-parameters-policy.json",
2828
{
29-
arn_ssm_parameters_prefix = "arn:aws:ssm:${var.aws_region}:${data.aws_caller_identity.current.account_id}:parameter/${var.environment}-*"
30-
arn_ssm_parameters_path = "arn:aws:ssm:${var.aws_region}:${data.aws_caller_identity.current.account_id}:parameter/${var.environment}/*"
29+
arn_ssm_parameters_prefix = "arn:${var.aws_partition}:ssm:${var.aws_region}:${data.aws_caller_identity.current.account_id}:parameter/${var.environment}-*"
30+
arn_ssm_parameters_path = "arn:${var.aws_partition}:ssm:${var.aws_region}:${data.aws_caller_identity.current.account_id}:parameter/${var.environment}/*"
3131
}
3232
)
3333
}

Diff for: modules/runners/policies/service-linked-role-create-policy.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
{
55
"Effect": "Allow",
66
"Action": "iam:CreateServiceLinkedRole",
7-
"Resource": "arn:aws:iam::*:role/aws-service-role/*"
7+
"Resource": "arn:${aws_partition}:iam::*:role/aws-service-role/*"
88
}
99
]
1010
}

Diff for: modules/runners/pool.tf

+2
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,6 @@ module "pool" {
4444
tags = local.tags
4545
}
4646

47+
aws_partition = var.aws_partition
48+
4749
}

Diff for: modules/runners/pool/main.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ resource "aws_iam_role_policy" "pool_logging" {
8282
resource "aws_iam_role_policy_attachment" "pool_vpc_execution_role" {
8383
count = length(var.config.lambda.subnet_ids) > 0 ? 1 : 0
8484
role = aws_iam_role.pool.name
85-
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
85+
policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
8686
}
8787

8888
data "aws_iam_policy_document" "lambda_assume_role_policy" {

Diff for: modules/runners/pool/variables.tf

+6
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,9 @@ variable "config" {
5050
role_path = string
5151
})
5252
}
53+
54+
variable "aws_partition" {
55+
description = "(optional) partition for the arn if not 'aws'"
56+
type = string
57+
default = "aws"
58+
}

Diff for: modules/runners/scale-down.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,5 +97,5 @@ resource "aws_iam_role_policy" "scale_down_logging" {
9797
resource "aws_iam_role_policy_attachment" "scale_down_vpc_execution_role" {
9898
count = length(var.lambda_subnet_ids) > 0 ? 1 : 0
9999
role = aws_iam_role.scale_down.name
100-
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
100+
policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
101101
}

Diff for: modules/runners/scale-up.tf

+2-2
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ resource "aws_iam_role_policy" "service_linked_role" {
9999
count = var.create_service_linked_role_spot ? 1 : 0
100100
name = "${var.environment}-service_linked_role"
101101
role = aws_iam_role.scale_up.name
102-
policy = templatefile("${path.module}/policies/service-linked-role-create-policy.json", {})
102+
policy = templatefile("${path.module}/policies/service-linked-role-create-policy.json", { aws_partition = var.aws_partition })
103103
}
104104

105105
resource "aws_iam_role_policy_attachment" "scale_up_vpc_execution_role" {
106106
count = length(var.lambda_subnet_ids) > 0 ? 1 : 0
107107
role = aws_iam_role.scale_up.name
108-
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
108+
policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
109109
}

Diff for: modules/runners/variables.tf

+6
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,12 @@ variable "create_service_linked_role_spot" {
306306
default = false
307307
}
308308

309+
variable "aws_partition" {
310+
description = "(optional) partition for the base arn if not 'aws'"
311+
type = string
312+
default = "aws"
313+
}
314+
309315
variable "runner_iam_role_managed_policy_arns" {
310316
description = "Attach AWS or customer-managed IAM policies (by ARN) to the runner IAM role"
311317
type = list(string)

Diff for: modules/setup-iam-permissions/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ No modules.
7070
| Name | Description | Type | Default | Required |
7171
|------|-------------|------|---------|:--------:|
7272
| <a name="input_account_id"></a> [account\_id](#input\_account\_id) | The module allows to switch to the created role from the provided account id. | `string` | n/a | yes |
73+
| <a name="input_aws_partition"></a> [aws\_partition](#input\_aws\_partition) | (optional) partition in the arn namespace if not aws | `string` | `"aws"` | no |
7374
| <a name="input_environment"></a> [environment](#input\_environment) | A name that identifies the environment, used as prefix and for tagging. | `string` | n/a | yes |
7475
| <a name="input_namespaces"></a> [namespaces](#input\_namespaces) | The role will be only allowed to create roles, policies and instance profiles in the given namespace / path. All policies in the boundaries namespace cannot be modified by this role. | <pre>object({<br> boundary_namespace = string<br> role_namespace = string<br> policy_namespace = string<br> instance_profile_namespace = string<br> })</pre> | n/a | yes |
7576

Diff for: modules/setup-iam-permissions/main.tf

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ resource "aws_iam_role" "deploy" {
55

66
permissions_boundary = aws_iam_policy.deploy_boundary.arn
77
assume_role_policy = templatefile("${path.module}/policies/assume-role-for-account.json", {
8-
account_id = var.account_id
8+
account_id = var.account_id
9+
aws_partition = var.aws_partition
910
})
1011
}
1112

@@ -16,6 +17,7 @@ resource "aws_iam_policy" "boundary" {
1617
policy = templatefile("${path.module}/policies/boundary.json", {
1718
role_namespace = var.namespaces.role_namespace
1819
account_id = data.aws_caller_identity.current.account_id
20+
aws_partition = var.aws_partition
1921
})
2022
}
2123

@@ -44,5 +46,6 @@ resource "aws_iam_policy" "deploy_boundary" {
4446
instance_profile_namespace = var.namespaces.instance_profile_namespace
4547
boundary_namespace = var.namespaces.boundary_namespace
4648
permission_boundary = aws_iam_policy.boundary.arn
49+
aws_partition = var.aws_partition
4750
})
4851
}

Diff for: modules/setup-iam-permissions/policies/assume-role-for-account.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"Statement": [
44
{
55
"Action": "sts:AssumeRole",
6-
"Principal": { "AWS": "arn:aws:iam::${account_id}:root" },
6+
"Principal": { "AWS": "arn:${aws_partition}:iam::${account_id}:root" },
77
"Effect": "Allow",
88
"Sid": "",
99
"Condition": {

Diff for: modules/setup-iam-permissions/policies/boundary.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"Sid": "RoleInNamespace",
2222
"Effect": "Allow",
2323
"Action": ["iam:PassRole"],
24-
"Resource": "arn:aws:iam::${account_id}:role/${role_namespace}/*"
24+
"Resource": "arn:${aws_partition}:iam::${account_id}:role/${role_namespace}/*"
2525
},
2626
{
2727
"Sid": "Decrypt",

Diff for: modules/setup-iam-permissions/policies/deploy-boundary.json

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"iam:PutRolePermissionsBoundary",
1111
"iam:PutRolePolicy"
1212
],
13-
"Resource": "arn:aws:iam::${account_id}:role/${role_namespace}/*",
13+
"Resource": "arn:${aws_partition}:iam::${account_id}:role/${role_namespace}/*",
1414
"Condition": {
1515
"StringEquals": {
1616
"iam:PermissionsBoundary": "${permission_boundary}"
@@ -29,7 +29,7 @@
2929
"iam:DetachRolePolicy",
3030
"iam:DeleteRolePolicy"
3131
],
32-
"Resource": "arn:aws:iam::${account_id}:role/${role_namespace}/*"
32+
"Resource": "arn:${aws_partition}:iam::${account_id}:role/${role_namespace}/*"
3333
},
3434
{
3535
"Sid": "PolicyInNamespace",
@@ -42,7 +42,7 @@
4242
"iam:GetPolicyVersion",
4343
"iam:SetDefaultPolicyVersion"
4444
],
45-
"Resource": "arn:aws:iam::${account_id}:policy/${policy_namespace}/*"
45+
"Resource": "arn:${aws_partition}:iam::${account_id}:policy/${policy_namespace}/*"
4646
},
4747
{
4848
"Sid": "InstanceProfileInNamespace",
@@ -54,7 +54,7 @@
5454
"iam:AddRoleToInstanceProfile",
5555
"iam:GetInstanceProfile"
5656
],
57-
"Resource": "arn:aws:iam::${account_id}:instance-profile/${instance_profile_namespace}/*"
57+
"Resource": "arn:${aws_partition}:iam::${account_id}:instance-profile/${instance_profile_namespace}/*"
5858
},
5959
{
6060
"Sid": "IamListActions",
@@ -78,7 +78,7 @@
7878
"iam:DeletePolicyVersion",
7979
"iam:SetDefaultPolicyVersion"
8080
],
81-
"Resource": "arn:aws:iam::${account_id}:policy/${boundary_namespace}/*"
81+
"Resource": "arn:${aws_partition}:iam::${account_id}:policy/${boundary_namespace}/*"
8282
},
8383
{
8484
"Sid": "Services",

Diff for: modules/setup-iam-permissions/variables.tf

+6
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,9 @@ variable "account_id" {
1818
type = string
1919

2020
}
21+
22+
variable "aws_partition" {
23+
description = "(optional) partition in the arn namespace if not aws"
24+
type = string
25+
default = "aws"
26+
}

Diff for: variables.tf

+6
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,12 @@ variable "pool_config" {
586586
default = []
587587
}
588588

589+
variable "aws_partition" {
590+
description = "(optiona) partition in the arn namespace to use if not 'aws'"
591+
type = string
592+
default = "aws"
593+
}
594+
589595
variable "disable_runner_autoupdate" {
590596
description = "Disable the auto update of the github runner agent. Be-aware there is a grace period of 30 days, see also the [GitHub article](https://github.blog/changelog/2022-02-01-github-actions-self-hosted-runners-can-now-disable-automatic-updates/)"
591597
type = bool

0 commit comments

Comments
 (0)