flowchart LR
subgraph AccelByte Gaming Services
KF[Kafka]
KB[Kafka Connect]
end
subgraph Extend Event Handler App
SV["gRPC Server"]
KB --- SV
KF --- KB
end
AccelByte Gaming Services
(AGS) capabilities can be enhanced using
Extend Event Handler
apps. An Extend Event Handler
app is a gRPC server
that receives AGS events through Kafka Connect
and performs actions based on
custom logic.
This repository provides a project template for an Extend Event Handler
app written in Go
. It includes an example to handle AGS userLoggedIn
event
and grant an item to the user. Additionally, it comes with built-in
instrumentation for observability, ensuring that metrics, traces, and logs are
available upon deployment.
You can clone this repository to begin developing your own Extend Event Handler
app. Simply modify this project by including the AGS event spec files
you need and implement custom logic to handle those events.
Here are some important folders you need to know to be able to start modifying this project.
...
├── pkg
│ ├── pb
│ └── accelbyte-asyncapi # Code generated from AGS event spec files
│ ├── proto
│ └── accelbyte-asyncapi # AGS event spec files (*.proto)
│ └── service
│ └── loginHandler.go # Logic to handle AGS event is implemented here
...
❗ In the example included in this project, we focus solely on the
userLoggedIn
event. Therefore, only the AGS event spec files for IAM are included. For other events, the AGS event spec files are available here.
-
Windows 11 WSL2 or Linux Ubuntu 22.04 or macOS 14+ with the following tools installed:
a. Bash
-
On Windows WSL2 or Linux Ubuntu:
bash --version GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu) ...
-
On macOS:
bash --version GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23) ...
b. Make
-
On Windows WSL2 or Linux Ubuntu:
To install from the Ubuntu repository, run
sudo apt update && sudo apt install make
.make --version GNU Make 4.3 ...
-
On macOS:
make --version GNU Make 3.81 ...
c. Docker (Docker Desktop 4.30+/Docker Engine v23.0+)
-
On Linux Ubuntu:
- To install from the Ubuntu repository, run
sudo apt update && sudo apt install docker.io docker-buildx docker-compose-v2
. - Add your user to the
docker
group:sudo usermod -aG docker $USER
. - Log out and log back in to allow the changes to take effect.
- To install from the Ubuntu repository, run
-
On Windows or macOS:
Follow Docker's documentation on installing the Docker Desktop on Windows or macOS.
docker version ... Server: Docker Desktop Engine: Version: 24.0.5 ...
d. Go v1.20
- Follow Go's installation guide.
go version go version go1.20.0 ...
e. grpcui
- Use binary available here
grpcui --version grpcui v1.4.1
- Use binary available here
❗ In macOS, you may use Homebrew to easily install some of the tools above.
-
-
Access to
AccelByte Gaming Services
environment.a. Base URL:
- Sample URL for AGS Shared Cloud customers:
https://spaceshooter.prod.gamingservices.accelbyte.io
- Sample URL for AGS Private Cloud customers:
https://dev.accelbyte.io
b. Create a Game Namespace if you don't have one yet. Keep the
Namespace ID
.c. Create an OAuth Client with confidential client type with the following permissions. Keep the
Client ID
andClient Secret
.- For AGS Private Cloud customers:
ADMIN:NAMESPACE:{namespace}:USER:*:FULFILLMENT [CREATE]
- For AGS Shared Cloud customers:
- Platform Store -> Fulfillment (Create)
- Sample URL for AGS Shared Cloud customers:
-
A published
AGS
Store. Take a note of theitem id
which is to be granted after a user in a certain namespace successfully logged in.
To be able to run this app, you will need to follow these setup steps.
-
Create a docker compose
.env
file by copying the content of .env.template file.⚠️ The host OS environment variables have higher precedence compared to.env
file variables: If the variables in.env
file do not seem to take effect properly, check if there are host OS environment variables with the same name. See documentation about docker compose environment variables precedence for more details. -
Fill in the required environment variables in
.env
file as shown below.AB_BASE_URL=https://demo.accelbyte.io # Base URL of AccelByte Gaming Services demo environment AB_CLIENT_ID='xxxxxxxxxx' # Use Client ID from the Prerequisites section AB_CLIENT_SECRET='xxxxxxxxxx' # Use Client Secret from the Prerequisites section AB_NAMESPACE='xxxxxxxxxx' # Use Namespace ID from the Prerequisites section ITEM_ID_TO_GRANT='xxxxxxxxxxx' # Item id from a published store we noted previously
To build this app, use the following command.
make build
To (build and) run this app in a container, use the following command.
docker compose up --build
This app can be tested locally using grpcui.
-
Run this app by using the command below.
docker compose up --build
-
Run
grpcui
with the following command.grpcui -plaintext localhost:6565
⚠️ If you are running grpc-plugin-dependencies stack alongside this project as mentioned in Test Observability: Uselocalhost:10000
instead oflocalhost:6565
. This way, thegRPC server
will be called viaEnvoy
service withingrpc-plugin-dependencies
stack instead of directly. -
Now in
grpcui
, send a sample of kafka event you are interested in. In this case, we are interested inuserLoggedIn
event. So, we are using sample payload here.{ "payload": { "userAccount": { "userId": "string", "emailAddress": "string", "country": "string", "namespace": "string" }, "userAuthentication": { "platformId": "string", "refresh": true } }, "id": "string", "version": 0, "name": "string", "namespace": "string", "parentNamespace": "string", "timestamp": "2019-08-24T14:15:22Z", "clientId": "string", "userId": "string", "traceId": "string", "sessionId": "string" }
❗ You can change the field value you are interested in to suits your need, e.g.
namespace
,userId
, etcFinally, make sure to select the right service name and method name and click
Invoke
to send the request.❗ If you are interested on other events: you can find it here.
-
If successful, you will see in the response as follows and you can also see the item granted to the user you are using for this test.
To be able to see the how the observability works in this app locally, there are few things that need be setup before performing tests.
-
Uncomment loki logging driver in docker-compose.yaml
# logging: # driver: loki # options: # loki-url: http://host.docker.internal:3100/loki/api/v1/push # mode: non-blocking # max-buffer-size: 4m # loki-retries: "3"
⚠️ Make sure to install docker loki plugin beforehand: Otherwise, this project will not be able to run. This is required so that container logs can flow to theloki
service withingrpc-plugin-dependencies
stack. Use this command to install docker loki plugin:docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
. -
Clone and run grpc-plugin-dependencies stack alongside this project. After this, Grafana will be accessible at http://localhost:3000.
git clone https://github.com/AccelByte/grpc-plugin-dependencies.git cd grpc-plugin-dependencies docker compose up
❗ More information about grpc-plugin-dependencies is available here.
-
Perform testing. For example, by following Test in Local Development Environment.
To deploy this app to AGS, follow the steps below.
-
Create a new Extend Event Handler app on Admin Portal. Keep the
Repository URI
. -
Download and setup extend-helper-cli (only if it has not been done previously).
-
Perform docker login with
extend-helper-cli
using the following command.extend-helper-cli dockerlogin --namespace <my-game> --app <my-app> --login
❗ For your convenience, the above
extend-helper-cli
command can also be copied fromRepository Authentication Command
under the corresponding app detail page. -
Build and push this project docker image to AccelByte ECR using the following command.
extend-helper-cli image-upload --work-dir <my-project-dir> --namespace <my-game> --app <my-app> --image-tag v0.0.1
⚠️ Make sure to perform docker login (step 3) before executing the above command. -
Open Admin Portal, go to Extend -> Event Handler. And then select the extend app.
-
To deploy selected image tag, click Image Version History and select desired image tag to be deployed.
-
Click Deploy Image, confirm the deployment and go back to App Detail by clicking Cancel.
-
Wait until app status is running.
For more information on how to deploy an Extend Event Handler
app, see
here.
Proceed create your own Extend Event Handler
app by modifying this project.
See here for more details.