Intelligent Compute
Seqera Intelligent Compute is in preview. Seqera must enable it on a per-workspace basis before you can use it. Contact your account manager to request access for one or more workspaces.
Intelligent Compute may assign different CPU and memory values to tasks than your pipeline's process directives specify. The scheduler picks the most cost-effective instance shape that meets each task's resource request.
Intelligent Compute is a scheduling service that runs Nextflow pipelines on a Seqera-managed Amazon ECS cluster. It allocates compute resources based on what each task needs rather than what the pipeline requests. This reduces cost and improves utilization across a run. Intelligent Compute is available only on AWS Cloud compute environments.
The standard AWS Cloud compute environment runs each pipeline on a single EC2 instance with a local executor. Intelligent Compute runs pipelines on multi-node ECS clusters that scale beyond a single instance.
When you enable Intelligent Compute on an AWS Cloud compute environment, Seqera provisions and manages the following resources in your AWS account on first use:
- An Amazon ECS cluster per compute environment configuration
- ECS capacity providers (Managed Instances or Auto Scaling Groups)
- ECS task definitions per container image and resource shape
- IAM roles for ECS task execution, EC2 instance profiles, and infrastructure management
- CloudWatch log groups under
/seqera(for example,/seqera/platform)
All managed resources use the seqera-sched- prefix. Seqera creates them on first use and removes them automatically when no longer needed.
IAM permissions
Intelligent Compute requires two IAM policies attached to the same IAM user or role that Seqera uses to access your AWS account:
- AWS Cloud policy — required for all AWS Cloud compute environments. If you have already set up an AWS Cloud compute environment, this policy is already in place.
- Intelligent Compute policy — additional permissions required specifically for Intelligent Compute.
AWS Cloud policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AwsCloudCreate",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:AddRoleToInstanceProfile",
"iam:CreateInstanceProfile",
"iam:AttachRolePolicy",
"iam:PutRolePolicy",
"iam:TagRole",
"iam:TagInstanceProfile"
],
"Resource": [
"arn:aws:iam::*:role/TowerForge-*",
"arn:aws:iam::*:instance-profile/TowerForge-*"
]
},
{
"Sid": "AwsCloudCreatePassRole",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": "arn:aws:iam::*:role/TowerForge-*"
},
{
"Sid": "AwsCloudLaunchEC2",
"Effect": "Allow",
"Action": [
"ec2:CreateTags",
"ec2:DeleteTags",
"ec2:DescribeInstances",
"ec2:RunInstances",
"ec2:TerminateInstances"
],
"Resource": "*"
},
{
"Sid": "AwsCloudLaunchLogs",
"Effect": "Allow",
"Action": [
"logs:GetLogEvents"
],
"Resource": "arn:aws:logs:*:*:log-group:*:log-stream:*"
},
{
"Sid": "AwsCloudLaunchS3",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "*"
},
{
"Sid": "AwsCloudDelete",
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:ListAttachedRolePolicies",
"iam:ListRolePolicies",
"iam:DeleteRole",
"iam:DeleteInstanceProfile",
"iam:RemoveRoleFromInstanceProfile",
"iam:DetachRolePolicy",
"iam:DeleteRolePolicy"
],
"Resource": [
"arn:aws:iam::*:role/TowerForge-*",
"arn:aws:iam::*:instance-profile/TowerForge-*"
]
},
{
"Sid": "AwsCloudRead",
"Effect": "Allow",
"Action": [
"ec2:DescribeInstanceTypes",
"ec2:DescribeKeyPairs",
"ec2:DescribeVpcs",
"ec2:DescribeImages",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"s3:ListAllMyBuckets"
],
"Resource": "*"
},
{
"Sid": "AwsCloudUserdataCheck",
"Effect": "Allow",
"Action": [
"ec2:GetConsoleOutput"
],
"Resource": "*"
},
{
"Sid": "OptionalLineageIntegrationSQSAndS3",
"Effect": "Allow",
"Action": [
"sqs:CreateQueue",
"sqs:GetQueueAttributes",
"sqs:SetQueueAttributes",
"sqs:GetQueueUrl",
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"s3:CreateBucket",
"s3:GetBucketNotification",
"s3:PutBucketNotification",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:sqs:*:*:seqera-lineage-*",
"arn:aws:s3:::seqera-lineage-*"
]
}
]
}
Download aws-cloud-full-policy.json
Intelligent Compute policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECSScopedOperations",
"Effect": "Allow",
"Action": [
"ecs:CreateCluster",
"ecs:DeleteCluster",
"ecs:DescribeClusters",
"ecs:PutClusterCapacityProviders",
"ecs:CreateCapacityProvider",
"ecs:DeleteCapacityProvider",
"ecs:DescribeCapacityProviders",
"ecs:RunTask",
"ecs:StopTask",
"ecs:DescribeTasks",
"ecs:DescribeContainerInstances",
"ecs:UpdateContainerInstancesState",
"ecs:TagResource"
],
"Resource": "arn:aws:ecs:*:*:*/seqera-sched-*"
},
{
"Sid": "ECSUnscopedOperations",
"Effect": "Allow",
"Action": [
"ecs:RegisterTaskDefinition",
"ecs:DeregisterTaskDefinition",
"ecs:DescribeTaskDefinition",
"ecs:ListTaskDefinitions",
"ecs:ListTaskDefinitionFamilies",
"ecs:ListTasks"
],
"Resource": "*"
},
{
"Sid": "IAMRoleManagement",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:GetRole",
"iam:DeleteRole",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:ListRolePolicies",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy",
"iam:ListAttachedRolePolicies",
"iam:CreateInstanceProfile",
"iam:GetInstanceProfile",
"iam:AddRoleToInstanceProfile",
"iam:ListInstanceProfilesForRole",
"iam:RemoveRoleFromInstanceProfile",
"iam:DeleteInstanceProfile"
],
"Resource": [
"arn:aws:iam::*:role/seqera-sched-*",
"arn:aws:iam::*:instance-profile/seqera-sched-*"
]
},
{
"Sid": "PassRoleToECS",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::*:role/seqera-sched-*",
"arn:aws:iam::*:role/TowerForge-*"
],
"Condition": {
"StringEquals": {
"iam:PassedToService": [
"ecs-tasks.amazonaws.com",
"ecs.amazonaws.com",
"ec2.amazonaws.com"
]
}
}
},
{
"Sid": "ServiceLinkedRoles",
"Effect": "Allow",
"Action": "iam:CreateServiceLinkedRole",
"Resource": "arn:aws:iam::*:role/aws-service-role/*",
"Condition": {
"StringEquals": {
"iam:AWSServiceName": [
"ecs.amazonaws.com",
"ecs-compute.amazonaws.com",
"autoscaling.amazonaws.com",
"spot.amazonaws.com"
]
}
}
},
{
"Sid": "CloudWatchLogs",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:DeleteLogGroup",
"logs:PutRetentionPolicy",
"logs:DescribeLogStreams",
"logs:GetLogEvents",
"logs:TagResource"
],
"Resource": "arn:aws:logs:*:*:log-group:/seqera/*"
},
{
"Sid": "EC2NetworkDiscovery",
"Effect": "Allow",
"Action": [
"ec2:DescribeImages",
"ec2:DescribeVpcs",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"ec2:DescribeRouteTables",
"ec2:DescribeVpcEndpoints",
"ec2:DescribeInstances",
"ec2:CreateSecurityGroup",
"ec2:CreateVpcEndpoint",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:CreateTags"
],
"Resource": "*"
},
{
"Sid": "ECRAccess",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "*"
},
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:ListAllMyBuckets"
],
"Resource": "*"
},
{
"Sid": "ASGEC2Operations",
"Effect": "Allow",
"Action": [
"ec2:DescribeInstanceTypes",
"ec2:CreateLaunchTemplate",
"ec2:DeleteLaunchTemplate",
"ec2:RunInstances"
],
"Resource": "*"
},
{
"Sid": "ASGManagement",
"Effect": "Allow",
"Action": [
"autoscaling:CreateAutoScalingGroup",
"autoscaling:UpdateAutoScalingGroup",
"autoscaling:DeleteAutoScalingGroup",
"autoscaling:CreateOrUpdateTags"
],
"Resource": "arn:aws:autoscaling:*:*:*/seqera-sched-*"
},
{
"Sid": "ASGDescribe",
"Effect": "Allow",
"Action": "autoscaling:DescribeAutoScalingGroups",
"Resource": "*"
},
{
"Sid": "SSMECSOptimizedAmi",
"Effect": "Allow",
"Action": "ssm:GetParameter",
"Resource": "arn:aws:ssm:*:*:parameter/aws/service/ecs/optimized-ami/*"
},
{
"Sid": "CostExplorer",
"Effect": "Allow",
"Action": "ce:GetCostAndUsage",
"Resource": "*"
}
]
}
Download aws-cloud-intelligent-compute-policy.json
Permission groups
| Group | Purpose |
|---|---|
ECSScopedOperations | Create, delete, describe, and tag ECS clusters, capacity providers, and tasks, and drain a faulty container instance so it stops receiving tasks. Scoped to seqera-sched-* resources. |
ECSUnscopedOperations | Register, deregister, list, and describe ECS task definitions. ECS task definition APIs do not support resource-level permissions. |
IAMRoleManagement | Create, update, and delete IAM roles and instance profiles scoped to seqera-sched-*. Seqera creates four role types on first use: execution role, infrastructure role, per-cluster instance role, and per-cluster task role. |
PassRoleToECS | Pass seqera-sched-* and TowerForge-* roles to ECS, ECS tasks, and EC2. Required to attach roles to ECS infrastructure and task definitions. |
ServiceLinkedRoles | Create service-linked roles for ECS, autoscaling, and Spot. Required only if these roles do not already exist in your account. |
CloudWatchLogs | Create and manage log groups under /seqera (for example, /seqera/platform), and read log events. Task stdout and stderr are written to CloudWatch. |
EC2NetworkDiscovery | Describe VPCs, subnets, security groups, and route tables. Create security groups and VPC endpoints. Used for VPC auto-discovery and network setup. |
ECRAccess | Authorize ECR and pull container images. ECS tasks pull images from ECR. |
S3Access | Read objects and list buckets. Used to read Fusion trace files and pipeline work directory content. |
ASGEC2Operations | Describe instance types and create or delete EC2 launch templates. Required only for Auto Scaling Group-backed clusters. |
ASGManagement | Create, update, and delete Auto Scaling Groups scoped to seqera-sched-*. Required only for Auto Scaling Group-backed clusters. |
ASGDescribe | Describe Auto Scaling Groups. Required only for Auto Scaling Group-backed clusters. |
SSMECSOptimizedAmi | Read the ECS-optimized AMI ID from SSM Parameter Store. Used to look up the latest Amazon Linux 2023 ECS-optimized AMI. |
CostExplorer | Query ce:GetCostAndUsage. Used to display cost post pipeline launch, after receiving data from AWS Cost Explorer with a 24-48 delay. If this permission is absent, cost predictions do not appear. |
Conditional statements:
ASGEC2Operations,ASGManagement, andASGDescribeare required only if Auto Scaling Group-backed clusters are enabled. You can omit them for Managed Instances deployments.ServiceLinkedRolesis required only if the listed service-linked roles do not already exist in your AWS account.CostExploreris required only if you want cost predictions at pipeline launch.
Create and attach the IAM policies
Both policies must be attached to the IAM user or role that Seqera uses to access your AWS account before you create the compute environment. Create each policy as follows:
- Open the AWS IAM console.
- Select Policies under Access management, then select Create policy.
- Select the JSON tab, paste the policy JSON, then select Next.
- Enter a name (for example,
SeqeraAwsCloudPolicy), then select Create policy. - Repeat steps 2–4 for the Intelligent Compute policy (for example,
SeqeraIntelligentComputePolicy). - Attach both policies to the IAM user or role that Seqera uses to access your AWS account.
Set up an AWS Cloud compute environment with Intelligent Compute
You need the following:
- Intelligent Compute enabled for your workspace by Seqera. Contact your account manager to request access.
- AWS credentials with both the standard AWS Cloud permissions and the Intelligent Compute permissions attached.
- In your Seqera workspace, select Compute Environments, then select Add compute environment.
- Enter a name and select AWS Cloud as the platform.
- Select your AWS credentials.
- Select the Region where Seqera provisions the ECS cluster.
- Enter a Work directory (S3 URI, for example
s3://my-bucket/work). - Under Compute Mode, enable the Seqera Intelligent Compute toggle.
- Configure the Intelligent Compute options as needed.
- Select Add.
Seqera validates credentials and configuration on save. On first use, it provisions the required IAM roles and ECS cluster in your account. Clusters and associated resources are removed automatically when no longer needed.
S3 bucket access
Intelligent Compute mints a dedicated IAM role per cluster in your AWS account and attaches it to the ECS tasks and EC2 instances that run your pipeline. The role's S3 permissions are derived from the compute environment's Allow buckets list:
- Empty list (default): the role grants S3 access account-wide (
"Resource": "*"). Every bucket in the account is reachable. - Populated list: the role grants access to the listed buckets only, plus the compute environment work directory and the work directory of the run being launched, which are added automatically.
Declaring buckets is opt-in least privilege: a compute environment that lists no buckets keeps account-wide access.
On each in-scope bucket the role grants:
| Actions | Resource |
|---|---|
s3:GetObject, s3:PutObject, s3:DeleteObject, s3:GetObjectTagging, s3:PutObjectTagging | arn:aws:s3:::<BUCKET_NAME>/* |
s3:ListBucket, s3:GetBucketLocation | arn:aws:s3:::<BUCKET_NAME> |
A populated Allow buckets list is the complete allow-list. A pipeline that reads or writes a bucket missing from the list fails with AccessDenied at task runtime — not at compute environment validation or pipeline launch. List every bucket your pipelines touch: reference or public data (for example, s3://ngi-igenomes), inputs staged from elsewhere, and the outdir. The compute environment and run work directories are added for you.
How entries are interpreted:
- An entry can be an
s3://URI or a bare bucket name. Entries for other storage providers (gs://,az://) and local paths are ignored. - A key prefix is discarded.
s3://shared-bucket/team-agrants access to all ofshared-bucket, not just theteam-aprefix. - An entry that is not a valid S3 bucket name is dropped.