-
Notifications
You must be signed in to change notification settings - Fork 40
Description
Is this related to an existing feature request or issue?
No response
What part of the Cloud Game Development Toolkit does this RFC relate to?
Modules
Summary
This RFC is to gain feedback on the current function of the versions of the toolkit, and to discuss the potential to add versioning to the Terraform modules that are within the toolkit.
Use case
The reasoning behind this suggestion is because currently there is no way to reference a specific version of any of the Terraform modules. We have the version of the toolkit, but there is no link between this and n number of changes that could take place to any of the modules.
Proposal
Currently the toolkit is on v1.1.3-alpha however, what does this mean for an end user? This project mentions "The Cloud Game Development Toolkit (a.k.a. CGD Toolkit) is a collection of templates and configurations for deploying game development infrastructure and tools on AWS." At its core, these templates are largely Terraform modules, since the goal of the project is to make it easier to deploy infrastructure. There are things like Packer templates, and Ansible playbooks as well. These can be consumed standalone, however it's my understanding that the typical expected usage is to use these in tandem with a Terraform module that would be provisioning the actual infrastructure in AWS.
However, currently there is no way for a user of the toolkit to reference a specific version of any of the Terraform modules. For example, assuming there is a request to add SES email support for Perforce Helix Swarm. If and when this is added to the Perforce module, how can a user effectively use this new enhancement that was added to the module?
In a standard Terraform module, this would be achieved by referencing the specific version of the module that adds the functionality. For those who do not desire to have this functionality, they could continue to use their current version of the module. The same applies for Terraform providers, such as the AWS Provider for Terraform. At the moment, when a new release of the toolkit is cut (e.g. v1.1.4-alpha), this can provide any number of changes to these Terraform modules (as well as the Packer templates, Ansible playbooks, etc.) however this is potentially destructive to the Terraform modules. This version of the toolkit has no relation to the version of any of the Terraform modules in a way that can be referenced by a Terraform user.
Recommendations
In addition to the version releases for the toolkit itself, I propose that we start to version the Terraform modules that are being developed in the toolkit. This will allow us to more effectively track changes that are made to these modules, align feature requests and the related completed PRs to the versions, and allow end users to reference specific versions of the modules as desired.
I propose that we standardize using the Terraform Registry and individual git repositories to host all of these modules for the following reasons:
1. Easier visibility, lifecycle management, and contributions
The Terraform Registry is the standard location Terraform developers go to to find modules that they can use. By using the registry, it is easy for developers to use specific versions of the module and the remote source of the registry itself. For example:
module "iam-identity-center" {
source = "aws-ia/iam-identity-center/aws"
version = "1.0.2"
}This also means that potential users who may have a use case for something in the toolkit but are not a direct game studio can also make use of the modules we are actively developing. This can increase the number of community contributions we receive and ultimately lead to advancements in the modules with less of a reliance on internal contributors.
For a data point, the AWS IAM Identity Center Terraform Module has ~50k downloads, and 2 of the most major changes were submitted by external contributors.
2. Enhanced usage tracking and alignment with project roadmap
Another benefit of the Terraform Registry is the usage metrics they provide. This is a clear data point that can be used to determine the most in demand modules, and prioritize adding new functionality based on this.
For example, take two modules released in the AWS-IA GitHub Org:
The AWS IAM Identity Center module was released almost a full calendar year after the AWS Amplify App module, however it has almost 50x more downloads in 50% of the time. For prioritization, it is clear which would take preference if both had a feature request.
Example Usage
module "perforce" {
source = "aws-games/perforce/aws"
version = "1.0.0"
}module "jenkins" {
source = "aws-games/jenkins/aws"
version = "1.0.0"
}module "teamcity" {
source = "aws-games/teamcity/aws"
version = "1.0.0"
}Out of scope
Anything that is not a Terraform module.
Potential challenges
A potential challenge is the method used for Terraform module versioning. Typically a Terraform module is contained to a single git repository. This can then be used as the source when storing the module in the Terraform Registry. To my understanding, one of the main reasons a single Terraform module should be used within a single git repo is because of git tags. These are what are used to tag commits and release new versions of the module. If continuing down the current path of keeping all Terraform modules within the core Cloud Game Development Toolkit repo, I do not think we will be able to add git tags to the modules that are in the subdirectory. And even if we were able to, a single Terraform module hosted on the Terraform Registry must be contained to a single git repository. As such, I propose that we break out the modules currently in the toolkit into individual standalone git repositories.
While this has the con of increasing the number of GitHub repos we deal with, I believe the pros outweigh the cons, especially for the end users. The toolkit can think reference these individual Git repositories for ease of visibility. For an example, see [AWS Labs] MCP(https://github.com/awslabs/mcp?tab=readme-ov-file).
Dependencies and Integrations
No response
Alternative solutions
Metadata
Metadata
Assignees
Labels
Type
Projects
Status