Overview
AWS AppConfig stores feature flags and freeform configuration (JSON, YAML, text) per application, environment and configuration profile, and rolls changes out with deployment strategies and automatic rollback. AppConfigLive brings that into Unreal Engine 4.27 and 5.8.
- Sessions: Start Configuration Session opens an AppConfig Data session and keeps it current with background polling that honours the interval AppConfig asks for.
- Feature flags: Get Flag Enabled, typed attribute getters, enabled-flag lists and the names of the flags that changed in every update.
- Remote config: typed values by path (
shop.featured[0].sku), whole sections into Blueprint structs.
- Offline: snapshots on disk restored at start-up, shipped fallbacks, local overrides for QA menus and kill switches.
- Live-ops tools: list, read and create applications, environments, profiles and hosted versions, start / stop / wait for deployments, validate configurations, resolve names to ids.
Multi-variant flagsAppConfig multi-variant flags (variants chosen per user context) are evaluated only by the AppConfig Agent, not by the AppConfig Data API that game clients use. AppConfigLive receives the flag's default value for them. Use separate flags or attributes per segment, or evaluate segments in your own code with the attribute getters.
Requirements
| Requirement | Details |
| Unreal Engine | 4.27 and 5.8 |
| Platforms | Win64, Linux and Android |
| Modules | AppConfigLive (Runtime), AppConfigLiveSdk (prebuilt AWS SDK for C++ 1.11.916 in Source/ThirdParty) |
| Dependencies | No other plugins. On Linux and Android the SDK uses the engine's libcurl, OpenSSL and certificate store. |
| AWS | An AWS account with AWS AppConfig. Configuration requests and Cognito usage are billed by AWS. |
Installation
- Install AppConfigLive from Fab into your engine, or copy the
AppConfigLive folder into your project's Plugins folder.
- Enable AppConfigLive in Edit > Plugins and restart the editor.
- Open Project Settings > Plugins > AppConfigLive: set Region, Identity Pool Id and the Application / Environment / Configuration Profile identifiers (names or ids).
- C++ only: add
PublicDependencyModuleNames.Add("AppConfigLive"); to your Build.cs.
Several AWS plugins in one projectEach Alpha XP cloud plugin carries its own copy of the SDK under a plugin-specific name, so they install side by side without conflicts.
Setting up AWS
- In the AWS AppConfig console create an application (for example
MyGame), an environment (Production) and a configuration profile: Feature flag for flags, Freeform for JSON settings.
- Add flags or a JSON document, save a version and start a deployment (strategy
AppConfig.AllAtOnce for instant changes).
- In Amazon Cognito create an identity pool with guest access (players read configuration before they sign in).
- Give the pool's player roles read access to the configuration only:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["appconfig:StartConfigurationSession", "appconfig:GetLatestConfiguration"],
"Resource": "arn:aws:appconfig:us-east-1:123456789012:application/abc1234/environment/def5678/configuration/ghi9012"
}]
}
The resource is application/<app id>/environment/<env id>/configuration/<profile id> (ids, not names; Resolve Names To Ids or the console show them). Use * segments to cover several profiles.
Live-ops tools (admin nodes)
The nodes in the Admin group call the AppConfig control plane. Never give them to the player role. Use them from an editor utility or an internal tool signed in with an admin identity, static keys or the default credential chain, with a policy such as:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"appconfig:ListApplications", "appconfig:GetApplication", "appconfig:CreateApplication",
"appconfig:ListEnvironments", "appconfig:GetEnvironment", "appconfig:CreateEnvironment",
"appconfig:ListConfigurationProfiles", "appconfig:GetConfigurationProfile", "appconfig:CreateConfigurationProfile",
"appconfig:ListHostedConfigurationVersions", "appconfig:GetHostedConfigurationVersion", "appconfig:CreateHostedConfigurationVersion",
"appconfig:ListDeploymentStrategies", "appconfig:GetDeploymentStrategy",
"appconfig:ListDeployments", "appconfig:GetDeployment", "appconfig:StartDeployment", "appconfig:StopDeployment",
"appconfig:ValidateConfiguration"
],
"Resource": "*"
}]
}
Environments with CloudWatch alarm monitors also need iam:PassRole for the alarm role.
Never ship access keysStatic keys in the settings end up in DefaultGame.ini and in packaged games. Players should always use the identity pool with the read-only policy above.
Quick start
Feature flags in Blueprint
- In your Game Instance (or the first level's Begin Play) call Get Default Config Session and store the result in a variable
Config.
- Optional: Load Fallback From File with
Content/Config/Defaults.json (add the folder to Additional Non-Asset Directories to Package) so the game has values before the first download.
- Bind On Configuration Changed on
Config to refresh your UI and gameplay.
- Call Start Configuration Session with Session =
Config and Start Polling ticked.
- Anywhere: Get Flag Enabled (
double_xp) and Get Flag Attribute As Float (double_xp, multiplier, Default 1.0).
Freeform JSON
For a profile with {"shop": {"discount": 0.2, "featured": [{"sku": "sword_01"}]}}: Get Value Float shop.discount, Get Value String shop.featured[0].sku, or Get Value As Struct shop into your own Blueprint struct.
Publishing a change from a tool
- Resolve Names To Ids (
MyGame, Production, LiveOps).
- Make Feature Flags Document from an array of flag structs, then Create Hosted Configuration Version with Content Type
application/json.
- Start Deployment with the new Version Number (as text) and strategy
AppConfig.AllAtOnce, then Wait For Deployment.
How it works
- Polling. Each session holds an AppConfig Data token. Every poll calls
GetLatestConfiguration; AppConfig answers with an empty body when nothing changed, and the session keeps its previous content. Polls never come sooner than the larger of your Poll Interval, the Required Minimum Poll Interval and the interval AppConfig sends back. Expired tokens (24 h) are renewed automatically. Failures back off up to 10 minutes and fire On Error; the last good configuration stays in effect.
- Sources. Get Source tells where the data came from: Live (AppConfig, this run), Snapshot (saved by an earlier run), Fallback (shipped defaults). A fallback is replaced by a snapshot or live data; a snapshot only by live data.
- Snapshots. With the default cache policy Save And Restore Snapshot every new live configuration is written to
Saved/AppConfigLive/<app>_<env>_<profile>.json and restored when the session starts, so players have the last known values offline and on the first frame.
- Overrides. Set Flag Override and Set Value Override sit on top of every configuration until Clear Overrides. Get Raw Text always returns the unmodified document.
- Changes. On Configuration Changed carries the changed, added and removed flag names (flag profiles) or the changed top-level keys (freeform JSON).
- Lifetime. Sessions created with a world context belong to the game instance and stop when it shuts down (end of Play In Editor). Without a game instance (editor utilities) keep the session in a variable.
- YAML / text. Non-JSON profiles are available through Get Raw Text / Get Raw Bytes; the flag and value getters return their defaults.
Node reference
86 Blueprint nodes. Latent nodes run in the background, can be stopped with Cancel on their return value and fire exactly one final pin on the game thread. Session nodes are called on an AppConfigLive Session object.
Config and identity
| Node | Inputs | Outputs | Purpose |
| Set Region | Region | - | Switches the AWS region for every following request. |
| Set Credential Mode | Mode | - | Overrides the credential mode from the settings at runtime. |
| Set Login Token | Provider, Token | - | Signs the player in to the identity pool with a provider token. |
| Clear Login Tokens | - | - | Forgets all login tokens; the player becomes a guest. |
| Set Static Credentials | Access Key Id, Secret Access Key, Session Token | - | Uses these keys from now on (tools, servers, keys from your backend). |
| Get Identity Id | - | Identity Id | The player's Cognito identity id (empty until resolved). |
| Make User Pool Provider Name | Region, User Pool Id | Provider | Login key of a Cognito user pool for Set Login Token. |
| Is Configured | - | Result, Problem | False and a reason when the settings are incomplete. |
| Resolve Identity Latent | Force Refresh | On Success / On Failure (Identity Id, Error) | Fetches the Cognito identity and credentials now. |
| Cancel | (latent node) | - | None of the node's pins fire any more. |
| Is Finished | (latent node) | Result | True after the node finished or was cancelled. |
Sessions and polling
| Node | Inputs | Outputs | Purpose |
| Get Default Config Session | - | Session | The session for the identifiers in the project settings, kept by the game instance. |
| Create Config Session | Application, Environment, Configuration Profile | Session | Session for another profile (names or ids); returns the existing one if already created. |
| Start Configuration Session Latent | Session, Start Polling | On Success / On Failure (Session, Result, Error) | Opens the AppConfig session, downloads the configuration and optionally keeps polling. |
| Fetch Latest Configuration Latent | Session | On Success / On Failure (Session, Result, Error) | One explicit round trip; Result.Changed says whether anything changed. |
| Start Polling | Interval Seconds (0 = settings) | - | Polls in the background until Stop Polling. |
| Stop Polling | - | - | Stops polling; the current configuration stays available. |
| Refresh Now | - | Started | Polls immediately; events report the result. |
| Is Polling | - | Result | True while polling is active. |
| Get Seconds Until Next Poll | - | Seconds | Time to the next automatic poll. |
| Set Poll Interval | Seconds (15 - 86400) | - | Poll interval of this session. |
| Set Cache Policy | Policy | - | Memory Only, Save Snapshot On Change or Save And Restore Snapshot for this session. |
| Get Identifiers | - | Ids | Application, environment and profile of the session. |
| On Configuration Changed Event | - | Session, Change | A new configuration is in effect; Change lists changed / added / removed flags or keys. |
| On Error Event | - | Session, Error | A poll failed; polling continues with back-off. |
Document
| Node | Inputs | Outputs | Purpose |
| Get Configuration Version | - | Version Label | Label of the hosted configuration version in use. |
| Get Content Type | - | Content Type | MIME type, for example application/json. |
| Get Raw Text | - | Text | The document as text, without overrides. |
| Get Raw Bytes | - | Bytes | The document bytes exactly as received. |
| Get Last Update Time | - | Date Time (UTC) | When the current configuration arrived or was saved. |
| Get Source | - | Source | None, Live, Snapshot or Fallback. |
| Is Flag Profile | - | Result | True when the document is an AppConfig feature flag configuration. |
Feature flags
| Node | Inputs | Outputs | Purpose |
| Get Flag Enabled | Flag Name, Default | Enabled | The flag's state (overrides applied), Default when unknown. |
| Has Flag | Flag Name | Result | True when the flag exists. |
| Get Flag | Flag Name | Result, Flag | Name, enabled state and all attributes in one struct. |
| Get All Flag Names | - | Names | Every flag in the configuration. |
| Get Enabled Flags | - | Names | The flags that are on. |
| Get Flag Source | Flag Name | Source | Override when a local override applies, otherwise the document source. |
| Get Flag Attribute As String | Flag Name, Attribute, Default | Value | Attribute as text. |
| Get Flag Attribute As Int | Flag Name, Attribute, Default | Value | Attribute as an integer. |
| Get Flag Attribute As Float | Flag Name, Attribute, Default | Value | Attribute as a float. |
| Get Flag Attribute As Bool | Flag Name, Attribute, Default | Value | Attribute as a boolean. |
| Get Flag Attribute As Json | Flag Name, Attribute | Result, Json | Attribute as JSON text (arrays, objects). |
| Get Flag Attribute As String Array | Flag Name, Attribute | Values | Array attribute (string[] / number[]) as strings. |
| Get Flag Attributes | Flag Name | Map | All attributes as JSON text values. |
| Parse Feature Flags | Json | Flags | Flag structs from a Data API or hosted (authoring) flag document. |
| Make Feature Flags Document | Flags | Json | Hosted flag document (flags, values, version 1) for Create Hosted Configuration Version. |
Freeform values
| Node | Inputs | Outputs | Purpose |
| Get Value String | Path, Default | Value | Value by path such as shop.featured[0].sku. |
| Get Value Int | Path, Default | Value | Integer by path. |
| Get Value Float | Path, Default | Value | Float by path. |
| Get Value Bool | Path, Default | Value | Boolean by path. |
| Get Value Json | Path (empty = all) | Result, Json | Any value or the whole document (overrides applied) as JSON. |
| Get Value String Array | Path | Values | Array by path as strings. |
| Get Value Keys | Path (empty = top level) | Keys | Keys of an object, to iterate sections. |
| Get Value As Struct | Path, Out Struct (any struct) | Result | Fills a Blueprint struct from the object at Path. |
| Struct To JSON | Struct (any) | Result, Json | Any struct as a JSON object string. |
| JSON To Struct | Json, Out Struct (any) | Result | Fills a struct from a JSON object string. |
| Get JSON Field | Json, Path | Result, Value | One value from any JSON text by path. |
Overrides and offline
| Node | Inputs | Outputs | Purpose |
| Set Flag Override | Flag Name, Enabled | - | Forces a flag locally (QA, kill switch) until Clear Overrides. |
| Set Value Override | Path, Json Value | - | Replaces a value locally (42, true, "text", [..], {..}). |
| Clear Overrides | - | - | Removes every override. |
| Load Fallback From String | Text, Content Type | Result | Shipped defaults until a snapshot or live data arrives. |
| Load Fallback From File | File Path | Result | Same from a file (project-relative; packaged files work). |
| Save Snapshot To Disk | - | Result | Writes the current configuration to the session's snapshot file. |
| Load Snapshot From Disk | - | Result | Loads the snapshot (never over live data). |
| Clear Snapshot | - | Result | Deletes the snapshot file. |
Admin: applications, environments, profiles (latent)
| Node | Inputs | Outputs | Purpose |
| Resolve Names To Ids | Application, Environment, Configuration Profile | Ids, Error | Names (or ids) to the ids the admin nodes and IAM resources use. |
| List Applications | - | Applications, Error | Every application in the region (all pages). |
| Get Application | Application Id | Application, Error | One application. |
| Create Application | Name, Description | Application, Error | Creates an application. |
| List Environments | Application Id | Environments, Error | Environments of an application. |
| Get Environment | Application Id, Environment Id | Environment, Error | State and alarms of an environment. |
| Create Environment | Application Id, Name, Description, Alarm Arns, Alarm Role Arn | Environment, Error | Creates an environment, optionally with rollback alarms. |
| List Configuration Profiles | Application Id, Type Filter | Profiles, Error | Profiles of an application. |
| Get Configuration Profile | Application Id, Configuration Profile Id | Profile, Error | Type, location and validators of a profile. |
| Create Configuration Profile | Application Id, Name, Type, Description, Location Uri, Retrieval Role Arn, Json Schema | Profile, Error | Creates a hosted (default) or external profile, optional JSON schema validator. |
| List Hosted Configuration Versions | Application Id, Configuration Profile Id, Version Label, Max Items | Versions, Error | Versions of a hosted profile (without content). |
| Get Hosted Configuration Version | Application Id, Configuration Profile Id, Version Number | Version, Error | One version including its content. |
| Create Hosted Configuration Version | Application Id, Configuration Profile Id, Content, Content Type, Description, Version Label, Latest Version Number | Version, Error | Uploads a new version (optimistic lock with Latest Version Number). |
| Validate Configuration | Application Id, Configuration Profile Id, Configuration Version | On Success / On Failure (Error) | Runs the profile's validators without deploying. |
Admin: deployments (latent unless noted)
| Node | Inputs | Outputs | Purpose |
| List Deployment Strategies | - | Strategies, Error | Your strategies and the predefined AppConfig.* ones. |
| Get Deployment Strategy | Deployment Strategy Id | Strategy, Error | Duration, growth and bake time of a strategy. |
| List Deployments | Application Id, Environment Id, Max Items | Deployments, Error | Deployments of an environment, newest first. |
| Get Deployment | Application Id, Environment Id, Deployment Number | Deployment, Error | State, progress and event log. |
| Start Deployment | Application Id, Environment Id, Deployment Strategy Id, Configuration Profile Id, Configuration Version, Description | Deployment, Error | Rolls a version out to an environment. |
| Stop Deployment | Application Id, Environment Id, Deployment Number, Allow Revert | Deployment, Error | Stops and rolls back (or reverts) a deployment. |
| Wait For Deployment | Application Id, Environment Id, Deployment Number, Poll Seconds, Timeout Seconds | On Completed / On Failure (Deployment, Error) | Polls until Complete, Rolled Back or Reverted. |
| Is Deployment Terminal Pure | State | Result | True for Complete, Rolled Back and Reverted. |
Credentials
| Mode | Use for | How |
| Cognito Identity Pool | Game clients | Guests get unauthenticated credentials; after Set Login Token the player gets the authenticated role. Credentials refresh automatically. |
| Static Keys | Development, live-ops tools, dedicated servers | Settings keys or Set Static Credentials. |
| Default Credential Chain | Servers and editor tools | Environment variables, the ~/.aws profile, ECS and EC2 instance roles. |
C++ API
// Build.cs: PublicDependencyModuleNames.Add("AppConfigLive");
#include "AppConfigLiveLibrary.h"
#include "AppConfigLiveSession.h"
UAppConfigLiveSession* Config = UAppConfigLiveLibrary::GetDefaultConfigSession(this);
Config->OnConfigurationChanged.AddDynamic(this, &UMyGameInstance::HandleConfigChanged);
Config->Fetch([](bool bOk, const FAppConfigLiveFetchResult& Result, const FAppConfigLiveError& Error)
{
// game thread
});
Config->StartPolling(0.f);
const bool bDoubleXp = Config->GetFlagEnabled(TEXT("double_xp"), false);
const float Discount = Config->GetValueFloat(TEXT("shop.discount"), 0.f);
The latent node classes (UAppConfigLiveStartSessionAction and the others) can be created from C++ through their static factory functions; bind the delegates, then call Activate().
Types
| Type | Kind | Members |
| UAppConfigLiveSession | Object | One application / environment / profile kept up to date; all session nodes, On Configuration Changed, On Error |
| FAppConfigLiveFlag | Struct | Name, Enabled, Attributes (JSON text values) |
| FAppConfigLiveChange | Struct | Source, Version Label, Initial, Changed / Added / Removed Flags, Changed Keys |
| FAppConfigLiveFetchResult | Struct | Changed, Version Label, Content Type, Text, Next Poll Interval Seconds |
| FAppConfigLiveIds | Struct | Application Id, Environment Id, Configuration Profile Id |
| FAppConfigLiveApplication / Environment / Profile | Struct | Control-plane resources (ids, names, state, alarms, location, type, validators) |
| FAppConfigLiveDeployment / DeploymentEvent / DeploymentStrategy | Struct | Deployment number, version, state, percentage, growth, bake time, timestamps, event log |
| FAppConfigLiveHostedVersion | Struct | Version Number, Description, Content Type, Version Label, KMS key, Content |
| FAppConfigLiveError | Struct | Code, Message, Http Status, Retryable |
| EAppConfigLiveSource | Enum | None, Live, Snapshot, Fallback, Override |
| EAppConfigLiveCachePolicy | Enum | Memory Only, Save Snapshot On Change, Save And Restore Snapshot |
| EAppConfigLiveProfileType | Enum | Freeform, Feature Flags |
| EAppConfigLiveDeploymentState / EnvironmentState | Enum | Baking, Validating, Deploying, Complete, Rolling Back, Rolled Back, Reverted / Ready For Deployment ... |
| EAppConfigLiveCredentialMode | Enum | Cognito Identity Pool, Static Keys, Default Credential Chain |
Settings
Project Settings > Plugins > AppConfigLive (saved to DefaultGame.ini).
| Setting | Default | Description |
| Region | us-east-1 | Region of your AppConfig application and identity pool. |
| Credential Mode | Cognito Identity Pool | Cognito Identity Pool, Static Keys or Default Credential Chain. |
| Identity Pool Id | (empty) | For example us-east-1:01234567-89ab-cdef-0123-456789abcdef. |
| Allow Guest Access | On | Unauthenticated identities before Set Login Token. |
| Access Key Id / Secret Access Key | (empty) | Static Keys mode - development and tools only. |
| Allow Static Keys In Shipping | Off | Settings keys are refused in Shipping builds unless enabled. |
| Application / Environment / Configuration Profile Identifier | (empty) | Names or ids used by Get Default Config Session. |
| Poll Interval Seconds | 60 | How often sessions poll (15 - 86400). |
| Required Minimum Poll Interval Seconds | 15 | Lower bound sent to AppConfig when a session starts. |
| Cache Policy | Save And Restore Snapshot | What sessions do with snapshots on disk. |
| Snapshot Directory | (empty = Saved/AppConfigLive) | Folder for snapshot files. |
| Endpoint Override | (empty) | Custom endpoint such as a local emulator. |
| Request Timeout Ms / Connect Timeout Ms | 30000 / 5000 | Time limits per request. |
| Max Retries | 3 | Automatic retries with back-off. |
| Worker Threads | 4 | Background threads for requests (Wait For Deployment occupies one while it waits). |
| Verify SSL / Log Sdk Warnings | On / On | TLS verification; SDK warnings to LogAppConfigLive. |
Troubleshooting
| Error code | Cause and fix |
NotConfigured | Identity pool, or the application / environment / profile identifiers, are empty. |
ResourceNotFoundException | Wrong application, environment or profile name/id, wrong region, or no deployment has been started to that environment yet. |
AccessDeniedException | The pool role lacks appconfig:StartConfigurationSession / GetLatestConfiguration on that resource (ids, not names, in the ARN). |
BadRequestException | Invalid parameters (poll interval out of range, malformed content). Expired tokens are renewed automatically. |
ThrottlingException | Polling too often across many players: raise Poll Interval Seconds. |
Unavailable | The SDK library could not be loaded or the engine is shutting down; see LogAppConfigLive. |
| Values stay at defaults | The profile is YAML / text (use Get Raw Text), the path is wrong (Get Value Keys helps), or the flag is multi-variant (see Overview). |
Credits
© 2026 Alpha XP — alphaxp.net · Support: support@alphaxp.net.
Includes the AWS SDK for C++ and the AWS Common Runtime (Apache License 2.0). Built for Unreal Engine 4.27 and 5.8.