Skip to main content
Running a single AWS account:
  1. Install the Fjall CLI.
  2. Connect your AWS account with fjall connect (see Getting Started).
  3. Scaffold the account infrastructure with fjall create account.
Running an AWS Organisation? Complete these first:
Deploy account infrastructure to your connected AWS account. In an organisation, deploy it to every member account other than the root or platform account. The account baseline holds the deploy role, the monitoring and audit roles, and the shared account-wide resources that applications build on. It runs once per account and region, before any application deploy.

Scaffold the account infrastructure

fjall account deploy deploys the CDK app at fjall/account/infrastructure.ts. fjall create account writes that file:
Run this once per project. If you scaffolded with fjall create organisation, the account component is already in place, so skip straight to the deploy.

Select the deployment target

A deployment target is an account and region pair, derived from your organisation config. Target names follow <account-name>-<abbreviated-region>, for example production-use1 or development-euw1. There is no manual AWS profile step. List the available targets:
The active target is marked with a and repeated on a trailing Active: line. Set a different one by name:
Confirm the active target:
fjall target set writes activeTarget to .fjall/local.json, which is not committed. It requires a Fjall login, and inside a project it requires the project’s organisation binding to match your current credential. Outside a project it refuses unless you pass --create-config. If the target’s region is not yet one of the organisation’s configured regions, it refuses unless you pass -y, --yes, which adds that region to the organisation config.
fjall account deploy auto-selects when the organisation has exactly one member account, so a single account spanning two regions still resolves without a prompt and you can skip this step. To override the active target for a single deploy, pass --target <name>. An unknown target name fails with the list of valid names, never a silent fallback.

Deploy the account

From the root of your project, run:
To deploy a specific member account without changing the active target, override it inline:
Tier deploys are noun-verb. fjall deploy account is retired and fails before authentication with a teaching error. fjall deploy takes application names only.

What happens

The deploy runs five steps:
  1. Authenticating with AWS: mints short-lived credentials for the resolved target.
  2. Connect securely: establishes the AWS context for the account and region.
  3. Prepare environment: synthesises the CloudFormation template and compares template hashes.
  4. Deploy infrastructure: applies the account stack.
  5. Enable monitoring: wires up the account monitoring resources.
The account stack provisions: The IAM globals (deploy role, monitoring role, audit role, CloudTrail, S3 Block Public Access) carry fixed names, so they are created only in the account’s home region. Other regions get the region-local resources. VPCs and security groups are not part of this stack. Fjall creates them per application at application deploy time. Security services (GuardDuty, Security Hub, AWS Config recorder, IAM Access Analyzer, Amazon Inspector) render into the account scaffold only when it was generated by fjall create organisation --security <tier>. A standalone fjall create account scaffold carries no governance profile.

The deploy role is capped by a permissions boundary

The account stack creates FjallDeployBoundary<orgId>, an account-global customer-managed policy, and attaches it to the FjallDeploy<orgId> role as its permissions boundary. This happens by default, whether or not the scaffold carries a governance profile: a scaffold with no securityTier still gets the hardened boundary, because the tier chooses which ceiling the role has, never whether it has one. The full policy, the three tiers and what each denies are documented on fjall connect, which installs the same policy through the quick-create template. To change the tier, or to opt out, edit the Account props in fjall/account/infrastructure.ts:
fjall create organisation --security <tier> writes securityTier into this file for you. There is no CLI flag for either setting on a deploy: both are properties of the infrastructure you are deploying, so they live in the file.
The opt-out is a create-time decision. Setting deployRoleBoundary: false on a role that is already capped fails the deploy, because the boundary denies iam:DeleteRolePermissionsBoundary — the role cannot remove its own ceiling. Uncapping an existing role is an administrator step from a principal outside the boundary. Setting securityTier and deployRoleBoundary: false together contradicts itself and fails at synth.

The boundary lands in two passes

The policy has to exist in the account before a bootstrap can point CDK’s execution role at it, so a new account converges over two deploys: Bootstrapping is per account and region, so each region converges on its own schedule. A region you deploy into later is capped by the first deploy that reaches it — usually an application deploy — not retroactively by the account deploy. Nothing is ever silently left uncapped. The first pass logs the state and the cure:
and the second logs the cap being applied:
A deploy that cannot read the policy — a throttled or denied iam:GetPolicy — warns and bootstraps without passing the boundary flag. That never loosens anything: CloudFormation carries the toolkit stack’s previous value through unchanged, so an already-capped role stays capped. A CDK line reading Removing existing permissions boundary during such a run is misleading and can be ignored; the parameter is carried over, not cleared.

Check which roles are capped

ListRoles does not return the PermissionsBoundary field, so any check built on a role listing reports every role as uncapped. Read it per role with get-role instead, through fjall aws exec so the call runs on Fjall-minted credentials:
A capped role answers with the boundary object — PermissionsBoundaryType of Policy and a PermissionsBoundaryArn ending in FjallDeployBoundary<orgId>. An uncapped one answers null. Run it once per deployment target to see the whole estate. fjall target list gives you the target names, and fjall org get gives you the organisation id. To read the policy itself, including which version is live and how many roles it caps:

Output

Interactive runs finish with a step tick-list titled Deploying account: account, then a Next Steps section pointing at fjall deploy. When the template is unchanged you see No changes to deploy. Your infrastructure is up to date. instead. Non-interactive runs print a summary block:

Options

--region, --all-regions, --skip-migrations and --skip-build belong to the application command, fjall deploy <app>. The tier leaves register only their own flags, so passing one of those here fails with error: unknown option. Use --target <name> instead, which carries the region.
“Standalone” here means an account deployed before any provider account is registered with an organisation. Once the account is org-membered, its stage lives in the organisation registry and is set by fjall connect or the web app. Passing -e, --environment to an org-membered account fails with a teaching error rather than restaging it.

Next Steps

Create Application

Scaffold your first application’s infrastructure.

Deploy Application

Deploy an application to your managed AWS account.

Understanding Profiles

See how Fjall derives AWS credentials and deployment targets.

Deployment Safety

Review the approval gates that guard destructive changes.