# Use Amazon EC2 for cost-efficient cloud gaming with pay-as-you-go pricing
This repository contains the full source code that is used in the blog post [Use Amazon EC2 for cost-efficient cloud gaming with pay-as-you-go pricing](https://aws.amazon.com/blogs/compute/use-amazon-ec2-for-cost-efficient-cloud-gaming-with-pay-as-you-go-pricing/).
## Solution Overview
### Prerequisites
- An [AWS account](https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fportal.aws.amazon.com%2Fbilling%2Fsignup%2Fresume&client_id=signup)
- Installed and authenticated [AWS CLI](https://docs.aws.amazon.com/en_pv/cli/latest/userguide/cli-chap-install.html) (authenticate with an [IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started.html) user or an [AWS STS](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) Security Token)
- Installed and setup [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)
- Installed Node.js, TypeScript and git
- AWS EC2 KeyPair (.pem)
### Let’s get you started
#### 1. Make sure you completed the prerequisites above and cloned this repo.
```
git clone git@github.com:aws-samples/cloud-gaming-on-ec2-instances
```
#### 2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.
```
.
├── cdk CDK code that defines the environment
└── img Images used in this README
```
#### 3. Install dependencies
node.js dependencies are declared in a `package.json`. This project contains a `package.json` file in the `cdk` folder.
Navigate into `cdk` folder it and run `npm install`
#### 4. Configure your environment
Before you can deploy the stack, you need to review the config. Navigate to `cdk/bin/cloud-gaming-on-ec2.ts` and review / update the following parameters:
- `ACCOUNT`: The account id you want to deploy the stack in
- `REGION`: The region you want to deploy the stack in
- `NICE_DCV_DISPLAY_DRIVER_URL`: The download URL of the NICE DCV Virtual Display Driver for EC2. You can leave this unless the link is broken or you want to use a different version.
- `NICE_DCV_SERVER_URL`: The download URL of the NICE DCV Server. You can leave this unless the link is broken or you want to use a different version.
- `InstanceSize`: Sets the size of the EC2 Instance. Defaults to `g5.xlarge`, `g4dn.xlarge`, and `g4ad.xlarge` respectively.
- `associateElasticIp`: Controls if an Elastic IP address will be created and added to the EC2 instance.
- `EC2_KEYPAIR_NAME`: The name of the EC2 key pair you will use to connect to the instance. Make sure to have access to the respective .pem file.
- `VOLUME_SIZE_GIB`: The size of the root EBS volume. Around 20 GB will be used for the Windows installation, the rest will be available for your software. Note: Some EC2 Instance Types include instance store which can be initalized.
- `OPEN_PORTS`: Access from these ports will be allowed. Per default this will only allow access for NICE DCV on port 8443
- `ALLOW_INBOUND_CIDR`: Access from this CIDR range will be allowed. Per default this will allow access from /0, but I recommend to restrict this to your IP address only.
- `GRID_SW_CERT_URL`: (Only for g4dn/g5 instances) The NVIDIA driver requires a certificate file which can be downloaded from Amazon S3. You can leave this unless the link is broken or you want to use a different certificate.
- `tags`: A list of resource tags that will be added to every taggable resource in the stack.
- `SEVEN_ZIP_URL`: Update to the latest 7zip .msi version as it is required for the automated NVIDIA driver install.
- `CHROME_URL`: Installs Google Chrome Enterprise x64.
#### 5. Deploy your application
The CDK code is written in TypeScript, an extension to JavaScript that adds static types and other useful features.
To run the CDK code, navigate to the `cdk` folder and run the following commands
```
cdk bootstrap
cdk deploy
```
After bootstrapping the required resources for the CDK with `cdk bootstrap` you can then deploy the template with `cdk deploy `. Bootstrapping is only require once.
`` can be either `CloudGamingOnG4DN`, `CloudGamingOnG4AD` or `CloudGamingOnG5`, depending on the instance type you want to use.
The following table gives an overview over the expected graphics performance, expressed as 3DMark Time Spy scores.
| Instance Type | 3DMark Score | On-demand Price (us-east-1, USD, 02/23) | Price-performance (3DMark points / $) |
|--------------|--------------|-----------------------------------------|---------------------------------------|
| g4dn.xlarge | 4300 | $0.71 | 6056 |
| g4dn.2xlarge | 4800 | $1.12 | 4286 |
| g4dn.4xlarge | 6000 | $1.94 | 3093 |
| g4ad.xlarge | 5100 | $0.56 | 9107 |
| g4ad.2xlarge | 6600 | $0.91 | 7253 |
| g4ad.4xlarge | 7600 | $1.60 | 4750 |
| g5.xlarge | 6800 | $1.19 | 5714 |
| g5.2xlarge | 10200 | $1.58 | 6456 |
| g5.4xlarge | 13000 | $2.36 | 5508 |
Stack completion usually takes `8-15` minutes.
#### 6. Create your personal gaming AMI
Follow the instructions in the associated blog post [Use Amazon EC2 for cost-efficient cloud gaming with pay-as-you-go pricing](https://aws.amazon.com/blogs/compute/use-amazon-ec2-for-cost-efficient-cloud-gaming-with-pay-as-you-go-pricing/).
## Useful CLI commands
List EC2 key pairs
```
aws ec2 describe-key-pairs --query 'KeyPairs[*].KeyName' --output table
```
Create a new key pair and the PEM file to store your private key
```
KEY_NAME=GamingOnEc2
aws ec2 create-key-pair --key-name $KEY_NAME --query 'KeyMaterial' --output text > $KEY_NAME.pem
```
Start / Stop an EC2 instance
```
aws ec2 start-instances --instance-ids INSTANCE_ID
aws ec2 stop-instances --instance-ids INSTANCE_ID
```
Creates an Amazon Machine Image from an EC2 instance
```
aws ec2 create-image --instance-id --name
```
Starts a new EC2 instance from a launch template
```
aws ec2 run-instances --image-id --launch-template LaunchTemplateName= --query "Instances[*].[InstanceId, PublicIpAddress]" --output table
```
List your instances
```
aws ec2 describe-instances --query "Reservations[*].Instances[*].[ImageId, InstanceType, VpcId, State.Name, PublicIpAddress, LaunchTime]" --output table
```
Deploy all stacks at once, without rollback and dont require approval for IAM resources
```
cdk deploy --all --no-rollback --concurrency=3 --require-approval=never
```
List all stacks
```
cdk list
```
## Security
See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.
## License
This library is licensed under the MIT-0 License. See the LICENSE file.