> ## Documentation Index
> Fetch the complete documentation index at: https://alto.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# EC2

> Use `type: ec2` to run your code on an EC2 instance

## Example

Here's a simple configuration for an EC2 agent:

```yaml alto.yml theme={null}
my-new-ec2-agent:
  infra:
    type: ec2
    instance_type: t2.micro
    ami_image: ami-01c647eace872fc02
    python_version: '3.11'
  ...
```

## Prerequisites

EC2 agents rely on the boto3 and botocore packages. These require you to set up
authentication credentials for your AWS account. More information can be found [here](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#configuration).

<Warning>You must configure your Boto3 credentials in order to use EC2 agents.</Warning>

## IAM permissions

EC2 agents require your AWS credentials to list, modify, create, and delete certain
resources (e.g., key pairs, security groups, EC2 instances, etc.). The specific
resources required depend on the `protocol` you use when creating, modifying, and
running your instance.

There are two `protocol` options: `ssh`, and `ssm`. The `ssh` protocol manages your
instance via the SSH / SCP protocols, whereas the `ssm` protocol manages your instance
via AWS Systems Manager.

You'll need to make sure your account has the necessary privileges to create resources
for your requested protocol. Contact your account administrator to help out with this.

You can use the following policy document to provision your account with the necessary
permissions:

<Accordion title="SSH IAM policy document">
  ```json theme={null}
  {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowGetAccessKeyLastUsed",
            "Effect": "Allow",
            "Action": "iam:GetAccessKeyLastUsed",
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowGetUser",
            "Effect": "Allow",
            "Action": "iam:GetUser",
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:GetConsole*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances",
                "ec2:CreateTags"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*::image/ami-*",
                "arn:aws:ec2:*:*:key-pair/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateKeyPair",
                "ec2:DeleteKeyPair",
                "ec2:CreateSecurityGroup",
                "ec2:DeleteSecurityGroup",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSecurityGroupRules",
                "ec2:DescribeTags"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:ModifySecurityGroupRules",
                "ec2:UpdateSecurityGroupRuleDescriptionsIngress",
                "ec2:UpdateSecurityGroupRuleDescriptionsEgress"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ModifySecurityGroupRules"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:security-group-rule/*"
            ]
        }
    ]
  }
  ```
</Accordion>

<Accordion title="SSM IAM policy document">
  <Note>
    Certain IAM permissions are not necessary if you plan on using the SSM protocol
    with a pre-existing instance profile. Work with your cloud administrator to provision the necessary
    permissions.
  </Note>

  ```json theme={null}
  {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "logs:DescribeLogGroups",
                "ssm:GetCommandInvocation"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "ssm:SendCommand",
                "iam:CreateInstanceProfile",
                "iam:DeleteInstanceProfile",
                "iam:RemoveRoleFromInstanceProfile",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:AttachRolePolicy",
                "iam:AddRoleToInstanceProfile",
                "iam:ListInstanceProfilesForRole",
                "logs:CreateLogStream",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "iam:ListAttachedRolePolicies"
            ],
            "Resource": [
                "arn:aws:ec2:*:066259261150:instance/*",
                "arn:aws:ssm:*::document/AWS-RunShellScript",
                "arn:aws:ssm:*:066259261150:document/*",
                "arn:aws:logs:*:066259261150:log-group:*:log-stream:*",
                "arn:aws:iam::066259261150:instance-profile/*",
                "arn:aws:iam::066259261150:role/*"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "logs:DeleteLogGroup",
            "Resource": "arn:aws:logs:*:066259261150:log-group:*"
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "ec2:TerminateInstances",
                "logs:StartLiveTail",
                "ec2:CreateTags",
                "ec2:RunInstances",
                "ec2:AssociateIamInstanceProfile"
            ],
            "Resource": [
                "arn:aws:ec2:*:066259261150:instance/*",
                "arn:aws:ec2:*:066259261150:network-interface/*",
                "arn:aws:ec2:*:066259261150:subnet/*",
                "arn:aws:ec2:*:066259261150:security-group/*",
                "arn:aws:ec2:*:066259261150:volume/*",
                "arn:aws:ec2:*::image/*",
                "arn:aws:s3:::*/*",
                "arn:aws:logs:*:066259261150:log-group:*"
            ]
        },
        {
            "Sid": "VisualEditor4",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "s3:CreateBucket",
                "s3:ListBucket",
                "logs:CreateLogGroup"
            ],
            "Resource": [
                "arn:aws:iam::066259261150:role/*",
                "arn:aws:logs:*:066259261150:log-group:*",
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "VisualEditor5",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "logs:GetLogEvents"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:logs:*:066259261150:log-group:*:log-stream:*"
            ]
        },
        {
            "Sid": "VisualEditor6",
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        }
      ]
  }
  ```
</Accordion>

## Key Specification

The EC2 `infra` accepts the following keys:

```yaml alto.yml theme={null}
my-new-ec2-agent:
  infra:
    type: ec2
    instance_type: a1.medium|a1.large|a1.xlarge|a1.2xlarge|a1.4xlarge|a1.metal|c1.medium|c1.xlarge|c3.large|c3.xlarge|c3.2xlarge|c3.4xlarge|c3.8xlarge|c4.large|c4.xlarge|c4.2xlarge|c4.4xlarge|c4.8xlarge|c5.large|c5.xlarge|c5.2xlarge|c5.4xlarge|c5.9xlarge|c5.12xlarge|c5.18xlarge|c5.24xlarge|c5.metal|c5a.large|c5a.xlarge|c5a.2xlarge|c5a.4xlarge|c5a.8xlarge|c5a.12xlarge|c5a.16xlarge|c5a.24xlarge|c5ad.large|c5ad.xlarge|c5ad.2xlarge|c5ad.4xlarge|c5ad.8xlarge|c5ad.12xlarge|c5ad.16xlarge|c5ad.24xlarge|c5d.large|c5d.xlarge|c5d.2xlarge|c5d.4xlarge|c5d.9xlarge|c5d.12xlarge|c5d.18xlarge|c5d.24xlarge|c5d.metal|c5n.large|c5n.xlarge|c5n.2xlarge|c5n.4xlarge|c5n.9xlarge|c5n.18xlarge|c5n.metal|c6g.medium|c6g.large|c6g.xlarge|c6g.2xlarge|c6g.4xlarge|c6g.8xlarge|c6g.12xlarge|c6g.16xlarge|c6g.metal|c6gd.medium|c6gd.large|c6gd.xlarge|c6gd.2xlarge|c6gd.4xlarge|c6gd.8xlarge|c6gd.12xlarge|c6gd.16xlarge|c6gd.metal|c6gn.medium|c6gn.large|c6gn.xlarge|c6gn.2xlarge|c6gn.4xlarge|c6gn.8xlarge|c6gn.12xlarge|c6gn.16xlarge|c6i.large|c6i.xlarge|c6i.2xlarge|c6i.4xlarge|c6i.8xlarge|c6i.12xlarge|c6i.16xlarge|c6i.24xlarge|c6i.32xlarge|c6i.metal|cc1.4xlarge|cc2.8xlarge|cg1.4xlarge|cr1.8xlarge|d2.xlarge|d2.2xlarge|d2.4xlarge|d2.8xlarge|d3.xlarge|d3.2xlarge|d3.4xlarge|d3.8xlarge|d3en.xlarge|d3en.2xlarge|d3en.4xlarge|d3en.6xlarge|d3en.8xlarge|d3en.12xlarge|dl1.24xlarge|f1.2xlarge|f1.4xlarge|f1.16xlarge|g2.2xlarge|g2.8xlarge|g3.4xlarge|g3.8xlarge|g3.16xlarge|g3s.xlarge|g4ad.xlarge|g4ad.2xlarge|g4ad.4xlarge|g4ad.8xlarge|g4ad.16xlarge|g4dn.xlarge|g4dn.2xlarge|g4dn.4xlarge|g4dn.8xlarge|g4dn.12xlarge|g4dn.16xlarge|g4dn.metal|g5.xlarge|g5.2xlarge|g5.4xlarge|g5.8xlarge|g5.12xlarge|g5.16xlarge|g5.24xlarge|g5.48xlarge|g5g.xlarge|g5g.2xlarge|g5g.4xlarge|g5g.8xlarge|g5g.16xlarge|g5g.metal|hi1.4xlarge|hpc6a.48xlarge|hs1.8xlarge|h1.2xlarge|h1.4xlarge|h1.8xlarge|h1.16xlarge|i2.xlarge|i2.2xlarge|i2.4xlarge|i2.8xlarge|i3.large|i3.xlarge|i3.2xlarge|i3.4xlarge|i3.8xlarge|i3.16xlarge|i3.metal|i3en.large|i3en.xlarge|i3en.2xlarge|i3en.3xlarge|i3en.6xlarge|i3en.12xlarge|i3en.24xlarge|i3en.metal|im4gn.large|im4gn.xlarge|im4gn.2xlarge|im4gn.4xlarge|im4gn.8xlarge|im4gn.16xlarge|inf1.xlarge|inf1.2xlarge|inf1.6xlarge|inf1.24xlarge|is4gen.medium|is4gen.large|is4gen.xlarge|is4gen.2xlarge|is4gen.4xlarge|is4gen.8xlarge|m1.small|m1.medium|m1.large|m1.xlarge|m2.xlarge|m2.2xlarge|m2.4xlarge|m3.medium|m3.large|m3.xlarge|m3.2xlarge|m4.large|m4.xlarge|m4.2xlarge|m4.4xlarge|m4.10xlarge|m4.16xlarge|m5.large|m5.xlarge|m5.2xlarge|m5.4xlarge|m5.8xlarge|m5.12xlarge|m5.16xlarge|m5.24xlarge|m5.metal|m5a.large|m5a.xlarge|m5a.2xlarge|m5a.4xlarge|m5a.8xlarge|m5a.12xlarge|m5a.16xlarge|m5a.24xlarge|m5ad.large|m5ad.xlarge|m5ad.2xlarge|m5ad.4xlarge|m5ad.8xlarge|m5ad.12xlarge|m5ad.16xlarge|m5ad.24xlarge|m5d.large|m5d.xlarge|m5d.2xlarge|m5d.4xlarge|m5d.8xlarge|m5d.12xlarge|m5d.16xlarge|m5d.24xlarge|m5d.metal|m5dn.large|m5dn.xlarge|m5dn.2xlarge|m5dn.4xlarge|m5dn.8xlarge|m5dn.12xlarge|m5dn.16xlarge|m5dn.24xlarge|m5dn.metal|m5n.large|m5n.xlarge|m5n.2xlarge|m5n.4xlarge|m5n.8xlarge|m5n.12xlarge|m5n.16xlarge|m5n.24xlarge|m5n.metal|m5zn.large|m5zn.xlarge|m5zn.2xlarge|m5zn.3xlarge|m5zn.6xlarge|m5zn.12xlarge|m5zn.metal|m6a.large|m6a.xlarge|m6a.2xlarge|m6a.4xlarge|m6a.8xlarge|m6a.12xlarge|m6a.16xlarge|m6a.24xlarge|m6a.32xlarge|m6a.48xlarge|m6g.metal|m6g.medium|m6g.large|m6g.xlarge|m6g.2xlarge|m6g.4xlarge|m6g.8xlarge|m6g.12xlarge|m6g.16xlarge|m6gd.metal|m6gd.medium|m6gd.large|m6gd.xlarge|m6gd.2xlarge|m6gd.4xlarge|m6gd.8xlarge|m6gd.12xlarge|m6gd.16xlarge|m6i.large|m6i.xlarge|m6i.2xlarge|m6i.4xlarge|m6i.8xlarge|m6i.12xlarge|m6i.16xlarge|m6i.24xlarge|m6i.32xlarge|m6i.metal|mac1.metal|p2.xlarge|p2.8xlarge|p2.16xlarge|p3.2xlarge|p3.8xlarge|p3.16xlarge|p3dn.24xlarge|p4d.24xlarge|r3.large|r3.xlarge|r3.2xlarge|r3.4xlarge|r3.8xlarge|r4.large|r4.xlarge|r4.2xlarge|r4.4xlarge|r4.8xlarge|r4.16xlarge|r5.large|r5.xlarge|r5.2xlarge|r5.4xlarge|r5.8xlarge|r5.12xlarge|r5.16xlarge|r5.24xlarge|r5.metal|r5a.large|r5a.xlarge|r5a.2xlarge|r5a.4xlarge|r5a.8xlarge|r5a.12xlarge|r5a.16xlarge|r5a.24xlarge|r5ad.large|r5ad.xlarge|r5ad.2xlarge|r5ad.4xlarge|r5ad.8xlarge|r5ad.12xlarge|r5ad.16xlarge|r5ad.24xlarge|r5b.large|r5b.xlarge|r5b.2xlarge|r5b.4xlarge|r5b.8xlarge|r5b.12xlarge|r5b.16xlarge|r5b.24xlarge|r5b.metal|r5d.large|r5d.xlarge|r5d.2xlarge|r5d.4xlarge|r5d.8xlarge|r5d.12xlarge|r5d.16xlarge|r5d.24xlarge|r5d.metal|r5dn.large|r5dn.xlarge|r5dn.2xlarge|r5dn.4xlarge|r5dn.8xlarge|r5dn.12xlarge|r5dn.16xlarge|r5dn.24xlarge|r5dn.metal|r5n.large|r5n.xlarge|r5n.2xlarge|r5n.4xlarge|r5n.8xlarge|r5n.12xlarge|r5n.16xlarge|r5n.24xlarge|r5n.metal|r6g.medium|r6g.large|r6g.xlarge|r6g.2xlarge|r6g.4xlarge|r6g.8xlarge|r6g.12xlarge|r6g.16xlarge|r6g.metal|r6gd.medium|r6gd.large|r6gd.xlarge|r6gd.2xlarge|r6gd.4xlarge|r6gd.8xlarge|r6gd.12xlarge|r6gd.16xlarge|r6gd.metal|r6i.large|r6i.xlarge|r6i.2xlarge|r6i.4xlarge|r6i.8xlarge|r6i.12xlarge|r6i.16xlarge|r6i.24xlarge|r6i.32xlarge|r6i.metal|t1.micro|t2.nano|t2.micro|t2.small|t2.medium|t2.large|t2.xlarge|t2.2xlarge|t3.nano|t3.micro|t3.small|t3.medium|t3.large|t3.xlarge|t3.2xlarge|t3a.nano|t3a.micro|t3a.small|t3a.medium|t3a.large|t3a.xlarge|t3a.2xlarge|t4g.nano|t4g.micro|t4g.small|t4g.medium|t4g.large|t4g.xlarge|t4g.2xlarge|u-6tb1.56xlarge|u-6tb1.112xlarge|u-9tb1.112xlarge|u-12tb1.112xlarge|u-6tb1.metal|u-9tb1.metal|u-12tb1.metal|u-18tb1.metal|u-24tb1.metal|vt1.3xlarge|vt1.6xlarge|vt1.24xlarge|x1.16xlarge|x1.32xlarge|x1e.xlarge|x1e.2xlarge|x1e.4xlarge|x1e.8xlarge|x1e.16xlarge|x1e.32xlarge|x2iezn.2xlarge|x2iezn.4xlarge|x2iezn.6xlarge|x2iezn.8xlarge|x2iezn.12xlarge|x2iezn.metal|x2gd.medium|x2gd.large|x2gd.xlarge|x2gd.2xlarge|x2gd.4xlarge|x2gd.8xlarge|x2gd.12xlarge|x2gd.16xlarge|x2gd.metal|z1d.large|z1d.xlarge|z1d.2xlarge|z1d.3xlarge|z1d.6xlarge|z1d.12xlarge|z1d.metal|x2idn.16xlarge|x2idn.24xlarge|x2idn.32xlarge|x2iedn.xlarge|x2iedn.2xlarge|x2iedn.4xlarge|x2iedn.8xlarge|x2iedn.16xlarge|x2iedn.24xlarge|x2iedn.32xlarge|c6a.large|c6a.xlarge|c6a.2xlarge|c6a.4xlarge|c6a.8xlarge|c6a.12xlarge|c6a.16xlarge|c6a.24xlarge|c6a.32xlarge|c6a.48xlarge|c6a.metal|m6a.metal|i4i.large|i4i.xlarge|i4i.2xlarge|i4i.4xlarge|i4i.8xlarge|i4i.16xlarge|i4i.32xlarge|i4i.metal|x2idn.metal|x2iedn.metal|c7g.medium|c7g.large|c7g.xlarge|c7g.2xlarge|c7g.4xlarge|c7g.8xlarge|c7g.12xlarge|c7g.16xlarge|mac2.metal|c6id.large|c6id.xlarge|c6id.2xlarge|c6id.4xlarge|c6id.8xlarge|c6id.12xlarge|c6id.16xlarge|c6id.24xlarge|c6id.32xlarge|c6id.metal|m6id.large|m6id.xlarge|m6id.2xlarge|m6id.4xlarge|m6id.8xlarge|m6id.12xlarge|m6id.16xlarge|m6id.24xlarge|m6id.32xlarge|m6id.metal|r6id.large|r6id.xlarge|r6id.2xlarge|r6id.4xlarge|r6id.8xlarge|r6id.12xlarge|r6id.16xlarge|r6id.24xlarge|r6id.32xlarge|r6id.metal|r6a.large|r6a.xlarge|r6a.2xlarge|r6a.4xlarge|r6a.8xlarge|r6a.12xlarge|r6a.16xlarge|r6a.24xlarge|r6a.32xlarge|r6a.48xlarge|r6a.metal|p4de.24xlarge|u-3tb1.56xlarge|u-18tb1.112xlarge|u-24tb1.112xlarge|trn1.2xlarge|trn1.32xlarge|hpc6id.32xlarge|c6in.large|c6in.xlarge|c6in.2xlarge|c6in.4xlarge|c6in.8xlarge|c6in.12xlarge|c6in.16xlarge|c6in.24xlarge|c6in.32xlarge|m6in.large|m6in.xlarge|m6in.2xlarge|m6in.4xlarge|m6in.8xlarge|m6in.12xlarge|m6in.16xlarge|m6in.24xlarge|m6in.32xlarge|m6idn.large|m6idn.xlarge|m6idn.2xlarge|m6idn.4xlarge|m6idn.8xlarge|m6idn.12xlarge|m6idn.16xlarge|m6idn.24xlarge|m6idn.32xlarge|r6in.large|r6in.xlarge|r6in.2xlarge|r6in.4xlarge|r6in.8xlarge|r6in.12xlarge|r6in.16xlarge|r6in.24xlarge|r6in.32xlarge|r6idn.large|r6idn.xlarge|r6idn.2xlarge|r6idn.4xlarge|r6idn.8xlarge|r6idn.12xlarge|r6idn.16xlarge|r6idn.24xlarge|r6idn.32xlarge|c7g.metal|m7g.medium|m7g.large|m7g.xlarge|m7g.2xlarge|m7g.4xlarge|m7g.8xlarge|m7g.12xlarge|m7g.16xlarge|m7g.metal|r7g.medium|r7g.large|r7g.xlarge|r7g.2xlarge|r7g.4xlarge|r7g.8xlarge|r7g.12xlarge|r7g.16xlarge|r7g.metal|c6in.metal|m6in.metal|m6idn.metal|r6in.metal|r6idn.metal|inf2.xlarge|inf2.8xlarge|inf2.24xlarge|inf2.48xlarge|trn1n.32xlarge|i4g.large|i4g.xlarge|i4g.2xlarge|i4g.4xlarge|i4g.8xlarge|i4g.16xlarge|hpc7g.4xlarge|hpc7g.8xlarge|hpc7g.16xlarge|c7gn.medium|c7gn.large|c7gn.xlarge|c7gn.2xlarge|c7gn.4xlarge|c7gn.8xlarge|c7gn.12xlarge|c7gn.16xlarge|p5.48xlarge|m7i.large|m7i.xlarge|m7i.2xlarge|m7i.4xlarge|m7i.8xlarge|m7i.12xlarge|m7i.16xlarge|m7i.24xlarge|m7i.48xlarge|m7i-flex.large|m7i-flex.xlarge|m7i-flex.2xlarge|m7i-flex.4xlarge|m7i-flex.8xlarge|m7a.medium|m7a.large|m7a.xlarge|m7a.2xlarge|m7a.4xlarge|m7a.8xlarge|m7a.12xlarge|m7a.16xlarge|m7a.24xlarge|m7a.32xlarge|m7a.48xlarge|m7a.metal-48xl|hpc7a.12xlarge|hpc7a.24xlarge|hpc7a.48xlarge|hpc7a.96xlarge|c7gd.medium|c7gd.large|c7gd.xlarge|c7gd.2xlarge|c7gd.4xlarge|c7gd.8xlarge|c7gd.12xlarge|c7gd.16xlarge|m7gd.medium|m7gd.large|m7gd.xlarge|m7gd.2xlarge|m7gd.4xlarge|m7gd.8xlarge|m7gd.12xlarge|m7gd.16xlarge|r7gd.medium|r7gd.large|r7gd.xlarge|r7gd.2xlarge|r7gd.4xlarge|r7gd.8xlarge|r7gd.12xlarge|r7gd.16xlarge|r7a.medium|r7a.large|r7a.xlarge|r7a.2xlarge|r7a.4xlarge|r7a.8xlarge|r7a.12xlarge|r7a.16xlarge|r7a.24xlarge|r7a.32xlarge|r7a.48xlarge|c7i.large|c7i.xlarge|c7i.2xlarge|c7i.4xlarge|c7i.8xlarge|c7i.12xlarge|c7i.16xlarge|c7i.24xlarge|c7i.48xlarge|mac2-m2pro.metal|r7iz.large|r7iz.xlarge|r7iz.2xlarge|r7iz.4xlarge|r7iz.8xlarge|r7iz.12xlarge|r7iz.16xlarge|r7iz.32xlarge|c7a.medium|c7a.large|c7a.xlarge|c7a.2xlarge|c7a.4xlarge|c7a.8xlarge|c7a.12xlarge|c7a.16xlarge|c7a.24xlarge|c7a.32xlarge|c7a.48xlarge|c7a.metal-48xl|r7a.metal-48xl|r7i.large|r7i.xlarge|r7i.2xlarge|r7i.4xlarge|r7i.8xlarge|r7i.12xlarge|r7i.16xlarge|r7i.24xlarge|r7i.48xlarge|dl2q.24xlarge|mac2-m2.metal|i4i.12xlarge|i4i.24xlarge|c7i.metal-24xl|c7i.metal-48xl|m7i.metal-24xl|m7i.metal-48xl|r7i.metal-24xl|r7i.metal-48xl|r7iz.metal-16xl|r7iz.metal-32xl,
    ami_image:
    python_version:
    protocol: ssh|ssm
    instance_profile:
...
```

### Required keys

* `type`: this should always be `ec2`
* `instance_type`: the EC2 instance type. This defaults to `t2.micro`. The list of all
  available EC2 instance types can be found [here](https://aws.amazon.com/ec2/instance-types/).
* `ami_image`: the Amazon machine image to use. This defaults to `ami-0889a44b331db0194`.
  You should be able to find a list of available AMIs for your region via the AWS
  console (EC2 >> Images >> AMI Catalog).

<Warning>Your `ami_image`  must be an **Amazon Linux AMI**. We're working on adding support for
other Linux-based images (e.g., Debian, Ubuntu, etc.)</Warning>

### Optional keys

* `python_version`: the Python version to use. This is **optional**. If this isn't specified,
  this your code will run using the Python version native to the EC2 instance. The latest
  version is always used, i.e.,:
  * `python_version: 3` --> version `3.12.0` is used
  * `python_version: 3.1` --> version `3.1.5` is used
  * `python_version: 3.11.6` --> version `3.11.6` is used

<Warning>
  `python_version` will be deprecated starting in version `0.0.9`. Instead, users can
  customize their Python version using a Docker image, e.g., `python:3.10.8-slim-bullseye`.
</Warning>

* `protocol`: the protocol to use to modify and manage your instance. Accepted options
  are `ssh` and `ssm`. Defaults to `ssh` if not specified.

* `instance_profile`: instance profile to attach to your EC2 instance if the `ssm`
  protocol is used. If not specified, then Alto will create an instance profile for you.
