
Acquiert les disques EBS d'une AMI AWS que vous pouvez lancer, en diffusant les snapshots via les API directes EBS vers un bucket S3 privé avec des manifestes sha256 et un dépaquetage optionnel de l'image brute.
Acquérir les disques d'une AMI que vous pouvez déjà lancer dans un bucket S3 privé. Pas de catalogue, pas de liste de produits, pas d'identifiants d'AMI préintégrés. Vous fournissez l'identifiant de l'AMI.
S3 est le stockage. Le démarrage, le snapshot, la compression et l'upload s'exécutent tous dans AWS. La bande passante locale n'est utilisée que si vous récupérez ultérieurement un objet spécifique.
graph LR
A[AMI you supply] -->|run-instances| B[boot instance]
B -->|every EBS disk| C[snapshots you own]
C --> D[terminate boot instance]
C -->|ListSnapshotBlocks / GetSnapshotBlock| E[helper]
E -->|raw then zstd| F[(S3 golden store)]
F -->|optional pull| G[local artifacts]
DeleteOnTermination.raw | zstd | aws s3 cp -. Aucun volume n'est créé ou attaché.manifest.json.region.OptInRequired est une étape en console.Ne dumpez que les images que vous êtes autorisé à exécuter. Gardez les artefacts privés. Des frais logiciels Marketplace, si l'offre en comporte, ne s'accumulent que pendant que l'instance de démarrage est en cours d'exécution.
AWS ne donne pas aux acheteurs le snapshot derrière une AMI Marketplace. copy-image
et create-volume sur ce snapshot échouent. Démarrer l'AMI crée un
volume que ce compte possède, et ce volume peut être snapshoté.
Un volume qui porte encore un code produit Marketplace ne peut être attaché que comme
périphérique racine d'une instance arrêtée, donc l'attacher à un helper comme disque de données
ne fonctionne pas. ListSnapshotBlocks + GetSnapshotBlock renvoient les octets
via HTTPS sans attachement. Les blocs non alloués sont émis sous forme de zéros pour que les offsets
restent corrects.
L'API directe parle CBOR avec des membres en PascalCase. Checksum est le base64 du
digest brut, pas de l'hexadécimal. ebs_snapshot_read.py gère les deux.
jq, flock, et des identifiants pouvant appliquer la stack et exécuter
les appels instance/snapshot/SSM/S3 ci-dessouszstd uniquement pour unpack.shPermissions opérateur utilisées par les scripts (le rôle du helper est distinct, et est créé par Terraform) :
ec2:DescribeImages, DescribeInstances, DescribeSnapshots, RunInstances,
TerminateInstances, CreateSnapshot, DeleteSnapshot, CreateTags,
RegisterImageiam:PassRole sur le profil d'instance du helperssm:GetParameter, SendCommand, GetCommandInvocation,
DescribeInstanceInformations3:* sur le bucket d'artefacts (get/put/list/delete/head)sts:GetCallerIdentitycd terraform && cp terraform.tfvars.example terraform.tfvars
# edit region / name_prefix if needed — still no AMI ids
cd ..
make init && make apply && make configure
make probe AMI=ami-0123456789abcdef0
make dump LABEL=my-image AMI=ami-0123456789abcdef0
make ls
ami-0123456789abcdef0 est un espace réservé. Remplacez-le par un identifiant d'AMI que ce
compte peut lancer.
make apply crée un VPC, un groupe de sécurité egress-only, un bucket S3 et
le rôle IAM du helper. Il ne démarre pas de calcul facturable sauf si
helper_enabled = true. Le VPC n'a pas de NAT gateway, donc le coût au repos se limite au bucket
(et celui-ci est vide tant que vous ne dumpez rien).
scripts/dump.sh --ami ami-0123456789abcdef0 --label my-image
scripts/dump.sh --ami ami-0123456789abcdef0 --label my-image --boot-type m5.2xlarge --dwell 60
scripts/dump.sh --ami ami-0123456789abcdef0 --label my-image --dry-run
scripts/dump.sh --ami ami-0123456789abcdef0 --label my-image --snapshot-id snap-0123456789abcdef0
--dry-run décrit l'AMI et affiche le plan. Il ne lance rien.
Valeurs par défaut :
| Flag | Default | Notes |
|---|---|---|
--boot-type | m5.xlarge, ou m6g.xlarge si l'AMI est arm64 | Les offres rejettent souvent d'autres types. L'erreur AWS nomme ceux qu'elles autorisent. |
--dwell | 180 | Secondes pendant lesquelles l'invité s'exécute avant le snapshot. 0 prend le snapshot dès que l'instance est en cours d'exécution. |
--workers | 32 | Appels GetSnapshotBlock concurrents par disque. |
Les labels doivent correspondre à ^[A-Za-z0-9][A-Za-z0-9._-]{0,62}$. Ils deviennent des clés S3.
Une réexécution ignore un label dont l'objet est déjà dans S3 et dont le sha256 figure dans
le manifest. --force récupère à nouveau.
images.tsv, une image par ligne. Les lignes vides et les commentaires # sont ignorés.
Le troisième champ est un type d'instance optionnel.
# LABEL AMI BOOT_TYPE
my-image ami-0123456789abcdef0
other-image ami-0123456789abcdef0 m5.2xlarge
make dump-batch BATCH=images.tsv JOBS=2
--jobs N donne à chaque worker son propre slot de helper. Les mises à jour du manifest sont verrouillées
avec flock. Deux processus driver distincts peuvent partager manifest.json ; donnez-leur
des valeurs DUMP_STATE_DIR différentes s'ils ne doivent pas partager un fichier de slot de helper.
make probe AMI=ami-0123456789abcdef0
run-instances --dry-run est gratuit. DryRunOperation signifie que le compte peut
le lancer. OptInRequired signifie qu'il faut accepter cette offre dans la console AWS, puis
sonder à nouveau. Ce dépôt n'acceptera pas les conditions à votre place.
--snapshot-id ignore le démarrage et lit un snapshot existant. Image unique uniquement.--register-ami enregistre une AMI lançable dans ce compte à partir des snapshots
qui viennent d'être pris, et conserve ces snapshots. Ils sont facturés au GB-mois.--keep-snapshot conserve les snapshots sans enregistrer d'AMI. Le nettoyage
ignore les snapshots taggés Keep=true sauf si vous passez --force.make ls # keys + manifest, no download
make watch # in-flight helper log, multipart upload size
make pull LABELS="my-image"
make pull LABELS="my-image" RAW=1 # also write a sparse .raw
scripts/unpack.sh my-image # partition metadata next to the raw
pull vérifie le sha256 de l'objet compressé avant d'enregistrer le label comme
téléchargé. unpack écrit une image raw sparse sous artifacts/raw/ et un
.diskmeta.txt (file, sfdisk, blkid, parted). Montez avec
losetup -Pf --show artifacts/raw/<label>.raw.