Skip to content

Commit

Permalink
docs(Perforce): Updating documentation for Perforce Complete example …
Browse files Browse the repository at this point in the history
…reference architecture
  • Loading branch information
henrykie committed Dec 12, 2024
1 parent 865283b commit 5da657e
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 6 deletions.
103 changes: 103 additions & 0 deletions docs/media/diagrams/perforce_complete_example.drawio
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<mxfile host="Electron" modified="2024-12-12T23:19:31.827Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.0.2 Chrome/114.0.5735.289 Electron/25.8.4 Safari/537.36" etag="BnUOjSSJ1oD5UVPat3Zl" version="22.0.2" type="device">
<diagram name="Page-1" id="q_XiVphevz-c0kLlP5f9">
<mxGraphModel dx="1103" dy="698" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="z3quKmZYuvxo1gOoUY7u-1" value="Perforce VPC" style="points=[[0,0],[0.25,0],[0.5,0],[0.75,0],[1,0],[1,0.25],[1,0.5],[1,0.75],[1,1],[0.75,1],[0.5,1],[0.25,1],[0,1],[0,0.75],[0,0.5],[0,0.25]];outlineConnect=0;gradientColor=none;html=1;whiteSpace=wrap;fontSize=12;fontStyle=0;container=1;pointerEvents=0;collapsible=0;recursiveResize=0;shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_vpc;strokeColor=#248814;fillColor=none;verticalAlign=top;align=left;spacingLeft=30;fontColor=#AAB7B8;dashed=0;" vertex="1" parent="1">
<mxGeometry x="480" y="240" width="880" height="560" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-2" value="Private Subnet 1" style="points=[[0,0],[0.25,0],[0.5,0],[0.75,0],[1,0],[1,0.25],[1,0.5],[1,0.75],[1,1],[0.75,1],[0.5,1],[0.25,1],[0,1],[0,0.75],[0,0.5],[0,0.25]];outlineConnect=0;gradientColor=none;html=1;whiteSpace=wrap;fontSize=12;fontStyle=0;container=1;pointerEvents=0;collapsible=0;recursiveResize=0;shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_security_group;grStroke=0;strokeColor=#147EBA;fillColor=#E6F2F8;verticalAlign=top;align=left;spacingLeft=30;fontColor=#147EBA;dashed=0;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-1">
<mxGeometry x="40" y="280" width="320" height="170" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-6" value="Helix Core" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#ED7100;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.ec2_c7g_instance;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-2">
<mxGeometry x="240" y="61" width="48" height="48" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="z3quKmZYuvxo1gOoUY7u-2" source="z3quKmZYuvxo1gOoUY7u-16" target="z3quKmZYuvxo1gOoUY7u-6">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-16" value="Helix Swarm" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#ED7100;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.ecs_service;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-2">
<mxGeometry x="70" y="31.5" width="31.69" height="39" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-20" value="Helix Authentication Service" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#ED7100;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.ecs_service;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-2">
<mxGeometry x="70" y="99.5" width="31.69" height="39" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-11" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://plugins.jetbrains.com/files/69/372238/icon/pluginIcon.png;clipPath=inset(0% 18% 0% 17.33%);" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-2">
<mxGeometry x="248.24" y="68.75" width="31.53" height="32.5" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-3" value="Private Subnet 2" style="points=[[0,0],[0.25,0],[0.5,0],[0.75,0],[1,0],[1,0.25],[1,0.5],[1,0.75],[1,1],[0.75,1],[0.5,1],[0.25,1],[0,1],[0,0.75],[0,0.5],[0,0.25]];outlineConnect=0;gradientColor=none;html=1;whiteSpace=wrap;fontSize=12;fontStyle=0;container=1;pointerEvents=0;collapsible=0;recursiveResize=0;shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_security_group;grStroke=0;strokeColor=#147EBA;fillColor=#E6F2F8;verticalAlign=top;align=left;spacingLeft=30;fontColor=#147EBA;dashed=0;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-1">
<mxGeometry x="400" y="280" width="320" height="170" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-21" value="Helix Swarm" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#ED7100;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.ecs_service;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-3">
<mxGeometry x="220" y="26" width="31.69" height="39" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-22" value="Helix Authentication Service" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#ED7100;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.ecs_service;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-3">
<mxGeometry x="220" y="99.5" width="31.69" height="39" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="z3quKmZYuvxo1gOoUY7u-3" source="z3quKmZYuvxo1gOoUY7u-28" target="z3quKmZYuvxo1gOoUY7u-21">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="z3quKmZYuvxo1gOoUY7u-3" source="z3quKmZYuvxo1gOoUY7u-28" target="z3quKmZYuvxo1gOoUY7u-22">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-28" value="Perforce ALB" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#8C4FFF;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.application_load_balancer;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-3">
<mxGeometry x="60" y="65" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-4" value="Public Subnet 1" style="points=[[0,0],[0.25,0],[0.5,0],[0.75,0],[1,0],[1,0.25],[1,0.5],[1,0.75],[1,1],[0.75,1],[0.5,1],[0.25,1],[0,1],[0,0.75],[0,0.5],[0,0.25]];outlineConnect=0;gradientColor=none;html=1;whiteSpace=wrap;fontSize=12;fontStyle=0;container=1;pointerEvents=0;collapsible=0;recursiveResize=0;shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_security_group;grStroke=0;strokeColor=#248814;fillColor=#E9F3E6;verticalAlign=top;align=left;spacingLeft=30;fontColor=#248814;dashed=0;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-1">
<mxGeometry x="40" y="80" width="320" height="120" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-37" value="Perforce NLB" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#8C4FFF;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.network_load_balancer;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-4">
<mxGeometry x="90" y="39" width="39" height="39" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-5" value="Public Subnet 2" style="points=[[0,0],[0.25,0],[0.5,0],[0.75,0],[1,0],[1,0.25],[1,0.5],[1,0.75],[1,1],[0.75,1],[0.5,1],[0.25,1],[0,1],[0,0.75],[0,0.5],[0,0.25]];outlineConnect=0;gradientColor=none;html=1;whiteSpace=wrap;fontSize=12;fontStyle=0;container=1;pointerEvents=0;collapsible=0;recursiveResize=0;shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_security_group;grStroke=0;strokeColor=#248814;fillColor=#E9F3E6;verticalAlign=top;align=left;spacingLeft=30;fontColor=#248814;dashed=0;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-1">
<mxGeometry x="400" y="80" width="320" height="120" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-44" value="Perforce NLB" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#8C4FFF;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.network_load_balancer;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-5">
<mxGeometry x="140.5" y="39" width="39" height="39" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-15" value="AWS Fargate" style="sketch=0;points=[[0,0,0],[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0,0],[0,1,0],[0.25,1,0],[0.5,1,0],[0.75,1,0],[1,1,0],[0,0.25,0],[0,0.5,0],[0,0.75,0],[1,0.25,0],[1,0.5,0],[1,0.75,0]];outlineConnect=0;fontColor=#232F3E;fillColor=#ED7100;strokeColor=#ffffff;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.fargate;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-1">
<mxGeometry x="350" y="470" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="z3quKmZYuvxo1gOoUY7u-1" source="z3quKmZYuvxo1gOoUY7u-6" target="z3quKmZYuvxo1gOoUY7u-28">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="z3quKmZYuvxo1gOoUY7u-1" source="z3quKmZYuvxo1gOoUY7u-37" target="z3quKmZYuvxo1gOoUY7u-6">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="380" y="138" />
<mxPoint x="380" y="240" />
<mxPoint x="304" y="240" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-41" value="perforce.example.com" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="z3quKmZYuvxo1gOoUY7u-38">
<mxGeometry x="0.3939" relative="1" as="geometry">
<mxPoint x="-47" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="z3quKmZYuvxo1gOoUY7u-1" source="z3quKmZYuvxo1gOoUY7u-37" target="z3quKmZYuvxo1gOoUY7u-28">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="380" y="138" />
<mxPoint x="380" y="365" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-40" value="swarm.perforce.example.com&lt;br&gt;auth.perforce.example.com" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="z3quKmZYuvxo1gOoUY7u-39">
<mxGeometry x="-0.679" y="-1" relative="1" as="geometry">
<mxPoint x="9" y="-20" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-45" value="Amazon Route 53" style="sketch=0;points=[[0,0,0],[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0,0],[0,1,0],[0.25,1,0],[0.5,1,0],[0.75,1,0],[1,1,0],[0,0.25,0],[0,0.5,0],[0,0.75,0],[1,0.25,0],[1,0.5,0],[1,0.75,0]];outlineConnect=0;fontColor=#232F3E;fillColor=#8C4FFF;strokeColor=#ffffff;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.route_53;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-1">
<mxGeometry x="460" y="470" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-46" value="AWS Secrets Manager" style="sketch=0;points=[[0,0,0],[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0,0],[0,1,0],[0.25,1,0],[0.5,1,0],[0.75,1,0],[1,1,0],[0,0.25,0],[0,0.5,0],[0,0.75,0],[1,0.25,0],[1,0.5,0],[1,0.75,0]];outlineConnect=0;fontColor=#232F3E;fillColor=#DD344C;strokeColor=#ffffff;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.secrets_manager;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-1">
<mxGeometry x="770" y="170" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="z3quKmZYuvxo1gOoUY7u-47" value="AWS Certificate Manager" style="sketch=0;points=[[0,0,0],[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0,0],[0,1,0],[0.25,1,0],[0.5,1,0],[0.75,1,0],[1,1,0],[0,0.25,0],[0,0.5,0],[0,0.75,0],[1,0.25,0],[1,0.5,0],[1,0.75,0]];outlineConnect=0;fontColor=#232F3E;fillColor=#DD344C;strokeColor=#ffffff;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.certificate_manager_3;" vertex="1" parent="z3quKmZYuvxo1gOoUY7u-1">
<mxGeometry x="770" y="270" width="60" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file added docs/media/images/perforce-complete-example.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
68 changes: 62 additions & 6 deletions docs/modules/perforce/examples/complete.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,69 @@
# Perforce Complete Example

