Jarvis Kadar Yetenekli Değil, Ama Hadi Bunu Çalıştıralım — 2. Bölüm
Jarvis Kadar Yetenekli Değil, Ama Hadi Bunu Çalıştıralım — 2. Bölüm
Merhaba millet, uzun zaman oldu! Birkaç küçük aksilikten sonra nihayet bunu yayınlama fırsatı buldum. Geçen sefer, oyunumuz için gerekli tüm dosyaları oluşturmuştuk — şimdi, tek bir tuşa basarak her şeyi çalışır hale getirebilmek için nasıl bir yol izleyeceğimize derinlemesine bir göz atalım.
Aşağıdaki şema biraz karmaşık — hatta kafa karıştırıcı — görünebilir ve kesinlikle haklısınız. Ben de bunu ilk kez kafamda canlandırmaya çalıştığımda aynı şeyi hissetmiştim. Ama adım adım ilerleyip ne işe yaradığını açıklayalım.
Oyun dosyalarımızı hazırladıktan sonra asıl hedefimiz, iyi organize edilmiş ve sorunsuz çalışan bir sistem kurmaktı. Bu yüzden, minimum çabayla maksimum verimliliği elde etmemizi sağlayan bir tasarım geliştirdim.
Gerekli dosyaları Git deposuna yüklediğimizde, aşağıda göstereceğim GitHub iş akışı devreye girer. Bu iş akışı, sunucularımızdaki kontrolleri gerçekleştirir ve gerekli ortamı kurar. Bu sayede, playbook’larımız burada depolanır ve bu .yaml dosyalarını kolayca çalıştırarak AWS tarafındaki her şeyi çok hızlı bir şekilde yapılandırabiliriz.

