Skip to content

Amazon Web Services

Running ARROW on AWS means uploading a disk image, importing it as an EBS snapshot, registering that snapshot as an AMI, and launching instances from it. Your AWS build downloads as a ZIP containing the disk image and arrow-deploy, a single tool that does all of it.


FileWhat it is
*.vmdkThe disk image, stream-optimized, around 23 GB
arrow-deploy-linux-amd64The deploy tool for Linux
arrow-deploy-darwin-arm64The deploy tool for macOS (Apple silicon)
arrow-deploy-windows-amd64.exeThe deploy tool for Windows
*-deployment.txtA summary of this build and the manual commands
DEPLOY-README.txtQuick reference
import-to-aws.sh, Import-To-AWS.ps1The previous scripts, still included during the transition

You need the AWS CLI, credentials (aws configure), and a default region. Two further things are required once per account, and arrow-deploy offers to create both:

  • An S3 bucket to stage the disk image during import.
  • The vmimport IAM role. AWS VM Import/Export assumes this role to read your bucket and register the AMI. It is account-wide and AWS will not import anything without it.

doctor verifies your prerequisites and creates nothing:

Terminal window
chmod +x arrow-deploy-linux-amd64
./arrow-deploy-linux-amd64 doctor --cloud aws

arrow-deploy doctor output showing the AWS prerequisites passing

If the vmimport role is missing, doctor says so and import offers to create it for you, with a policy scoped to just your staging bucket.


Terminal window
./arrow-deploy-linux-amd64 import \
--cloud aws \
--image kali-arrow-yourclient-aws.vmdk \
--image-name arrow-kali

With no --bucket, the tool lists your buckets to choose from, and offers to create one if you have none. It then uploads the image, imports it as an EBS snapshot, and registers an AMI. The AMI id is printed at the end.

The snapshot import is the slow part and runs entirely inside AWS. Expect it to take longer than the upload.

Terminal window
./arrow-deploy-linux-amd64 launch \
--cloud aws \
--image-id ami-xxxxxxxxxxxxxxxxx \
--vm-name arrow-kali-01 \
--size t3.xlarge \
--ssh-key my-key-pair

The tool offers an instance type and one of your EC2 key pairs if you do not pass them, and prints the instance’s public address when it is ready.

The instance has two separate accounts, reached by different means.

AccountHow you get inPassword
kaliYour EC2 key pairNo password; key only
arrowPasswordUnique to this VM, shown in the ARROW Portal

Your key pair is injected by cloud-init into the distribution’s default user, which is kali on a Kali image. It is not injected into the arrow account.

Terminal window
ssh -i my-key.pem kali@<instance-address>

The arrow account is for console access and manual configuration using the password from the Portal. Most of the time you do not need to sign in at all, because the instance connects back to ARROW on its own as soon as it has network access.


A deployed instance’s hostname is the name shown on its device record in the ARROW Portal, not the EC2 instance name or tag. This is deliberate, because the Portal name is the identity your team works with, so the image keeps it.


cleanup reports what it would remove and deletes nothing until you add --yes:

Terminal window
./arrow-deploy-linux-amd64 cleanup --cloud aws
./arrow-deploy-linux-amd64 cleanup --cloud aws --yes

It terminates instances, deregisters AMIs, and deletes the EBS snapshots behind them. Only resources it created are touched, identified by its own tag; narrow it further with --name-prefix.

The staged copy of your disk image in S3 is deleted automatically once the import succeeds, since AWS has copied it into the snapshot by then.


CommandWhat it does
doctorChecks prerequisites, creates nothing
importUploads the image, imports a snapshot, registers an AMI
launchCreates an EC2 instance from an AMI
cleanupRemoves instances, AMIs and their snapshots
versionPrints the version
FlagApplies toMeaning
--cloud awsallTarget cloud, always required
--imageimportPath to the .vmdk
--image-nameimportName to register the AMI under
--bucketimportS3 bucket used to stage the upload
--image-idlaunchThe AMI id that import printed
--vm-namelaunchName tag for the instance
--sizelaunchInstance type, for example t3.xlarge
--ssh-keylaunchName of an EC2 key pair in your account
--security-grouplaunchExisting security group to attach
--subnetlaunchSubnet to launch into
--name-prefixcleanupRestrict cleanup to matching names
--yescleanupActually delete; without it cleanup only reports
FlagMeaning
--dry-runReport what would happen without changing anything
--jsonMachine-readable output, for scripting
--non-interactiveNever prompt; every value must be supplied as a flag
--no-colorDisable coloured output. NO_COLOR is also honoured

Under --non-interactive the tool creates no IAM role and no security group. It prints the exact commands to run instead.


TypevCPU / RAMUse
t3.large2 / 8 GBMinimum
t3.xlarge4 / 16 GBRecommended for most work
m5.2xlarge8 / 32 GBHeavier workloads

doctor reports the vmimport role missing. Run arrow-deploy import --cloud aws and accept when it offers to create it, or create it yourself following the AWS VM Import permissions guide.

doctor reports no usable credentials. Run aws configure, and set a default region while you are there.

The instance is running but SSH times out. Its security group almost certainly does not allow inbound SSH from your address. Attach one that does, or let arrow-deploy launch create one.

SSH is refused with “Permission denied (publickey)”. Check which user you are signing in as. The key pair goes to the distribution’s default user, kali on a Kali image, not to arrow.

The import fails with a disk format error. ARROW builds a stream-optimized VMDK, which is what VM Import requires. Re-download the artifact if it may have been altered or truncated in transit.

A snapshot is still billing after cleaning up in the console. Deregistering an AMI does not delete its snapshot. Delete it explicitly, or use arrow-deploy cleanup --yes, which does both.


import-to-aws.sh and Import-To-AWS.ps1 are still included in the download and still work:

Terminal window
chmod +x import-to-aws.sh
./import-to-aws.sh # import the VMDK
./import-to-aws.sh --launch # launch from an existing ARROW AMI
./import-to-aws.sh --cleanup # remove ARROW resources

New deployments should use arrow-deploy. It is the same flow on every platform, it supports --dry-run and --json, it removes the snapshot and staged object that the scripts leave behind, and it rolls back what it created if something fails partway.