Administrator guide
Administrators manage FunctionPilot from Administration in the portal (PortalUrl): connections,
grants, roles, settings, the audit log, and the licence. Everything is stored in the stack's DynamoDB
table in your account, and every change is written to the audit log.
Roles
| Role | Can |
|---|---|
| User | Use the functions their grants allow: view, read logs, invoke, edit or manage, as granted. Save tests and run Logs Insights queries |
| Administrator | Every permission on every function of every connection (still bounded by each connection's access level), plus Administration: connections, grants, roles, settings, audit log, licence. Administrators can change and delete anyone's saved tests |
- Everyone who signs in without a role entry is a User, and sees no functions until a grant applies to them.
- Roles and grants match the user's email or groups. The email must be trusted: asserted by
your SAML IdP, verified by your OIDC IdP (
email_verified), or marked verified in the Cognito user pool (Identity providers). - In Administration › Roles, choose User or Group, enter the email or the group name exactly as your IdP sends it, choose Administrator or User, and Save role. A role for a user wins over a role for one of their groups, so you can make a group administrators and keep one member a User. A change applies on the user's next request.
- You can't remove your own Administrator role. Grant it to at least one more person or group.
The bootstrap admin
BootstrapAdminEmail (a stack parameter) is the bootstrap admin. The first person who signs in
with that email is bound to it by their immutable user ID (the Cognito sub) and is always an
Administrator, which prevents lock-out. The Roles page shows the entry as "Set by the stack
(bootstrap admin)". The binding is recorded in the audit log (bootstrap.bind). Someone else who
later signs in with the same email address but a different user ID is not the bootstrap admin.
Recovering the bootstrap admin
Reset the binding when the bootstrap admin's user ID changes (the user was recreated, the IdP issues
a new subject, or you switched IdentityProvider). Either:
- Use a different person: update the stack and change
BootstrapAdminEmail. The first sign-in with the new email takes over the binding. - Keep the same email: update the stack with
BootstrapAdminEmailset to another address you can sign in with, and sign in with it once. Then set it back and sign in with the original email, which takes the binding over again.
If another Administrator can still sign in, they can simply grant the Administrator role to the person by email under Administration › Roles.
Connections
A connection is one IAM role FunctionPilot assumes in one AWS account (Administration › Connections).
| Connection | Role | Set by |
|---|---|---|
| Local | The hub stack's local role, in the hub account | The stack: LocalAccessLevel and LocalRegions. It can't be changed or deleted in the portal |
| Spoke | A role created by the spoke role template in another account, assumed with an external ID | The spoke stack's AccessLevel, and the Regions you choose here |
Access levels
The access level of a connection's role is the ceiling for everyone, administrators included. Grants can narrow it per user or group but never widen it.
| Access level | FunctionPilot may | Permissions it allows |
|---|---|---|
ReadOnly | List functions, read configuration, metrics and logs, run Logs Insights | view, logs |
Operate | ReadOnly plus test invocations | plus invoke |
Full | Operate plus configuration, environment variables, versions, aliases and reserved concurrency, and code download | plus edit, manage |
No access level lets FunctionPilot change a function's code, delete a function, or use IAM,
CloudFormation, DynamoDB or S3 in the target account. Use ReadOnly for production accounts unless
teams need to test there.
Add a connection
- Deploy the spoke role in the account (installation guide). How to connect another AWS account at the bottom of the page shows the steps, the template URL and an AWS CLI command.
- Choose Add connection and enter:
- Id: a short name used in links, for example
production. It can't be changed later. - Name and AWS account id.
- Access level: the same as the spoke stack's
AccessLevel. - Role ARN: the spoke stack's
RoleArnoutput. It must be in that account and under the/functionpilot/path. - External ID: the same secret you gave the spoke stack (Generate makes a new one if you haven't deployed the stack yet). It is stored and never shown again; when you edit the connection, leave it empty to keep it.
- Regions to show.
- Id: a short name used in links, for example
- Save connection, then choose Test. The test assumes the role and lists the functions in each Region, and reports each Region's result or AWS error.
Each distinct AWS account counts against your plan's account limit, the hub account included (3 on Starter, 10 on Team, 50 on Business, unlimited on Enterprise). When the limit is reached, Add connection is disabled. Deleting a connection makes FunctionPilot stop using the role and makes grants on it stop applying; the role stays in the account until you delete its stack.
Grants
A grant gives a user or a group permissions on the functions whose names match patterns, on a connection (or all) in some Regions (or all) (Administration › Grants). A new grant, or a change, applies on the user's next request.
| Field | Values |
|---|---|
| Subject | A user (their sign-in email) or a group (the name as your IdP sends it in the groups claim) |
| Connection | One connection, or All connections (including ones you add later) |
| Regions | Some Regions, or All Regions |
| Function name patterns | One per line, up to 50, case-sensitive. * matches any run of characters, ? exactly one. For example orders-* or payments-api-?. Letters, digits, - and _ only besides the wildcards |
| Permissions | Any of the table below |
| Description | Optional, for your records |
| Permission | Allows | Implies | Needs the access level |
|---|---|---|---|
view | See the function, its configuration, charts and findings | ReadOnly | |
logs | Read its CloudWatch logs and run Logs Insights | view | ReadOnly |
invoke | Run test events, and see the public tests of the function | view | Operate |
edit | Change configuration and environment variables, and download code | view | Full |
manage | Publish versions, change aliases and reserved concurrency | view | Full |
- A user's permissions on a function are the union of every grant that matches them, through their email or any of their groups, capped by the connection's access level. The form shows Above ReadOnly (or the level) next to a permission the chosen connection can't allow.
- Matching functions previews which loaded functions the patterns match. Functions created later that match are covered automatically.
- Seeing environment variable values is a separate setting (see Settings), not a permission.
- A user with no matching grant gets "Function not found" for that function: FunctionPilot doesn't reveal that it exists.
- Grants don't apply to people working with personal AWS access; AWS decides for them.
How grants are enforced
Grants are enforced twice. FunctionPilot checks them on every request, and every AWS call runs with temporary credentials that a per-request session policy limits to exactly the actions and function ARNs the user's grants allow. Even if FunctionPilot's own check had a bug, AWS would refuse anything outside the grants. Every session carries the user's email as its source identity, so CloudTrail in each account names the person.
If someone's grants on one function would make a session policy larger than AWS allows, FunctionPilot
refuses the request ("too many grants") rather than widening it. Combine grants: use groups, and
patterns such as orders-* instead of many single names.
Examples:
| Goal | Grant |
|---|---|
| Developers can test freely in staging | group developers, staging, all Regions, *, view logs invoke |
| The checkout team reads its production functions | group checkout-team, production, eu-west-2, orders-* checkout-* payments-*, view logs |
| An on-call engineer can fix configuration everywhere | user [email protected], all connections, all Regions, *, view logs invoke edit |
| A release manager publishes versions and moves aliases | group release, production, all Regions, *, manage |
Settings
Administration › Settings:
| Setting | Default | Meaning |
|---|---|---|
| Default time range | Last 24 hours | Used when a link has no timeframe of its own. Only ranges your plan allows can be chosen |
| Who sees environment variable values | People with the Edit permission | Or Everyone who can view the function, or Administrators only. Everyone else sees the names only, and can't edit the variables |
| Metrics freshness (minutes) | 5 | 1 to 60. How long the function table's numbers (for ranges up to 24 hours) are reused before CloudWatch is asked again, and how often open pages refresh. Higher values cost less |
| Allowed IP ranges (CIDR) | empty (any network) | Business and above. One IPv4 or IPv6 range per line. People outside these ranges can sign in but can't use FunctionPilot. A list that doesn't contain your own address is refused, so you can't lock yourself out |
Personal AWS access settings
Team and above. These turn on personal AWS access, where people act with
their own AWS permissions instead of grants. The stack parameters IdentityCenterStartUrl,
IdentityCenterRegion and PersonalAccessKeys set the first values; from then on the settings here
apply.
| Setting | Meaning |
|---|---|
| IAM Identity Center | People connect their Identity Center session and choose their accounts and permission sets. Needs the AWS access portal URL (https://<id>.awsapps.com/start) and the Identity Center Region. While this is on, people who sign in to FunctionPilot through IAM Identity Center use their permission sets only, and grants never apply to them |
| Access keys | People may connect an IAM user's access keys (those who sign in through IAM Identity Center while it is on use Identity Center instead). FunctionPilot keeps only the temporary credentials, never the secret key |
| Regions for personal connections | The Regions shown for every personal connection. By default, the local connection's Regions |
With both methods off, everyone works through grants on your connections again. People can always disconnect a stored session, whatever the settings.
Audit log
Administration › Audit log lists events by UTC day, newest first, with the time, the actor, the action, the target and the source IP. Open an event for its details. Filter this page searches the events shown.
| Action | When |
|---|---|
bootstrap.bind | The bootstrap admin was bound to a user |
role.put, role.delete | A role was granted or removed |
connection.put, connection.delete | A connection was added, changed or deleted |
grant.put, grant.delete | A grant was added, changed or deleted |
settings.put | Settings were changed |
licence.refresh | An administrator checked the licence |
function.invoke | A test event ran (the function, version, status and test; never the payload) |
function.configuration | Configuration or environment variables changed (the names of the changed fields; never values) |
function.publish-version, function.alias.put, function.alias.delete, function.concurrency | Versions, aliases or reserved concurrency changed |
function.code-download | Someone downloaded a function's code |
test.put, test.delete | A saved test was created, changed or deleted |
personal.connect, personal.roles, personal.disconnect | Someone connected personal AWS access, chose accounts and permission sets, or disconnected (never tokens or keys) |
access.denied | A change or invocation was refused for a missing permission or an address outside the IP allowlist |
Events are kept for your plan's audit days: 30 on Starter, 90 on Team, 365 on Business and 3,650 on
Enterprise. Each event is also written as a JSON line ("kind": "audit") to the API's log group,
/aws/lambda/<NamePrefix>-api, kept for the stack's LogRetentionDays, so you can forward it to your
SIEM.
For a full trail, CloudTrail in each account records every Lambda, CloudWatch and Logs call
FunctionPilot makes, with sourceIdentity set to the user's email.
Licence and about
Administration › Licence and about shows your licence, your plan, CloudWatch usage and the installed version.
Licence
FunctionPilot reads your AWS Marketplace licence from AWS License Manager in the hub account. The page shows the status, the plan, the entitlements, when the licence is valid until and when it was last checked. Check licence now reads it again (FunctionPilot otherwise rechecks every few minutes).
| Status | Meaning |
|---|---|
| Active | The licence is valid |
| Grace period | License Manager is unreachable, or an active licence disappeared (for example while you move between plans). The last active plan keeps working for 72 hours |
| Expired | The grace period ended without an active licence |
| No licence | The account has no FunctionPilot licence |
Without a valid licence every page except this one says a licence is required. Nothing is deleted; subscribing again unlocks FunctionPilot.
Plan
What your plan includes lists the limits and features of your plan:
| Starter | Team | Business | Enterprise | |
|---|---|---|---|---|
| AWS accounts | 3 | 10 | 50 | unlimited |
| Saved tests per user | 25 | 200 | 1,000 | unlimited |
| Runs kept per saved test | 5 | 20 | 50 | 100 |
| Audit log kept | 30 days | 90 days | 365 days | 3,650 days |
| Longest time range | 7 days | 30 days | 30 days | 30 days |
| Function table, function pages, test workbench, private saved tests with history, log explorer with live tail, grants, audit log, IAM Identity Center and Cognito sign-in | yes | yes | yes | yes |
| Shared (public) tests, configuration changes, Logs Insights, SAML and OIDC sign-in, personal AWS access | yes | yes | yes | |
| Findings, cost estimates, IP allowlist | yes | yes |
Features your plan doesn't include show a plan badge, and FunctionPilot refuses them. To change plan, see Upgrading.
CloudWatch usage
FunctionPilot's own AWS cost is mostly CloudWatch: metrics are billed per metric returned and Logs Insights per GB scanned. The CloudWatch usage card shows the last 30 days: the estimated cost, what the shared cache saved, the cache hit rate, the metrics requested and the data Insights scanned, with a chart of metrics requested from CloudWatch and served from the cache per day. The estimates use list prices (about $0.01 per 1,000 metrics and $0.005 per GB scanned); your AWS bill is the record. To lower the cost, raise Metrics freshness in Settings.
Version and updates
The version card shows the installed version and, when update checks are on (UpdateChecks), the
latest release, its summary and release notes, whether it is a security release, the oldest supported
version, and How to upgrade with the template URL and an AWS CLI command. A banner on the
Administration pages announces a newer release once. See Upgrading.
Something unclear or missing? Email [email protected].