This Terraform module will create a small Valheim server in AWS
Server is configured to load world backups from AWS S3 and send a new backup to S3 before shutdown.
THIS COSTS MONEY. Running a t3.medium costs roughly 30$ a month
Resources Created By This Terraform Module:
- IAM role for s3 and AWS SSM sessions (AWS ssh equivalent)
- Server (t3.medium)
- Security Group to only allow UDP ingresss on ports 2456-2458
- AWS Account
- S3 bucket in which to store world backups (and terraform state)
- AWS credentials stored as the default profile (get credentials and then use
aws configure) - terraform (
brew install terraform) - awscli (
brew install awscli) - awscli session manager plugin (https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)
- jq (
brew install jq)
- Prepare
- Create a new S3 bucket in your account
- create a folder in the bucket called latest
- copy your valheim world data from your local computer to this folder in your s3 bucket (files will have a
.dband.fwlextension)
- Copy the example main.tf from main.tf and fill in any empty quotes
""
- Create a new S3 bucket in your account
- Build cloud resources
terraform init; terraform planwill show you what will be createdterraform init; terraform applywill deploy everything after typing yes
- Connect to server (for debugging):
aws ssm start-session --target $(terraform output -json | jq -r '."instance-id".value')will start and AWS SSM session to log into the server.- you need to have the awscli installed as well as the aws ssm session plugin
- Useful commands:
tail -f /var/log/cloud-init-output.logto debug theuserdata.shsystemctl status valheimto see the valheim service statusjournalctl --unit valheimto see the valheim server logslogs
No requirements.
| Name | Version |
|---|---|
| aws | n/a |
| template | n/a |
No modules.
| Name | Type |
|---|---|
| aws_iam_instance_profile.session_manager | resource |
| aws_iam_policy.session_manger | resource |
| aws_iam_role.session_manager | resource |
| aws_iam_role_policy_attachment.session_manager | resource |
| aws_instance.main | resource |
| aws_security_group.main | resource |
| aws_security_group_rule.egress | resource |
| aws_security_group_rule.ingress | resource |
| aws_ami.amazon_linux_2 | data source |
| template_file.userdata | data source |
| Name | Description | Type | Default | Required |
|---|---|---|---|---|
| instance_type | This is the size of your server (t2.micro: 1 cpu, 2GB ram, this is free tier; t3a.medium, 2 cpu, 4GB ram, not sure why I used this) | string |
"t2.micro" |
no |
| s3_bucket_name | This is the s3 bucket you will be using to store your world files in. | any |
n/a | yes |
| server_name | This doesn't matter much. If you're server is public, this will be shown in the list of community servers. | string |
"MyServer" |
no |
| server_password | This is the password users will enter after they put in the IP address of the server. | any |
n/a | yes |
| world_name | world_name must be the same name as your world files (ex: world_name = "myworld" would correlate with myworld.db and myworld.fwl). |
any |
n/a | yes |
| Name | Description |
|---|---|
| instance-id | ======= outputs ======= |
| public-ip | n/a |