Skip to main content

Azure Environment Initialization

This guide covers everything you need to initialize a Fractal Cloud environment on Microsoft Azure.

Prerequisites​

We recommend that an administrator performs environment initialization, as the Azure principal will need privileged access.

An administrator may assign the Contributor and Role Based Access Control Administrator roles to allow a group of principals to perform environment initialization independently. See Managing service principal roles for details.

Initialize via Web UI​

Ensure you have assigned the roles Contributor and Role Based Access Control Administrator on the subscription you want to initialize.

Troubleshooting: KeyVault registration​

If you receive this error regarding KeyVault:

Azure KeyVault Error

You need to register the Microsoft.KeyVault resource provider. Choose one of these methods:

Azure Portal:

  1. Go to the Azure Portal, navigate to Subscriptions and select your subscription.
  2. In the left-hand menu under Settings, select Resource providers.
  3. In the "Filter by name" box, type Microsoft.KeyVault.
  4. Click the "..." button on the Microsoft.KeyVault row and select Register.

Azure CLI:

az provider register -n "Microsoft.KeyVault"

The registration status will take a few seconds to update.

Once configured, follow the general Web UI steps to complete the initialization.

Initialize via SDK​

Step 1: Create a Service Principal​

Create a Service Principal and assign the required roles on each subscription where the Cloud Agent needs access:

# Create the service principal
az ad sp create-for-rbac --name "Fractal Cloud Initializer"

# Grant required roles on the target subscription
az role assignment create \
--assignee <SERVICE_PRINCIPAL_ID> \
--role "Contributor" \
--scope /subscriptions/<SUBSCRIPTION_ID>

az role assignment create \
--assignee <SERVICE_PRINCIPAL_ID> \
--role "Role Based Access Control Administrator" \
--scope /subscriptions/<SUBSCRIPTION_ID>

Step 2: Verify role assignments​

az ad app permission list --id <SERVICE_PRINCIPAL_ID>

You should see both Contributor and Role Based Access Control Administrator scoped to your subscription.

Step 3: Run the initialization​

Follow the environment initialization sample to initialize the environment programmatically.

Important

Do not manually modify any resources within the rg-fractal Resource Group.


Initialize with OIDC (Workload Identity Federation)​

The service-principal flow above authenticates the Cloud Agent with a client secret. When you run the SDK from a CI/CD pipeline that already issues OIDC tokens — such as GitHub Actions or GitLab CI/CD — you can initialize the agent without any long-lived secret by using Azure Workload Identity Federation.

The pipeline mints a short-lived OIDC token, and the SDK forwards it to Fractal Cloud as the client assertion. Azure trusts it because you registered a federated credential on the app registration that maps your pipeline's issuer and subject to the app. No secret ever leaves the runner.

Availability

OIDC-based initialization is currently supported for Azure. AWS and GCP continue to use their static credential flows.

Step 1 — Register the federated credential​

Create (or reuse) an app registration for the Cloud Agent and add a federated credential that trusts your pipeline. The subject must match the token your CI system issues (the example below trusts the main branch of a GitHub repo):

az ad app federated-credential create \
--id <APP_REGISTRATION_CLIENT_ID> \
--parameters '{
"name": "fractal-cloud-github-main",
"issuer": "https://token.actions.githubusercontent.com",
"subject": "repo:<ORG>/<REPO>:ref:refs/heads/main",
"audiences": ["api://AzureADTokenExchange"]
}'

Assign the same Contributor and Role Based Access Control Administrator roles to this app registration as in the service-principal flow above.

GitLab CI/CD

For GitLab, set issuer to your instance's OIDC issuer (e.g. https://gitlab.com) and subject to the matching sub claim of the GitLab ID token (e.g. project_path:<group>/<project>:ref_type:branch:ref:main).

Step 2 — Mint the token and initialize​

In sp mode you pass the client id and secret; in oidc mode you pass the (public) client id and a freshly-minted federated token. The SDK forwards the token as the Azure client assertion — nothing else changes.

// GitHub Actions exposes an OIDC token endpoint when the job has
// `permissions: id-token: write`. Request a token whose audience is Azure AD's
// token exchange, then hand it to the SDK as the federated token.
async function fetchAzureFederatedToken(): Promise<string> {
const url = process.env.ACTIONS_ID_TOKEN_REQUEST_URL!;
const requestToken = process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN!;
const audience = 'api://AzureADTokenExchange';
const res = await fetch(`${url}&audience=${encodeURIComponent(audience)}`, {
headers: {Authorization: `Bearer ${requestToken}`},
});
const body = (await res.json()) as {value: string};
return body.value;
}

const federatedToken = await fetchAzureFederatedToken();

await deployEnvironment(management, credentials, {
agentInit: 'wait',
providerCredentials: {
// OIDC (secretless): public client id + short-lived federated token.
azure: {clientId: process.env.AZURE_SP_CLIENT_ID!, federatedToken},
// Service-principal (default): client id + secret.
// azure: {spClientId: '...', spClientSecret: '...'},
},
});

In your GitHub Actions workflow, grant the job the id-token permission:

permissions:
id-token: write # required to mint the OIDC token
contents: read

The TypeScript SDK samples basic_environment sample runs in both modes — set AZURE_CLOUD_AGENT_AUTH=oidc to select the federated flow (default is sp).


Optional: MS Graph permissions for App Role assignments​

Do I need this?

You only need this section if your components use RoleType.APP_ROLE_ASSIGNMENT or any CustomWorkloadRole that requires assigning MS Graph App Roles.

If your components use only Azure built-in roles or standard Azure RBAC roles, skip this section entirely.

Some components, such as AzureWebApp, allow you to add roles using the SDK:

withRole(CustomWorkloadRole role)
withRoles(List<CustomWorkloadRole> roles)

When using RoleType.APP_ROLE_ASSIGNMENT, Azure Active Directory App Role assignment capabilities are required. These permissions are not assigned automatically during initialization. You must configure them manually.

Required permissions​

Grant the following Microsoft Graph Application permissions to the Cloud Agent's managed identity (id-fractal-cloud-agent):

Permission NamePermission IDPurpose
AppRoleAssignment.ReadWrite.All9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30Assign and remove App Roles
Directory.ReadWrite.All06b708a9-e830-4db3-a914-8e69da51d44fModify directory objects for role assignments

Add the permissions​

Replace <MANAGED_IDENTITY_OBJECT_ID> with the object ID of the id-fractal-cloud-agent identity:

az ad app permission add \
--id <MANAGED_IDENTITY_OBJECT_ID> \
--api 00000003-0000-0000-c000-000000000000 \
--api-permissions 9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30=Role

az ad app permission add \
--id <MANAGED_IDENTITY_OBJECT_ID> \
--api 00000003-0000-0000-c000-000000000000 \
--api-permissions 06b708a9-e830-4db3-a914-8e69da51d44f=Role

A Global Administrator or Privileged Role Administrator must approve these permissions. Follow Microsoft's guidance on granting admin consent.

Verify​

az ad app permission list --id <MANAGED_IDENTITY_OBJECT_ID>

You should see AppRoleAssignment.ReadWrite.All and Directory.ReadWrite.All listed.

Summary
Use CaseRequires manual MS Graph setup?
Standard Azure environment initializationNo
Components using Azure built-in RBAC rolesNo
Components using custom Azure RBAC rolesNo
Components using RoleType.APP_ROLE_ASSIGNMENTYes