
يحصل على أقراص EBS الخاصة بـ AWS AMI يمكنك تشغيلها، ويبث اللقطات عبر واجهات EBS المباشرة إلى دلو S3 خاص مع بيانات sha256 الوصفية وفك تغليف الصورة الخام الاختياري.
احصل على أقراص AMI يمكنك تشغيله بالفعل إلى دلو S3 خاص. لا كتالوج، لا قائمة منتجات، لا معرّفات AMI مضمّنة. أنت تمرّر معرّف AMI.
S3 هو المخزن. الإقلاع، واللقطة، والضغط، والرفع كلها تعمل داخل AWS. النطاق الترددي المحلي يُستخدم فقط إذا سحبت لاحقًا كائنًا محددًا.
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 -. لا يتم إنشاء أو إرفاق أي وحدة تخزين.manifest.json.region.OptInRequired خطوة في وحدة التحكم.لا تستخرج إلا الصور التي يحق لك تشغيلها. أبقِ المخرجات خاصة. رسوم برمجيات السوق، إن كانت القائمة تتضمنها، تتراكم فقط أثناء تشغيل مثيل الإقلاع.
لا تمنح AWS للمشترين اللقطة الكامنة خلف AMI من السوق. copy-image
و create-volume على تلك اللقطة يفشلان. تشغيل AMI ينشئ
وحدة تخزين يملكها هذا الحساب، ويمكن أخذ لقطة لتلك الوحدة.
وحدة تخزين لا تزال تحمل رمز منتج من السوق يمكن إرفاقها فقط
كجهاز جذري لمثيل متوقف، لذا إرفاقها بمساعد كقرص
بيانات لا يعمل. ListSnapshotBlocks + GetSnapshotBlock يعيدان البايتات
عبر HTTPS دون إرفاق. الكتل غير المخصصة تُصدر كأصفار حتى تبقى الإزاحات
صحيحة.
الواجهة المباشرة تتحدث CBOR بأعضاء PascalCase. Checksum هو base64 للـ
digest الخام، وليس hex. ebs_snapshot_read.py يتعامل مع كليهما.
jq، و flock، وبيانات اعتماد يمكنها تطبيق الحزمة وتشغيل
استدعاءات instance/snapshot/SSM/S3 أدناهzstd فقط لـ unpack.shأذونات المشغّل التي تستخدمها السكربتات (دور المساعد منفصل، ويُنشأ بواسطة Terraform):
ec2:DescribeImages، DescribeInstances، DescribeSnapshots، RunInstances،
TerminateInstances، CreateSnapshot، DeleteSnapshot، CreateTags،
RegisterImageiam:PassRole على ملف تعريف مثيل المساعدssm:GetParameter، SendCommand، GetCommandInvocation،
DescribeInstanceInformations3:* على دلو المخرجات (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 هو عنصر نائب. استبدله بمعرّف AMI يمكن لهذا
الحساب تشغيله.
make apply ينشئ VPC، ومجموعة أمان للخروج فقط، ودلو S3، و
دور IAM للمساعد. لا يبدأ حوسبة قابلة للفوترة إلا إذا كان
helper_enabled = true. لا يحتوي VPC على بوابة NAT، لذا التكلفة الخاملة هي الدلو
فقط (وهو فارغ حتى تستخرج شيئًا).
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 يصف AMI ويطبع الخطة. لا يشغّل.
الإعدادات الافتراضية:
| Flag | Default | Notes |
|---|---|---|
--boot-type | m5.xlarge، أو m6g.xlarge إذا كان AMI من نوع arm64 | غالبًا ما ترفض القوائم الأنواع الأخرى. خطأ AWS يسمّي الأنواع التي تسمح بها. |
--dwell | 180 | عدد الثواني التي يعمل فيها الضيف قبل اللقطة. 0 يأخذ لقطة بمجرد أن يصبح المثيل قيد التشغيل. |
--workers | 32 | استدعاءات GetSnapshotBlock المتزامنة لكل قرص. |
يجب أن تطابق التسميات ^[A-Za-z0-9][A-Za-z0-9._-]{0,62}$. تصبح مفاتيح S3.
إعادة التشغيل تتخطى تسمية كائنها موجود بالفعل في S3 و sha256 الخاص بها في
الـ manifest. --force يجلب مرة أخرى.
images.tsv، صورة واحدة لكل سطر. الأسطر الفارغة وتعليقات # يتم تجاهلها.
الحقل الثالث هو نوع مثيل اختياري.
# LABEL AMI BOOT_TYPE
my-image ami-0123456789abcdef0
other-image ami-0123456789abcdef0 m5.2xlarge
make dump-batch BATCH=images.tsv JOBS=2
--jobs N يمنح كل عامل فتحة مساعد خاصة به. تحديثات الـ manifest مقفلة
بـ flock. يمكن لعمليتي تشغيل منفصلتين مشاركة manifest.json؛ أعطهما
قيم DUMP_STATE_DIR مختلفة إذا كان يجب ألا تتشاركا ملف فتحة المساعد.
make probe AMI=ami-0123456789abcdef0
run-instances --dry-run مجاني. DryRunOperation يعني أن الحساب يمكنه
تشغيله. OptInRequired يعني قبول تلك القائمة في وحدة تحكم AWS، ثم
التحقق مرة أخرى. هذا المستودع لن يقبل الشروط نيابة عنك.
--snapshot-id يتخطى الإقلاع ويقرأ لقطة موجودة واحدة. صورة واحدة فقط.--register-ami يسجّل AMI قابلًا للتشغيل في هذا الحساب من اللقطات
التي أُخذت للتو، ويحتفظ بتلك اللقطات. تُفوتر لكل GB-شهر.--keep-snapshot يحتفظ باللقطات دون تسجيل AMI. التنظيف
يتخطى اللقطات الموسومة بـ Keep=true إلا إذا مرّرت --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 يتحقق من sha256 للكائن المضغوط قبل أن يسجّل التسمية
كمُنزّلة. unpack يكتب صورة raw متفرقة تحت artifacts/raw/ و
.diskmeta.txt (file، sfdisk، blkid، parted). اربطها بـ
losetup -Pf --show artifacts/raw/<label>.raw.
s3://<bucket>/
golden/<label>/<label>.raw.zst
golden/<label>/<label>.raw.zst.sha256 # checksum of the compressed stream
golden/<label>/<label>.stats.json
golden/<label>/<label>.<device>.raw.zst # extra disks, root is the unsuffixed object
_scripts/snapshot_to_s3.sh
_scripts/ebs_snapshot_read.py
_status/<label>.json # expires after 7 days
_logs/<label>.log # expires
golden/ ليس له انتهاء صلاحية دورة الحياة. عمليات الرفع متعددة الأجزاء غير المكتملة يتم إجهاضها
بعد 3 أيام. terraform destroy يحذف الدلو (force_destroy = true)،
بما في ذلك golden/.
manifest.json (محلي، متجاهل بواسطة git) هو الفهرس: معرّف AMI، والاسم، والمالك،
والمعمارية، ورموز المنتج، ومفاتيح كل قرص، و sha256، والأحجام، ووقت الجلب.
make init / plan / apply / destroy
make configure
make probe AMI=ami-...
make dump LABEL=name AMI=ami-... [BOOT=type] [DWELL=seconds]
make dump-batch BATCH=images.tsv [JOBS=n]
make watch / ls / pull / unpack
make list
make cleanup # tagged resources only
make cleanup FORCE=1 # also delete Keep=true snapshots
make check # bash -n + python compile, no AWS
التنظيف يكتشف الموارد بواسطة وسم Purpose (firmware-dump إلا إذا
غيّرت purpose_tag). لا يلمس أي شيء آخر في الحساب.
خاملًا، بعد apply ومع helper_enabled = false: الدلو فقط. لا بوابة
NAT.
لكل صورة، تقريبًا: