---
title: Managed Resource Activation Policies
weight: 20
state: alpha
alphaVersion: 2.0
description: Choose which provider resources Crossplane activates
---
{{}}
Managed resource activation policies work with
[managed resource definitions]({{[}}),
which Crossplane v2.0+ enables by default. To disable this behavior, set
`--enable-custom-to-managed-resource-conversion=false` when installing
Crossplane.
{{]}}
A `ManagedResourceActivationPolicy` (MRAP) controls which
[ManagedResourceDefinitions]({{[}})
become active in your cluster. MRAPs enable selective installation of provider
resources, allowing you to activate only the 10 managed resources you need
instead of the 100+ that a provider ships.
## The selective activation problem
Modern Crossplane providers can ship dozens or hundreds of managed resources,
but most users only need a small subset. Before MRAPs, you got "all or
nothing" - installing a provider meant getting every managed resource it
supported, consuming unnecessary cluster resources.
MRAPs solve this by providing pattern-based activation of
ManagedResourceDefinitions, letting you choose which provider resources to
enable.
## How MRAPs work
MRAPs contain activation patterns that match ManagedResourceDefinition names.
When you create or update an MRAP, Crossplane:
1. **Lists all MRDs** in the cluster
2. **Matches MRD names** against the activation patterns
3. **Activates matching MRDs** by setting their `state` to `Active`
4. **Updates the MRAP status** with the list of activated resources
```yaml
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: ManagedResourceActivationPolicy
metadata:
name: aws-core-resources
spec:
activate:
- buckets.s3.aws.m.crossplane.io # Modern v2 style S3 buckets
- instances.rds.aws.m.crossplane.io # Modern v2 style RDS instances
- "*.ec2.aws.m.crossplane.io" # All modern v2 style EC2 resources
```
When you apply this MRAP, Crossplane activates the specified S3 Bucket, RDS
Instance, and all EC2 resources, leaving other AWS resources inactive.
## Key features
- **Pattern-based matching**: Use wildcards to activate groups of resources
- **Multiple policy support**: Different MRAPs can activate different resource
sets
- **Status tracking**: See which resources each policy activated
- **Automatic activation**: New MRDs matching existing patterns activate
automatically
## Pattern matching
### Exact matching
Specify complete MRD names for precise control:
```yaml
spec:
activate:
- buckets.s3.aws.m.crossplane.io
- databases.rds.aws.m.crossplane.io
- clusters.eks.aws.m.crossplane.io
```
### Wildcard patterns
Use `*` wildcards to match multiple resources:
```yaml
spec:
activate:
- "*.s3.aws.m.crossplane.io" # All S3 resources
- "*.ec2.aws.m.crossplane.io" # All EC2 resources
- "*.rds.aws.m.crossplane.io" # All RDS databases
```
{{}}
MRAPs use prefix-only wildcards, not full regular expressions. Only `*` at
the beginning of a pattern works (for example, `*.s3.aws.m.crossplane.io`).
Patterns like `s3.*.aws.m.crossplane.io` or `*.s3.*` aren't valid.
{{}}
{{}}
You can mix exact names and wildcards for flexible activation:
```yaml
spec:
activate:
- buckets.s3.aws.m.crossplane.io # Exact S3 buckets
- "*.ec2.aws.m.crossplane.io" # All EC2 resources
- clusters.eks.aws.m.crossplane.io # Exact EKS clusters
```
{{}}
## Legacy and modern resource versions
Crossplane v2 supports two styles of managed resources:
- **Modern v2 style** (recommended): Use `*.m.crossplane.io` domains for
namespaced managed resources with better isolation and security
- **Legacy v1 style**: Use `*.crossplane.io` domains for cluster-scoped
managed resources (maintained for backward compatibility)
### Activating modern resources
Most examples in this guide use modern v2 style resources:
```yaml
spec:
activate:
- buckets.s3.aws.m.crossplane.io # Modern v2 S3 bucket
- "*.ec2.aws.m.crossplane.io" # All modern v2 EC2 resources
```
### Activating legacy resources
To activate legacy v1 style resources, use patterns without `.m`:
```yaml
spec:
activate:
- buckets.s3.aws.crossplane.io # Legacy v1 S3 bucket
- "*.ec2.aws.crossplane.io" # All legacy v1 EC2 resources
```
### Mixed activation
You can activate both modern and legacy resources in the same MRAP:
```yaml
spec:
activate:
- "*.aws.m.crossplane.io" # All modern AWS resources
- "*.aws.crossplane.io" # All legacy AWS resources
```
## Common activation strategies
### Activate everything (default behavior)
The Crossplane Helm chart creates a default MRAP that activates all resources:
```yaml
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: ManagedResourceActivationPolicy
metadata:
name: default
spec:
activate:
- "*" # Activate all MRDs
```
You can customize this during installation:
```shell
# Disable default activations entirely
helm install crossplane crossplane-stable/crossplane \
--set provider.defaultActivations={}
# Or provide custom default activations
helm install crossplane crossplane-stable/crossplane \
--set provider.defaultActivations={\
"*.s3.aws.m.crossplane.io","*.ec2.aws.m.crossplane.io"}
```
### Provider-specific activation
Activate all resources from specific providers:
```yaml
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: ManagedResourceActivationPolicy
metadata:
name: aws-provider-resources
spec:
activate:
- "*.aws.crossplane.io" # All AWS resources
- "*.aws.m.crossplane.io" # All AWS managed resources (v2 style)
```
### Service-specific activation
Activate resources for specific cloud services:
```yaml
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: ManagedResourceActivationPolicy
metadata:
name: storage-and-compute
spec:
activate:
- "*.s3.aws.m.crossplane.io" # AWS S3 resources
- "*.ec2.aws.m.crossplane.io" # AWS EC2 resources
- "*.storage.gcp.m.crossplane.io" # GCP Storage resources
- "*.compute.gcp.m.crossplane.io" # GCP Compute resources
```
### Minimal activation
Activate only the resources you know you need:
```yaml
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: ManagedResourceActivationPolicy
metadata:
name: minimal-footprint
spec:
activate:
- buckets.s3.aws.m.crossplane.io # Just S3 buckets
- instances.ec2.aws.m.crossplane.io # Just EC2 instances
- databases.rds.aws.m.crossplane.io # Just RDS databases
```
## Multiple MRAPs
You can have multiple MRAPs in your cluster. Crossplane processes all MRAPs
together and activates any MRD that matches at least one pattern.
### Team-based activation
Different teams can manage their own activation policies:
```yaml
# Storage team MRAP
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: ManagedResourceActivationPolicy
metadata:
name: storage-team
spec:
activate:
- "*.s3.aws.m.crossplane.io"
- "*.storage.gcp.m.crossplane.io"
---
# Database team MRAP
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: ManagedResourceActivationPolicy
metadata:
name: database-team
spec:
activate:
- "*.rds.aws.m.crossplane.io"
- "*.sql.gcp.m.crossplane.io"
```
### Configuration package activation
Configuration packages can include MRAPs to declare their resource dependencies:
```yaml
# In your Configuration package
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: ManagedResourceActivationPolicy
metadata:
name: web-platform-dependencies
spec:
activate:
- buckets.s3.aws.m.crossplane.io # For static assets
- instances.ec2.aws.m.crossplane.io # For web servers
- databases.rds.aws.m.crossplane.io # For application data
- certificates.acm.aws.m.crossplane.io # For HTTPS
```
## Working with MRAPs
### Creating MRAPs
Apply an MRAP like any Kubernetes resource:
```shell
kubectl apply -f my-activation-policy.yaml
```
### Viewing MRAPs
List all MRAPs:
```shell
kubectl get managedresourceactivationpolicies
```
View MRAP details and status:
```shell
kubectl describe mrap aws-core-resources
```
### Checking activation status
MRAPs track which resources they've activated:
```yaml
status:
conditions:
- type: Healthy
status: "True"
reason: Running
activated:
- buckets.s3.aws.m.crossplane.io
- instances.ec2.aws.m.crossplane.io
- instances.rds.aws.m.crossplane.io
- securitygroups.ec2.aws.m.crossplane.io
- subnets.ec2.aws.m.crossplane.io
- vpcs.ec2.aws.m.crossplane.io
```
## MRAP status conditions
### Healthy condition
- **`Healthy: True, Reason: Running`**: MRAP works
- **`Healthy: Unknown, Reason: EncounteredErrors`**: Some MRDs failed to
activate
## Troubleshooting MRAPs
### MRAP exists but resources aren't activated
**Symptoms**: MRAP shows `activated: []` or missing expected resources
**Causes and solutions:**
1. **Pattern doesn't match MRD names**
```shell
# List available MRDs
kubectl get mrds
# Check your pattern matches
kubectl get mrds -o name | grep "your-pattern"
```
2. **MRDs don't exist yet**
- Install the required provider first
- Providers create MRDs when they start
3. **Provider doesn't support activation**
```shell
# Check provider capabilities
kubectl get providerrevision \
-o jsonpath='{.status.capabilities}'
# Look for "safe-start"
```
### MRAP shows activation errors
**Symptoms**: MRAP has `Healthy: Unknown` status with errors
**Status condition example:**
```yaml
conditions:
- type: Healthy
status: "Unknown"
reason: EncounteredErrors
message: "failed to activate 2 of 5 ManagedResourceDefinitions"
```
**Solution**: select MRAP events for specific failure details:
```shell
kubectl describe mrap
# Look at the Events section for activation errors
```
### Resources activate when you don't expect them to
**Symptoms**: more resources are active than expected
**Cause**: multiple MRAPs with overlapping patterns (this is normal behavior)
**Solution**: review all MRAP patterns to understand which policies are
activating which resources
```shell
# List all MRAP activation patterns
kubectl get mrap \
-o jsonpath='{range .items[*]}{.metadata.name}: {.spec.activate}{"\n"}{end}'
# Check which MRAPs activated each resource
kubectl get mrap \
-o jsonpath='{range .items[*]}{.metadata.name}: {.status.activated}{"\n"}{end}'
```
## Best practices
MRAPs are additive - multiple MRAPs can activate the same resource without
conflicts. This enables team-based activation strategies and Configuration
package dependencies.
1. **Start specific, broaden as needed** - Begin with exact resource names,
add wildcards only when beneficial for maintainability
2. **Plan for provider evolution** - Design wildcard patterns that
accommodate new resources as providers add them (for example,
`*.s3.aws.m.crossplane.io` works for future S3 resources)
3. **Group related resources logically** - Create MRAPs that activate
resources teams actually use together
4. **Include activation dependencies in Configuration packages** -
Configuration packages should declare what MRDs they need rather than
assuming resources are available
5. **Use conservative patterns in shared environments** - Avoid overly broad
wildcards that activate unnecessary resources when multiple teams share
providers
## Next steps
- Learn about
[ManagedResourceDefinitions]({{][}})
to understand what MRAPs activate
- See the
[disabling unused managed resources guide]({{][}})
for step-by-step implementation
- Check the [API reference]({{][}}) for complete MRAP schema
documentation
]