This example provisions [Helix Core](https://www.perforce.com/products/helix-core), [Helix Swarm](https://www.perforce.com/products/helix-swarm), and the [Helix Authentication Service](https://www.perforce.com/downloads/helix-authentication-service). It also configures security groups for each of these modules to allow inter-service communication. This example takes a single input variable:`root_domain_name` is expected to correspond to an existing [AWS Route53 hosted zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/route-53-concepts.html#route-53-concepts-hosted-zone). This hosted zone is used for provisioning DNS records used for external and internal routing, and enables this example to create validated SSL certificates on your behalf.
This complete example configuration deploys [**Perforce Helix Core**](https://www.perforce.com/products/helix-core),
[**Perforce Helix Swarm**](https://www.perforce.com/products/helix-swarm), and [**Perforce
Helix Authentication Service**](https://www.perforce.com/downloads/helix-authentication-service) into a new Virtual
Private Cloud. It is designed to be used as a starting point for
your Perforce Helix Core deployment.

If you do not have a domain yet you can [register one through Route53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html#domain-register-procedure-section).
## Architecture

If you already have a domain with a different domain registrar you can leverage Route53 for DNS services. [Please review the documentation for migrating to Route53 as your DNS provider.](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/MigratingDNS.html)
![Perforce Example Architecture](../../../media/images/perforce-complete-example.png)

If you own the domain: "example.com" this example will deploy Helix Core to "core.helix.example.com" and Helix Swarm to "swarm.helix.example.com" - this can be modified from the `dns.tf` file.
## Deployment

## Deployment Architecture
This example configuration can be used out of the box and takes only a single variable: `root_domain_name` corresponds
to the fully qualified domain name of an existing public hosted zone in the AWS account where you are deploying this
reference architecture. The deployment steps below will get you up and running.

![Perforce Example Architecture](../../../media/images/perforce-complete-example.jpg)
1. You will need the Cloud Game Development Toolkit's Perforce Helix Core Amazon Machine Image. This Amazon Machine
Image (AMI) can be build using
our [provided Packer template](https://github.com/aws-games/cloud-game-development-toolkit/tree/main/assets/packer/perforce/helix-core).
This example uses the ARM64 version of this AMI, and
leverages Amazon Graviton for the Helix Core instance. Follow our documentation for provisioning this AMI in your AWS
account.
2. Next, you will need to ensure you have an [Amazon Route 53](https://aws.amazon.com/route53/) hosted zone created in
your account for a domain name
that you already own. This example configuration creates DNS records and a private hosted zone for you, but this
pre-requisite hosted zone is necessary for certificate creation. If you do not wish to use the provided DNS resources
you will need to customize this example.
3. Once you have completed these pre-requisites you are ready to deploy the infrastructure:

```shell
terraform apply -var "root_domain_name=<YOUR ROOT HOSTED ZONE NAME>"
```

4. Review the plan provided by the above command. When you are ready to deploy you can confirm by typing "yes" on the
command line. Terraform will take a few minutes to provision everything. When it completes, you are ready to proceed
with testing.
5. By default, none of the deployed resources are available on the public internet. This is to prevent unintended
security violations. You can update the security group for the Perforce Network Load balancer through the console, or
add the following rules to the example configuration in [
`security.tf`](https://github.com/aws-games/cloud-game-development-toolkit/blob/main/modules/perforce/examples/complete/security.tf):

```terraform
# Grants access on HTTPS port for Helix Swarm and Helix Authentication
resource "aws_vpc_security_group_ingress_rule" "private_perforce_https_ingress" {
security_group_id = aws_security_group.perforce_network_load_balancer.id
description = "Enables private access to Perforce web services."
from_port = 443
to_port = 443
ip_protocol = "TCP"
cidr_ipv4 = "<YOUR IP>/32"
}
# Grants access on Helix Core port
resource "aws_vpc_security_group_ingress_rule" "private_perforce_https_ingress" {
security_group_id = aws_security_group.perforce_network_load_balancer.id
description = "Enables private access to Perforce Helix Core."
from_port = 1666
to_port = 1666
ip_protocol = "TCP"
cidr_ipv4 = "<YOUR IP>/32"
}
```
6. You should now have access to your deployed resources. The URLs for Helix Swarm and Helix Authentication Service are
provided as Terraform outputs and should be visible in your console after a successful deployment. The connection
string for Helix Core is also provided as an output. Use the Helix Core CLI or the P4V application to connect to your
Helix Core server.

0 comments on commit 5da657e

Please sign in to comment.