forked from cloudposse/terraform-aws-components
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: adds spacelift components (cloudposse#308)
- Loading branch information
Showing
26 changed files
with
906 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
# Component: `spacelift-worker-pool` | ||
|
||
This component is responsible for provisioning Spacelift worker pools. | ||
|
||
**NOTE**: By default, the autoscaling group is set to 0 instances. Sign into the target account and manually update the count. | ||
|
||
## Usage | ||
|
||
**Stack Level**: Regional | ||
|
||
Here's an example snippet for how to use this component. | ||
|
||
```yaml | ||
components: | ||
terraform: | ||
spacelift-worker-pool: | ||
settings: | ||
spacelift: | ||
workspace_enabled: true | ||
vars: | ||
ec2_instance_type: r5n.large | ||
ecr_account_name: corp | ||
spacelift_api_endpoint: https://<GITHUBORG>.app.spacelift.io | ||
spacelift_ami_id: ami-xxxyyyzzz | ||
spacelift_runner_image: <ACCOUNTID>.dkr.ecr.<REGION>.amazonaws.com/<INFRA_IMAGE>:latest | ||
``` | ||
## Configuration | ||
### Docker Image on ECR | ||
Build and tag a Docker image for this repository and push to ECR. Ensure the account where this component is deployed has read-only access to the ECR repository. | ||
### API Key | ||
Prior to deployment, the API key must exist in SSM. | ||
To generate the key, please follow [these instructions](https://docs.spacelift.io/integrations/api#api-key-management). Once generated, write the API key ID and secret to the SSM key store at the following locations within the same AWS account and region where the Spacelift worker pool will reside. | ||
| Key | SSM Path | Type | | ||
|---------|-------------------------|----------------| | ||
| API Key | `/spacelift/key_id` | `SecureString` | | ||
| API ID | `/spacelift/key_secret` | `SecureString` | | ||
|
||
_HINT_: The API key ID is displayed as an upper-case, 16-character alphanumeric value next to the key name in the API key list. | ||
|
||
<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK --> | ||
## Requirements | ||
|
||
| Name | Version | | ||
|------|---------| | ||
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | ~> 0.14.0 | | ||
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | ~> 3.0 | | ||
| <a name="requirement_local"></a> [local](#requirement\_local) | ~> 1.3 | | ||
| <a name="requirement_spacelift"></a> [spacelift](#requirement\_spacelift) | ~> 1.0.0 | | ||
| <a name="requirement_template"></a> [template](#requirement\_template) | ~> 2.0 | | ||
|
||
## Providers | ||
|
||
| Name | Version | | ||
|------|---------| | ||
| <a name="provider_aws"></a> [aws](#provider\_aws) | ~> 3.0 | | ||
| <a name="provider_spacelift"></a> [spacelift](#provider\_spacelift) | ~> 1.0.0 | | ||
|
||
## Modules | ||
|
||
| Name | Source | Version | | ||
|------|--------|---------| | ||
| <a name="module_account_map"></a> [account\_map](#module\_account\_map) | cloudposse/stack-config/yaml//modules/remote-state | 0.13.0 | | ||
| <a name="module_ecr"></a> [ecr](#module\_ecr) | cloudposse/stack-config/yaml//modules/remote-state | 0.14.0 | | ||
| <a name="module_iam_roles"></a> [iam\_roles](#module\_iam\_roles) | ../account-map/modules/iam-roles | | | ||
| <a name="module_spacelift_ec2_workerpool"></a> [spacelift\_ec2\_workerpool](#module\_spacelift\_ec2\_workerpool) | spacelift.io/spacelift-io/spacelift-workerpool-on-ec2/aws | 1.0.0 | | ||
| <a name="module_this"></a> [this](#module\_this) | cloudposse/label/null | 0.24.1 | | ||
| <a name="module_vpc"></a> [vpc](#module\_vpc) | cloudposse/stack-config/yaml//modules/remote-state | 0.13.0 | | ||
|
||
## Resources | ||
|
||
| Name | Type | | ||
|------|------| | ||
| [aws_iam_role_policy.spacelift_role_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | ||
| [aws_security_group.spacelift](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource | | ||
|
||
| spacelift_worker_pool.primary | resource | | ||
| [aws_iam_policy_document.spacelift_role_policy_document](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source | | ||
| [aws_ssm_parameter.spacelift_key_id](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ssm_parameter) | data source | | ||
| [aws_ssm_parameter.spacelift_key_secret](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ssm_parameter) | data source | | ||
|
||
## Inputs | ||
|
||
| Name | Description | Type | Default | Required | | ||
|------|-------------|------|---------|:--------:| | ||
| <a name="input_account_map_environment_name"></a> [account\_map\_environment\_name](#input\_account\_map\_environment\_name) | The name of the environment where `account_map` is provisioned | `string` | `"gbl"` | no | | ||
| <a name="input_account_map_stage_name"></a> [account\_map\_stage\_name](#input\_account\_map\_stage\_name) | The name of the stage where `account_map` is provisioned | `string` | `"root"` | no | | ||
| <a name="input_account_number"></a> [account\_number](#input\_account\_number) | AWS account number for the target account (where resources are being created) | `string` | `null` | no | | ||
| <a name="input_additional_tag_map"></a> [additional\_tag\_map](#input\_additional\_tag\_map) | Additional tags for appending to tags\_as\_list\_of\_maps. Not added to `tags`. | `map(string)` | `{}` | no | | ||
| <a name="input_attributes"></a> [attributes](#input\_attributes) | Additional attributes (e.g. `1`) | `list(string)` | `[]` | no | | ||
| <a name="input_context"></a> [context](#input\_context) | Single object for setting entire context at once.<br>See description of individual variables for details.<br>Leave string and numeric variables as `null` to use default value.<br>Individual variable settings (non-null) override settings in context object,<br>except for attributes, tags, and additional\_tag\_map, which are merged. | <pre>object({<br> enabled = bool<br> namespace = string<br> environment = string<br> stage = string<br> name = string<br> delimiter = string<br> attributes = list(string)<br> tags = map(string)<br> additional_tag_map = map(string)<br> regex_replace_chars = string<br> label_order = list(string)<br> id_length_limit = number<br> })</pre> | <pre>{<br> "additional_tag_map": {},<br> "attributes": [],<br> "delimiter": null,<br> "enabled": true,<br> "environment": null,<br> "id_length_limit": null,<br> "label_order": [],<br> "name": null,<br> "namespace": null,<br> "regex_replace_chars": null,<br> "stage": null,<br> "tags": {}<br>}</pre> | no | | ||
| <a name="input_delimiter"></a> [delimiter](#input\_delimiter) | Delimiter to be used between `namespace`, `environment`, `stage`, `name` and `attributes`.<br>Defaults to `-` (hyphen). Set to `""` to use no delimiter at all. | `string` | `null` | no | | ||
| <a name="input_ec2_instance_type"></a> [ec2\_instance\_type](#input\_ec2\_instance\_type) | EC2 instance type to use for workers | `string` | `"t3.micro"` | no | | ||
| <a name="input_ecr_account_name"></a> [ecr\_account\_name](#input\_ecr\_account\_name) | Name of the AWS account that contains the ECR infrastructure repo | `string` | n/a | yes | | ||
| <a name="input_ecr_repo_name"></a> [ecr\_repo\_name](#input\_ecr\_repo\_name) | Name of the ECR repo containing the infrastructure image | `string` | n/a | yes | | ||
| <a name="input_enabled"></a> [enabled](#input\_enabled) | Set to false to prevent the module from creating any resources | `bool` | `null` | no | | ||
| <a name="input_environment"></a> [environment](#input\_environment) | Environment, e.g. 'uw2', 'us-west-2', OR 'prod', 'staging', 'dev', 'UAT' | `string` | `null` | no | | ||
| <a name="input_id_length_limit"></a> [id\_length\_limit](#input\_id\_length\_limit) | Limit `id` to this many characters.<br>Set to `0` for unlimited length.<br>Set to `null` for default, which is `0`.<br>Does not affect `id_full`. | `number` | `null` | no | | ||
| <a name="input_import_profile_name"></a> [import\_profile\_name](#input\_import\_profile\_name) | AWS Profile name to use when importing a resource | `string` | `null` | no | | ||
| <a name="input_label_order"></a> [label\_order](#input\_label\_order) | The naming order of the id output and Name tag.<br>Defaults to ["namespace", "environment", "stage", "name", "attributes"].<br>You can omit any of the 5 elements, but at least one must be present. | `list(string)` | `null` | no | | ||
| <a name="input_name"></a> [name](#input\_name) | Solution name, e.g. 'app' or 'jenkins' | `string` | `null` | no | | ||
| <a name="input_namespace"></a> [namespace](#input\_namespace) | Namespace, which could be your organization name or abbreviation, e.g. 'eg' or 'cp' | `string` | `null` | no | | ||
| <a name="input_regex_replace_chars"></a> [regex\_replace\_chars](#input\_regex\_replace\_chars) | Regex to replace chars with empty string in `namespace`, `environment`, `stage` and `name`.<br>If not set, `"/[^a-zA-Z0-9-]/"` is used to remove all characters other than hyphens, letters and digits. | `string` | `null` | no | | ||
| <a name="input_region"></a> [region](#input\_region) | AWS Region | `string` | n/a | yes | | ||
| <a name="input_region_availability_zones"></a> [region\_availability\_zones](#input\_region\_availability\_zones) | List of availability zones in region, to be used as default when `availability_zones` is not supplied | `list(string)` | `[]` | no | | ||
| <a name="input_spacelift_ami_id"></a> [spacelift\_ami\_id](#input\_spacelift\_ami\_id) | AMI id of Spacelift worker pool image | `string` | n/a | yes | | ||
| <a name="input_spacelift_api_endpoint"></a> [spacelift\_api\_endpoint](#input\_spacelift\_api\_endpoint) | The Spacelift API endpoint URL (e.g. https://example.app.spacelift.io) | `string` | n/a | yes | | ||
| <a name="input_spacelift_runner_image"></a> [spacelift\_runner\_image](#input\_spacelift\_runner\_image) | Location of ECR image to use for Spacelift | `string` | n/a | yes | | ||
| <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_subnet_type_tag_key"></a> [subnet\_type\_tag\_key](#input\_subnet\_type\_tag\_key) | Key for subnet type tag to provide information about the type of subnets, e.g. `cpco/subnet/type=private` or `cpco/subnet/type=public` | `string` | `null` | no | | ||
| <a name="input_tags"></a> [tags](#input\_tags) | Additional tags (e.g. `map('BusinessUnit','XYZ')` | `map(string)` | `{}` | no | | ||
|
||
## Outputs | ||
|
||
| Name | Description | | ||
|------|-------------| | ||
| <a name="output_spacelift_role_policy_id"></a> [spacelift\_role\_policy\_id](#output\_spacelift\_role\_policy\_id) | n/a | | ||
| <a name="output_spacelift_role_policy_name"></a> [spacelift\_role\_policy\_name](#output\_spacelift\_role\_policy\_name) | n/a | | ||
| <a name="output_worker_pool_id"></a> [worker\_pool\_id](#output\_worker\_pool\_id) | n/a | | ||
| <a name="output_worker_pool_name"></a> [worker\_pool\_name](#output\_worker\_pool\_name) | n/a | | ||
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK --> | ||
|
||
## References | ||
|
||
- [cloudposse/terraform-spacelift-cloud-infrastructure-automation](https://github.com/cloudposse/terraform-spacelift-cloud-infrastructure-automation) - Cloud Posse's related upstream component | ||
|
||
[<img src="https://cloudposse.com/logo-300x69.svg" height="32" align="right"/>](https://cpco.io/component) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
# | ||
# ONLY EDIT THIS FILE IN github.com/cloudposse/terraform-null-label | ||
# All other instances of this file should be a copy of that one | ||
# | ||
# | ||
# Copy this file from https://github.com/cloudposse/terraform-null-label/blob/master/exports/context.tf | ||
# and then place it in your Terraform module to automatically get | ||
# Cloud Posse's standard configuration inputs suitable for passing | ||
# to Cloud Posse modules. | ||
# | ||
# Modules should access the whole context as `module.this.context` | ||
# to get the input variables with nulls for defaults, | ||
# for example `context = module.this.context`, | ||
# and access individual variables as `module.this.<var>`, | ||
# with final values filled in. | ||
# | ||
# For example, when using defaults, `module.this.context.delimiter` | ||
# will be null, and `module.this.delimiter` will be `-` (hyphen). | ||
# | ||
|
||
module "this" { | ||
source = "cloudposse/label/null" | ||
version = "0.24.1" | ||
|
||
enabled = var.enabled | ||
namespace = var.namespace | ||
environment = var.environment | ||
stage = var.stage | ||
name = var.name | ||
delimiter = var.delimiter | ||
attributes = var.attributes | ||
tags = var.tags | ||
additional_tag_map = var.additional_tag_map | ||
label_order = var.label_order | ||
regex_replace_chars = var.regex_replace_chars | ||
id_length_limit = var.id_length_limit | ||
|
||
context = var.context | ||
} | ||
|
||
# Copy contents of cloudposse/terraform-null-label/variables.tf here | ||
|
||
variable "context" { | ||
type = object({ | ||
enabled = bool | ||
namespace = string | ||
environment = string | ||
stage = string | ||
name = string | ||
delimiter = string | ||
attributes = list(string) | ||
tags = map(string) | ||
additional_tag_map = map(string) | ||
regex_replace_chars = string | ||
label_order = list(string) | ||
id_length_limit = number | ||
}) | ||
default = { | ||
enabled = true | ||
namespace = null | ||
environment = null | ||
stage = null | ||
name = null | ||
delimiter = null | ||
attributes = [] | ||
tags = {} | ||
additional_tag_map = {} | ||
regex_replace_chars = null | ||
label_order = [] | ||
id_length_limit = null | ||
} | ||
description = <<-EOT | ||
Single object for setting entire context at once. | ||
See description of individual variables for details. | ||
Leave string and numeric variables as `null` to use default value. | ||
Individual variable settings (non-null) override settings in context object, | ||
except for attributes, tags, and additional_tag_map, which are merged. | ||
EOT | ||
} | ||
|
||
variable "enabled" { | ||
type = bool | ||
default = null | ||
description = "Set to false to prevent the module from creating any resources" | ||
} | ||
|
||
variable "namespace" { | ||
type = string | ||
default = null | ||
description = "Namespace, which could be your organization name or abbreviation, e.g. 'eg' or 'cp'" | ||
} | ||
|
||
variable "environment" { | ||
type = string | ||
default = null | ||
description = "Environment, e.g. 'uw2', 'us-west-2', OR 'prod', 'staging', 'dev', 'UAT'" | ||
} | ||
|
||
variable "stage" { | ||
type = string | ||
default = null | ||
description = "Stage, e.g. 'prod', 'staging', 'dev', OR 'source', 'build', 'test', 'deploy', 'release'" | ||
} | ||
|
||
variable "name" { | ||
type = string | ||
default = null | ||
description = "Solution name, e.g. 'app' or 'jenkins'" | ||
} | ||
|
||
variable "delimiter" { | ||
type = string | ||
default = null | ||
description = <<-EOT | ||
Delimiter to be used between `namespace`, `environment`, `stage`, `name` and `attributes`. | ||
Defaults to `-` (hyphen). Set to `""` to use no delimiter at all. | ||
EOT | ||
} | ||
|
||
variable "attributes" { | ||
type = list(string) | ||
default = [] | ||
description = "Additional attributes (e.g. `1`)" | ||
} | ||
|
||
variable "tags" { | ||
type = map(string) | ||
default = {} | ||
description = "Additional tags (e.g. `map('BusinessUnit','XYZ')`" | ||
} | ||
|
||
variable "additional_tag_map" { | ||
type = map(string) | ||
default = {} | ||
description = "Additional tags for appending to tags_as_list_of_maps. Not added to `tags`." | ||
} | ||
|
||
variable "label_order" { | ||
type = list(string) | ||
default = null | ||
description = <<-EOT | ||
The naming order of the id output and Name tag. | ||
Defaults to ["namespace", "environment", "stage", "name", "attributes"]. | ||
You can omit any of the 5 elements, but at least one must be present. | ||
EOT | ||
} | ||
|
||
variable "regex_replace_chars" { | ||
type = string | ||
default = null | ||
description = <<-EOT | ||
Regex to replace chars with empty string in `namespace`, `environment`, `stage` and `name`. | ||
If not set, `"/[^a-zA-Z0-9-]/"` is used to remove all characters other than hyphens, letters and digits. | ||
EOT | ||
} | ||
|
||
variable "id_length_limit" { | ||
type = number | ||
default = null | ||
description = <<-EOT | ||
Limit `id` to this many characters. | ||
Set to `0` for unlimited length. | ||
Set to `null` for default, which is `0`. | ||
Does not affect `id_full`. | ||
EOT | ||
} | ||
|
||
#### End of copy of cloudposse/terraform-null-label/variables.tf |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
name = "spacelift-worker-pool" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# The variables are defined in the global Terraform configurations | ||
# and Terraform complains if they are not defined in the module. | ||
|
||
variable "region_availability_zones" { | ||
type = list(string) | ||
default = [] | ||
description = "List of availability zones in region, to be used as default when `availability_zones` is not supplied" | ||
} | ||
|
||
variable "subnet_type_tag_key" { | ||
type = string | ||
default = null | ||
description = "Key for subnet type tag to provide information about the type of subnets, e.g. `cpco/subnet/type=private` or `cpco/subnet/type=public`" | ||
} | ||
|
||
variable "account_number" { | ||
type = string | ||
default = null | ||
description = "AWS account number for the target account (where resources are being created)" | ||
} |
Oops, something went wrong.