Aşağıda, iş akışı için yazılmış örnek dosyalar yer almaktadır. Bunları kullanmak için, AWX konsolundan gerekli kimlik bilgilerini almanız ve bir iş oluşturmanız gerekir.
name: 🚀 Auto-Deploy Minecraft Server via AWX
on:ya
push:
branches:
- main
jobs:
deploy-to-awx:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Create or Update AWX Project
run: |
echo "🔧 Checking or creating AWX Project..."
curl -s -X POST "${{ secrets.AWX_URL }}/api/v2/projects/" \
-H "Content-Type: application/json" \
-u "${{ secrets.AWX_USER }}:${{ secrets.AWX_PASS }}" \
-d '{
"name": "Minecraft_Deploy_Project",
"scm_type": "git",
"scm_url": "https://github.com/0gulcandogann/deploy_game_server_for_aws.git",
"scm_branch": "main",
"scm_update_on_launch": true
}' || echo "Project already exists or updated."
- name: Create or Update AWX Inventory
run: |
echo "📦 Checking or creating AWX Inventory..."
curl -s -X POST "${{ secrets.AWX_URL }}/api/v2/inventories/" \
-H "Content-Type: application/json" \
-u "${{ secrets.AWX_USER }}:${{ secrets.AWX_PASS }}" \
-d '{
"name": "Minecraft_Inventory",
"organization": 1
}' || echo "Inventory already exists or updated."
- name: Create AWX Credential (AWS)
run: |
echo "🔑 Creating AWX AWS credential..."
curl -s -X POST "${{ secrets.AWX_URL }}/api/v2/credentials/" \
-H "Content-Type: application/json" \
-u "${{ secrets.AWX_USER }}:${{ secrets.AWX_PASS }}" \
-d '{
"name": "AWS_Credentials",
"credential_type": 8,
"organization": 1,
"inputs": {
"username": "${{ secrets.AWS_ACCESS_KEY_ID }}",
"password": "${{ secrets.AWS_SECRET_ACCESS_KEY }}"
}
}' || echo "Credential already exists or updated."
- name: Create or Update AWX Job Template
run: |
echo "🧱 Creating or updating AWX Job Template..."
curl -s -X POST "${{ secrets.AWX_URL }}/api/v2/job_templates/" \
-H "Content-Type: application/json" \
-u "${{ secrets.AWX_USER }}:${{ secrets.AWX_PASS }}" \
-d '{
"name": "Deploy_Minecraft_Server",
"job_type": "run",
"inventory": 1,
"project": 1,
"playbook": "deploy_minecraft.yml",
"credential": 1,
"become_enabled": true
}' || echo "Template already exists or updated."
- name: Launch AWX Job Template
run: |
echo "🚀 Launching AWX Job Template..."
curl -s -X POST "${{ secrets.AWX_URL }}/api/v2/job_templates/1/launch/" \
-u "${{ secrets.AWX_USER }}:${{ secrets.AWX_PASS }}"
Tüm bunları tamamladıktan sonra iş akışı şu şekilde devam eder: Değişikliklerinizi ana dala yüklediğinizde, GitHub Actions otomatik olarak AWX (veya Red Hat Ansible Automation Platform) örneğinize bağlanır, gerekli kaynakları (Proje, Envanter, Kimlik Bilgileri ve İş Şablonu) kurar ve işi tetikler. Bu noktadan itibaren AWX, tüm AWS işlemlerini otomatik olarak gerçekleştiren Ansible playbook'unu çalıştırır; artık AWX'e manuel erişim gerekmez.
Şimdi, main.yaml dosyasında belirtildiği şekilde kuralın dağıtım sürecini adım adım inceleyelim.
#main.yaml
---
- name: Deploy Minecraft Server to AWS GameLift (Vanilla)
hosts: localhost
connection: local
gather_facts: false
vars_files:
- core/vars/main.yaml
roles:
- role: core.roles.iam
- role: core.roles.s3
- role: core.roles.build
- role: core.roles.fleet
- role: core.roles.autoscaling
Ek olarak, vars dosyasında oluşturulacak filonun gerekli adlarını ve türünü aşağıdaki gibi belirledik.
#vars.yaml
aws_region: "eu-central-1"
s3_bucket_name: "minecraft-gamelift-builds"
gamelift_build_name: "minecraft-vanilla-build"ya
gamelift_fleet_name: "minecraft-vanilla-fleet"
minecraft_port: 25565
instance_type: "c6i.large"
desired_instances: 1
min_instances: 1
max_instances: 3
Öncelikle, bu tetiklendiğinde sağladığımız kimlik bilgileri AWS’ye gönderilecek ve aşağıda gösterildiği gibi önce bir IAM politikası oluşturulacaktır.
#iam.yaml
---
- name: Create IAM role for GameLift to access S3
amazon.aws.iam_role:
name: "GameLiftAccessS3Role"
assume_role_policy_document: |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"Service": "gamelift.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
register: gamelift_iam_role
- name: Create policy for S3 access
amazon.aws.iam_policy:
name: "GameLiftS3AccessPolicy"
state: present
policy_document: |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"],
"Resource": "*"
}
]
}
register: s3_policy
- name: Attach S3 policy to role
amazon.aws.iam_policy_attachment:
name: "AttachS3ToGameLift"
roles:
- "{{ gamelift_iam_role.role.name }}"
policy_arn: "{{ s3_policy.policy.arn }}"
Ardından, oyun dosyalarımızı depolamak için bir S3 kovası oluşturarak ve GitHub'a yüklediğimiz minecraft_server.zip klasörünü bu kovaya yükleyerek devam edeceğiz.
Burada dikkat edilmesi gereken bir nokta: GameLift, genellikle bağımsız sistemler için bir zip dosyası bekler. Unreal veya Unity gibi motorlarla geliştirilen oyunlar için, GameLift tarafından sağlanan GameSDK'leri kullanılması önerilir.
#s3.yaml
---
- name: Create S3 bucket for Minecraft builds
amazon.aws.s3_bucket:
name: "{{ s3_bucket_name }}"
state: present
region: "{{ aws_region }}"
- name: Upload Minecraft server build
amazon.aws.s3_object:
bucket: "{{ s3_bucket_name }}"
object: "minecraft_server.zip"
src: "{{ playbook_dir }}/minecraft_server.zip"
mode: put
Tamam, artık oyun dosyalarımızı yüklediğimize göre, derlemeyi oluşturup ilk filomuzu başlatma zamanı geldi.
#build.yaml
---
- name: Look up current AWS account id
community.aws.aws_caller_facts:
register: caller
- name: Create GameLift build
community.aws.gamelift_build:
name: "{{ gamelift_build_name }}"
operating_system: "AMAZON_LINUX_2"
storage_location:
bucket: "{{ s3_bucket_name }}"
key: "minecraft_server.zip"
role_arn: "arn:aws:iam::{{ caller.account_id }}:role/GameLiftAccessS3Role"
state: present
register: gamelift_build
- name: Save build id
set_fact:
gamelift_build_id: "{{ gamelift_build.build.id }}"
#fleet.yaml
---
- name: Create GameLift fleet for Minecraft
community.aws.gamelift_fleet:
name: "{{ gamelift_fleet_name }}"
build_id: "{{ gamelift_build_id }}"
instance_type: "{{ instance_type }}"
ec2_inbound_permissions:
- from_port: "{{ minecraft_port }}"
to_port: "{{ minecraft_port }}"
protocol: "TCP"
runtime_configuration:
server_processes:
- launch_path: "./start.sh"
concurrent_executions: 1
desired_instances: "{{ desired_instances }}"
new_game_session_protection_policy: "NoProtection"
register: gamelift_fleet
- name: Save fleet id
set_fact:
gamelift_fleet_id: "{{ gamelift_fleet.fleet.id }}"
Tamam, sunucumuz artık çalışır durumda. Ancak son bir görev daha var: Sunucudaki oyuncu sayısı artarsa veya chunk ayarları yükseltilirse, oyunun işlenmesi gereken alan büyüyecek ve bu da sistem kaynaklarının çoğunu tüketebilir. Bu durumda, otomatik ölçeklendirmeyi yapılandırarak bu süreci otomatikleştireceğiz.
#autoscaling.yaml
---
- name: Create a target-based autoscaling policy for the fleet
community.aws.gamelift_fleet_auto_scaling_policy:
name: "MinecraftAutoScale"
fleet_id: "{{ gamelift_fleet_id }}"
policy_type: "TargetBased"
target_configuration:
target_value: 25
target_value_dimension: PercentAvailableGameSessions
register: autoscaling_policy
Evet, artık her şey hazır ve sunucumuz kuruldu; oynamaya başlayabilirsiniz. Ama önce, sunucunun aktif olup olmadığını görmek için hızlı bir kontrol yapalım.

Tamam, bundan sonra CLI veya konsol aracılığıyla IP adresinizi ve bağlantı noktanızı bulabilir ve oyuna doğrudan bağlanabilirsiniz.
Bu sonsuz macerada benimle birlikte olduğunuz için teşekkür ederim; gerçekten de tuhaf bir deneyimdi. Proje dosyalarına GitHub profilim üzerinden erişebilirsiniz; bu projeyi daha da geliştirebilir ya da birlikte farklı projelere yelken açabiliriz. Şimdilik kendinize iyi bakın ve kılıcınız daima keskin kalsın 🙃

Bu yazı işinize yaradıysa paylaşmayı veya logdaki diğer yazıları keşfetmeyi düşünebilirsiniz.