From 53fd1d27b13db93ac824adf2fe86e4c28cb1ce27 Mon Sep 17 00:00:00 2001
From: tomalok
Date: Mon, 4 Jan 2021 17:36:15 -0800
Subject: [PATCH] Builder Overhaul (#106)
Subcommands
* merge 'resolve-profiles' and 'make-amis' into 'amis'
* rename 'update-releases' to 'release-yaml'
* rename 'gen-release-readme' to 'release-readme'
* rename 'prune-amis' to 'prune'
* reorder to match the usual workflow
* use argparse mutually-exclusive group where appropriate
* use argparse 'metavar' and 'nargs' for more salient help
release
* can now specify multiple AMIs on command line
* add explicit '--private' argument
* if no '--private', '--public', or '--allow-account' is specified, default to propagate the source AMI's permissions to its copies
* move 'iter_regions' and 'get*image' methods out of ReleaseAMIs class because they're also used elsewhere
* 'update_image_permissions' resets perms before adding new perms
* pending_copy loop, reports on everything in progress, waits 3m before reporting on everything again, and then waits 30s between reports
* pending_copy also notes when a copy has completed (and only queues for pending_perms if they need adjustment)
Releases class
* used by release-yaml and prune subcommands
* caches region client objects for later use (by prune)
* loads images from region - either from a profile or "unknown" (no profile tag)
* builds the releases object - now structured release -> build (instead of build -> release)
ReleasesReadme
* works with new releases object format
* improve sorting and selection of latest per version per-build AMIs
* empty cell if a region doesn't happen to have a build AMI there
PruneAMIs
* rename 'version' level to 'end-of-life'
* add 'UNKNOWN' pruning level
* works, even if you don't want to --use-broker
* --keep N - keeps an additional N AMIs that would otherwise have been purged per build
* --defer-eol DAYS - give EOL AMIs a grace period past their official EOL date
* no AMI deletion happens unless --no-pretend arg is provided
* improve pruning criteria scan and candidate selection
Co-authored-by: Jake Buchholz
---
releases/README.md | 86 +--
releases/alpine.yaml | 1598 +++++++++++++++++++-----------------------
scripts/builder.py | 1198 +++++++++++++++----------------
3 files changed, 1369 insertions(+), 1513 deletions(-)
diff --git a/releases/README.md b/releases/README.md
index 0590451..0115786 100644
--- a/releases/README.md
+++ b/releases/README.md
@@ -39,28 +39,28 @@ to you, please open an [issue](https://github.com/mcrute/alpine-ec2-ami/issues).
### Alpine Linux 3.12.3 (2020-12-19)
click to show/hide
-| Region | alpine-ami-3.12.3-x86_64-r0 | alpine-ami-3.12.3-aarch64-r0 |
+| Region | alpine-ami-3.12.3-aarch64-r0 | alpine-ami-3.12.3-x86_64-r0 |
| ------ | --- | --- |
-| af-south-1 | [ami-06d5540221d65ca01](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06d5540221d65ca01) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06d5540221d65ca01)) | [ami-025ddc2e2931d0bf2](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-025ddc2e2931d0bf2) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-025ddc2e2931d0bf2)) |
-| ap-east-1 | [ami-02c576f223356bf34](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02c576f223356bf34) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02c576f223356bf34)) | [ami-023ba7dde5800c5b5](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-023ba7dde5800c5b5) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-023ba7dde5800c5b5)) |
-| ap-northeast-1 | [ami-0250e4a691729357a](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0250e4a691729357a) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0250e4a691729357a)) | [ami-010debbee0fe7fbcb](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-010debbee0fe7fbcb) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-010debbee0fe7fbcb)) |
-| ap-northeast-2 | [ami-0cfb5eabfb58d5f72](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0cfb5eabfb58d5f72) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0cfb5eabfb58d5f72)) | [ami-09702b3f22e8616c8](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09702b3f22e8616c8) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-09702b3f22e8616c8)) |
-| ap-south-1 | [ami-023fe0b4c4dc73f8c](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-023fe0b4c4dc73f8c) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-023fe0b4c4dc73f8c)) | [ami-00de8b114b35175e6](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00de8b114b35175e6) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00de8b114b35175e6)) |
-| ap-southeast-1 | [ami-0f06993534aec820f](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f06993534aec820f) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0f06993534aec820f)) | [ami-0e3ff62bec8a2f949](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e3ff62bec8a2f949) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e3ff62bec8a2f949)) |
-| ap-southeast-2 | [ami-0f66203a3a619f732](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f66203a3a619f732) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f66203a3a619f732)) | [ami-077f7467876246e89](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-077f7467876246e89) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-077f7467876246e89)) |
-| ca-central-1 | [ami-0a5084eac39a18d31](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a5084eac39a18d31) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a5084eac39a18d31)) | [ami-0a1a8875a6a460565](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a1a8875a6a460565) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a1a8875a6a460565)) |
-| eu-central-1 | [ami-06a298dc479cf2a73](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06a298dc479cf2a73) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06a298dc479cf2a73)) | [ami-00e9dcc013b89ec7b](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00e9dcc013b89ec7b) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00e9dcc013b89ec7b)) |
-| eu-north-1 | [ami-051fcf0312ac02b05](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-051fcf0312ac02b05) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-051fcf0312ac02b05)) | [ami-0e3ad874b66b72f5b](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e3ad874b66b72f5b) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e3ad874b66b72f5b)) |
-| eu-south-1 | [ami-06b311d896c16a3a2](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06b311d896c16a3a2) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06b311d896c16a3a2)) | [ami-084274896601da8f5](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-084274896601da8f5) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-084274896601da8f5)) |
-| eu-west-1 | [ami-0846229ad28aefe20](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0846229ad28aefe20) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0846229ad28aefe20)) | [ami-055f823d50dc901c0](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-055f823d50dc901c0) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-055f823d50dc901c0)) |
-| eu-west-2 | [ami-01282190055d34e3e](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01282190055d34e3e) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-01282190055d34e3e)) | [ami-08b76009eb990b44a](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08b76009eb990b44a) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-08b76009eb990b44a)) |
-| eu-west-3 | [ami-0fa68ac5365833d75](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0fa68ac5365833d75) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0fa68ac5365833d75)) | [ami-0d3cfa58b050f7090](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d3cfa58b050f7090) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0d3cfa58b050f7090)) |
-| me-south-1 | [ami-0bee0f3b523892c11](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0bee0f3b523892c11) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0bee0f3b523892c11)) | [ami-05a9eaed7e7f67c95](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-05a9eaed7e7f67c95) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-05a9eaed7e7f67c95)) |
-| sa-east-1 | [ami-0af3d5295dfa78f9a](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0af3d5295dfa78f9a) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0af3d5295dfa78f9a)) | [ami-00890e1d93b0d2750](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00890e1d93b0d2750) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00890e1d93b0d2750)) |
-| us-east-1 | [ami-098a996634a88542f](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-098a996634a88542f) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-098a996634a88542f)) | [ami-044f158b810baa6d4](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-044f158b810baa6d4) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-044f158b810baa6d4)) |
-| us-east-2 | [ami-07012d290ef9c028e](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07012d290ef9c028e) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-07012d290ef9c028e)) | [ami-0973e3c7bc90a4801](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0973e3c7bc90a4801) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0973e3c7bc90a4801)) |
-| us-west-1 | [ami-0570d3bcb39152bb8](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0570d3bcb39152bb8) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0570d3bcb39152bb8)) | [ami-01834462564dfb367](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01834462564dfb367) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-01834462564dfb367)) |
-| us-west-2 | [ami-009f13dc01dec6a56](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-009f13dc01dec6a56) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-009f13dc01dec6a56)) | [ami-0bedcc0226437e2e0](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0bedcc0226437e2e0) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0bedcc0226437e2e0)) |
+| af-south-1 | [ami-025ddc2e2931d0bf2](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-025ddc2e2931d0bf2) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-025ddc2e2931d0bf2)) | [ami-06d5540221d65ca01](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06d5540221d65ca01) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06d5540221d65ca01)) |
+| ap-east-1 | [ami-023ba7dde5800c5b5](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-023ba7dde5800c5b5) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-023ba7dde5800c5b5)) | [ami-02c576f223356bf34](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02c576f223356bf34) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02c576f223356bf34)) |
+| ap-northeast-1 | [ami-010debbee0fe7fbcb](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-010debbee0fe7fbcb) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-010debbee0fe7fbcb)) | [ami-0250e4a691729357a](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0250e4a691729357a) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0250e4a691729357a)) |
+| ap-northeast-2 | [ami-09702b3f22e8616c8](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09702b3f22e8616c8) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-09702b3f22e8616c8)) | [ami-0cfb5eabfb58d5f72](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0cfb5eabfb58d5f72) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0cfb5eabfb58d5f72)) |
+| ap-south-1 | [ami-00de8b114b35175e6](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00de8b114b35175e6) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00de8b114b35175e6)) | [ami-023fe0b4c4dc73f8c](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-023fe0b4c4dc73f8c) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-023fe0b4c4dc73f8c)) |
+| ap-southeast-1 | [ami-0e3ff62bec8a2f949](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e3ff62bec8a2f949) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e3ff62bec8a2f949)) | [ami-0f06993534aec820f](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f06993534aec820f) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0f06993534aec820f)) |
+| ap-southeast-2 | [ami-077f7467876246e89](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-077f7467876246e89) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-077f7467876246e89)) | [ami-0f66203a3a619f732](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f66203a3a619f732) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f66203a3a619f732)) |
+| ca-central-1 | [ami-0a1a8875a6a460565](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a1a8875a6a460565) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a1a8875a6a460565)) | [ami-0a5084eac39a18d31](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a5084eac39a18d31) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a5084eac39a18d31)) |
+| eu-central-1 | [ami-00e9dcc013b89ec7b](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00e9dcc013b89ec7b) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00e9dcc013b89ec7b)) | [ami-06a298dc479cf2a73](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06a298dc479cf2a73) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06a298dc479cf2a73)) |
+| eu-north-1 | [ami-0e3ad874b66b72f5b](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e3ad874b66b72f5b) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e3ad874b66b72f5b)) | [ami-051fcf0312ac02b05](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-051fcf0312ac02b05) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-051fcf0312ac02b05)) |
+| eu-south-1 | [ami-084274896601da8f5](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-084274896601da8f5) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-084274896601da8f5)) | [ami-06b311d896c16a3a2](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06b311d896c16a3a2) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06b311d896c16a3a2)) |
+| eu-west-1 | [ami-055f823d50dc901c0](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-055f823d50dc901c0) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-055f823d50dc901c0)) | [ami-0846229ad28aefe20](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0846229ad28aefe20) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0846229ad28aefe20)) |
+| eu-west-2 | [ami-08b76009eb990b44a](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08b76009eb990b44a) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-08b76009eb990b44a)) | [ami-01282190055d34e3e](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01282190055d34e3e) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-01282190055d34e3e)) |
+| eu-west-3 | [ami-0d3cfa58b050f7090](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d3cfa58b050f7090) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0d3cfa58b050f7090)) | [ami-0fa68ac5365833d75](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0fa68ac5365833d75) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0fa68ac5365833d75)) |
+| me-south-1 | [ami-05a9eaed7e7f67c95](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-05a9eaed7e7f67c95) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-05a9eaed7e7f67c95)) | [ami-0bee0f3b523892c11](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0bee0f3b523892c11) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0bee0f3b523892c11)) |
+| sa-east-1 | [ami-00890e1d93b0d2750](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00890e1d93b0d2750) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00890e1d93b0d2750)) | [ami-0af3d5295dfa78f9a](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0af3d5295dfa78f9a) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0af3d5295dfa78f9a)) |
+| us-east-1 | [ami-044f158b810baa6d4](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-044f158b810baa6d4) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-044f158b810baa6d4)) | [ami-098a996634a88542f](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-098a996634a88542f) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-098a996634a88542f)) |
+| us-east-2 | [ami-0973e3c7bc90a4801](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0973e3c7bc90a4801) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0973e3c7bc90a4801)) | [ami-07012d290ef9c028e](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07012d290ef9c028e) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-07012d290ef9c028e)) |
+| us-west-1 | [ami-01834462564dfb367](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01834462564dfb367) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-01834462564dfb367)) | [ami-0570d3bcb39152bb8](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0570d3bcb39152bb8) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0570d3bcb39152bb8)) |
+| us-west-2 | [ami-0bedcc0226437e2e0](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0bedcc0226437e2e0) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0bedcc0226437e2e0)) | [ami-009f13dc01dec6a56](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-009f13dc01dec6a56) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-009f13dc01dec6a56)) |
@@ -144,30 +144,30 @@ to you, please open an [issue](https://github.com/mcrute/alpine-ec2-ami/issues).
-### Alpine Linux Edge (2020-12-19)
+### Alpine Linux Edge (2020-12-31)
click to show/hide
-| Region | alpine-ami-edge-x86_64-20201219023017 | alpine-ami-edge-aarch64-20201219023017 |
+| Region | alpine-ami-edge-aarch64-20201231045833 | alpine-ami-edge-x86_64-20201231045833 |
| ------ | --- | --- |
-| af-south-1 | [ami-022ac59bcd87cd5dc](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-022ac59bcd87cd5dc) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-022ac59bcd87cd5dc)) | [ami-07a6dbca85456ca7d](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07a6dbca85456ca7d) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-07a6dbca85456ca7d)) |
-| ap-east-1 | [ami-0c146b06f89e12aa9](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0c146b06f89e12aa9) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0c146b06f89e12aa9)) | [ami-07f55a0f369e88cc4](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07f55a0f369e88cc4) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-07f55a0f369e88cc4)) |
-| ap-northeast-1 | [ami-0d17941cd28072770](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d17941cd28072770) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d17941cd28072770)) | [ami-059d668e854ac0219](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-059d668e854ac0219) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-059d668e854ac0219)) |
-| ap-northeast-2 | [ami-06d5011c4ae6a7166](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06d5011c4ae6a7166) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-06d5011c4ae6a7166)) | [ami-00c4b2ff9ba78029f](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00c4b2ff9ba78029f) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-00c4b2ff9ba78029f)) |
-| ap-south-1 | [ami-03d1da261501ebbdc](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03d1da261501ebbdc) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03d1da261501ebbdc)) | [ami-083d9e5de667bf303](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-083d9e5de667bf303) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-083d9e5de667bf303)) |
-| ap-southeast-1 | [ami-0b4cbe54908f69a4d](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b4cbe54908f69a4d) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0b4cbe54908f69a4d)) | [ami-0ccbac70492a3aaaf](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ccbac70492a3aaaf) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0ccbac70492a3aaaf)) |
-| ap-southeast-2 | [ami-09bc28136809b7dd0](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09bc28136809b7dd0) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-09bc28136809b7dd0)) | [ami-0ae21901800152085](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ae21901800152085) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0ae21901800152085)) |
-| ca-central-1 | [ami-0b5e13380e240d13c](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b5e13380e240d13c) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0b5e13380e240d13c)) | [ami-0727dd3c84677edaa](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0727dd3c84677edaa) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0727dd3c84677edaa)) |
-| eu-central-1 | [ami-0dd96a983af0fa240](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0dd96a983af0fa240) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0dd96a983af0fa240)) | [ami-0d31dea4e6538c397](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d31dea4e6538c397) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d31dea4e6538c397)) |
-| eu-north-1 | [ami-0a0db680071981da9](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a0db680071981da9) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a0db680071981da9)) | [ami-0e99b8aafb11d906e](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e99b8aafb11d906e) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e99b8aafb11d906e)) |
-| eu-south-1 | [ami-03eb2aa305b859ceb](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03eb2aa305b859ceb) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03eb2aa305b859ceb)) | [ami-0439753d6d0a62c8c](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0439753d6d0a62c8c) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0439753d6d0a62c8c)) |
-| eu-west-1 | [ami-0c6dc60db5f0a3398](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0c6dc60db5f0a3398) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0c6dc60db5f0a3398)) | [ami-0fb7049a355e67dd0](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0fb7049a355e67dd0) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0fb7049a355e67dd0)) |
-| eu-west-2 | [ami-006f06c7bf63c7cf9](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-006f06c7bf63c7cf9) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-006f06c7bf63c7cf9)) | [ami-06a6c48ddf101be91](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06a6c48ddf101be91) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-06a6c48ddf101be91)) |
-| eu-west-3 | [ami-07d44564a98b9fad6](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07d44564a98b9fad6) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-07d44564a98b9fad6)) | [ami-071c3f1a5e6149b8d](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-071c3f1a5e6149b8d) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-071c3f1a5e6149b8d)) |
-| me-south-1 | [ami-00c3f62d4f482de1a](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00c3f62d4f482de1a) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00c3f62d4f482de1a)) | [ami-0c104cc8c6b41dee0](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0c104cc8c6b41dee0) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0c104cc8c6b41dee0)) |
-| sa-east-1 | [ami-0cf3e2b703ef1767e](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0cf3e2b703ef1767e) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0cf3e2b703ef1767e)) | [ami-005599fbab4c82cc9](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-005599fbab4c82cc9) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-005599fbab4c82cc9)) |
-| us-east-1 | [ami-0472ae2f8f4bf32df](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0472ae2f8f4bf32df) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0472ae2f8f4bf32df)) | [ami-04e9e4c6e875ee40d](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-04e9e4c6e875ee40d) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-04e9e4c6e875ee40d)) |
-| us-east-2 | [ami-0f1724b67cf38a4d3](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f1724b67cf38a4d3) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f1724b67cf38a4d3)) | [ami-06f27121f9aae420c](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06f27121f9aae420c) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-06f27121f9aae420c)) |
-| us-west-1 | [ami-09eb6f67937a05178](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09eb6f67937a05178) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-09eb6f67937a05178)) | [ami-0dbd39c2a43b4775c](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0dbd39c2a43b4775c) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0dbd39c2a43b4775c)) |
-| us-west-2 | [ami-09d1611a460f7db7e](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09d1611a460f7db7e) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-09d1611a460f7db7e)) | [ami-082390a369bbeec92](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-082390a369bbeec92) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-082390a369bbeec92)) |
+| af-south-1 | [ami-0b183c56bd131ed3a](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b183c56bd131ed3a) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0b183c56bd131ed3a)) | [ami-011743658a67dd855](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-011743658a67dd855) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-011743658a67dd855)) |
+| ap-east-1 | [ami-08b75758d2db7dfca](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08b75758d2db7dfca) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-08b75758d2db7dfca)) | [ami-0d216cd3d020468f4](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d216cd3d020468f4) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d216cd3d020468f4)) |
+| ap-northeast-1 | [ami-0e4e372058199d5ef](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e4e372058199d5ef) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e4e372058199d5ef)) | [ami-080ee407fba860248](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-080ee407fba860248) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-080ee407fba860248)) |
+| ap-northeast-2 | [ami-0b1cb303b405d3097](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b1cb303b405d3097) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0b1cb303b405d3097)) | [ami-0f9ab3123bd36ee7c](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f9ab3123bd36ee7c) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f9ab3123bd36ee7c)) |
+| ap-south-1 | [ami-03dd8e847479cf769](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03dd8e847479cf769) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03dd8e847479cf769)) | [ami-0180ec8a9b842fb7b](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0180ec8a9b842fb7b) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0180ec8a9b842fb7b)) |
+| ap-southeast-1 | [ami-0f63ec4ee42f919af](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f63ec4ee42f919af) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0f63ec4ee42f919af)) | [ami-068588a4eea7ad3a3](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-068588a4eea7ad3a3) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-068588a4eea7ad3a3)) |
+| ap-southeast-2 | [ami-0cfb54d89d91b4588](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0cfb54d89d91b4588) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0cfb54d89d91b4588)) | [ami-0ae9daf7a58df4934](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ae9daf7a58df4934) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0ae9daf7a58df4934)) |
+| ca-central-1 | [ami-0028affab88bac113](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0028affab88bac113) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0028affab88bac113)) | [ami-07bcbb6f6af86f511](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07bcbb6f6af86f511) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-07bcbb6f6af86f511)) |
+| eu-central-1 | [ami-0a3002a25422450ec](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a3002a25422450ec) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a3002a25422450ec)) | [ami-052c85ff0f5526102](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-052c85ff0f5526102) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-052c85ff0f5526102)) |
+| eu-north-1 | [ami-0164bce0c7d9f1741](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0164bce0c7d9f1741) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0164bce0c7d9f1741)) | [ami-050c04068b77339c8](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-050c04068b77339c8) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-050c04068b77339c8)) |
+| eu-south-1 | [ami-02fe886c007469453](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02fe886c007469453) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02fe886c007469453)) | [ami-0d0c75892f636d022](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d0c75892f636d022) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d0c75892f636d022)) |
+| eu-west-1 | [ami-052c81600bc9265a2](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-052c81600bc9265a2) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-052c81600bc9265a2)) | [ami-05e2518be7f8858dd](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-05e2518be7f8858dd) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-05e2518be7f8858dd)) |
+| eu-west-2 | [ami-0dbd0469355fb628b](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0dbd0469355fb628b) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0dbd0469355fb628b)) | [ami-0feefbd48a8e39699](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0feefbd48a8e39699) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0feefbd48a8e39699)) |
+| eu-west-3 | [ami-0a8f99b7d240e427c](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a8f99b7d240e427c) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0a8f99b7d240e427c)) | [ami-0423ae73dd6a792bf](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0423ae73dd6a792bf) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0423ae73dd6a792bf)) |
+| me-south-1 | [ami-03e34a8c3f39d75a8](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03e34a8c3f39d75a8) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03e34a8c3f39d75a8)) | [ami-04649d2d92b0365f7](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-04649d2d92b0365f7) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-04649d2d92b0365f7)) |
+| sa-east-1 | [ami-0c049c43758d1c6ae](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0c049c43758d1c6ae) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0c049c43758d1c6ae)) | [ami-0a9fcc32957c9f42f](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a9fcc32957c9f42f) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a9fcc32957c9f42f)) |
+| us-east-1 | [ami-0d4bf5cbd324d086a](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d4bf5cbd324d086a) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d4bf5cbd324d086a)) | [ami-047669701018a01ac](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-047669701018a01ac) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-047669701018a01ac)) |
+| us-east-2 | [ami-07434f0295f2816c8](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07434f0295f2816c8) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-07434f0295f2816c8)) | [ami-0f811ec590362fd5e](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f811ec590362fd5e) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f811ec590362fd5e)) |
+| us-west-1 | [ami-0e2ddb3719b40d721](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e2ddb3719b40d721) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e2ddb3719b40d721)) | [ami-02a9a916ff04c9553](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02a9a916ff04c9553) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02a9a916ff04c9553)) |
+| us-west-2 | [ami-07ab85086738d655c](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07ab85086738d655c) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-07ab85086738d655c)) | [ami-003decaff69790d71](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-003decaff69790d71) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-003decaff69790d71)) |
diff --git a/releases/alpine.yaml b/releases/alpine.yaml
index a43627a..2a0f2f6 100644
--- a/releases/alpine.yaml
+++ b/releases/alpine.yaml
@@ -1,313 +1,37 @@
-edge-x86_64:
- edge:
- alpine-ami-edge-x86_64-20201122030849:
- description: Alpine Linux edge x86_64 20201122030849 - https://github.com/mcrute/alpine-ec2-ami
+edge:
+ edge-x86_64:
+ alpine-ami-edge-x86_64-20201231045833:
+ description: Alpine Linux edge x86_64 20201231045833 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
profile_build: edge-x86_64
version: edge
release: edge
arch: x86_64
- revision: '20201122030849'
- end_of_life: '2020-11-23T03:08:49'
- build_time: '1606045539'
+ revision: '20201231045833'
+ creation_date: '2020-12-31T05:01:00.000Z'
+ end_of_life: '2021-01-01T04:58:33'
+ build_time: 1609419660
artifacts:
- af-south-1: ami-00689080a5e228489
- eu-north-1: ami-083f8b94e6596a053
- ap-south-1: ami-040e8658c8ebbc192
- eu-west-3: ami-0ed7be4d18b208670
- eu-west-2: ami-0d5c28f1f70bebb9b
- eu-south-1: ami-00192341756cf9337
- eu-west-1: ami-098d6fa45afb58fbd
- ap-northeast-2: ami-0bae21ec956bc0cf1
- me-south-1: ami-06edc731c09e741f5
- ap-northeast-1: ami-0a2936daabc513439
- sa-east-1: ami-0d5af6ce4179ba5dc
- ca-central-1: ami-07f528b728dd66247
- ap-east-1: ami-04623fc89f566c5f8
- ap-southeast-1: ami-0aca8ecaf8abeeb65
- ap-southeast-2: ami-08a6cc6c42c9395e5
- eu-central-1: ami-061e2d779ab8061b1
- us-east-1: ami-0ef054923c6569a9a
- us-east-2: ami-06fd7a587efa80ed2
- us-west-1: ami-0fdd31127fae3ba4b
- us-west-2: ami-06739656bc1b7c92e
- alpine-ami-edge-x86_64-20201104223817:
- description: Alpine Linux edge x86_64 20201104223817 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20201104223817'
- end_of_life: '2020-11-05T22:38:17'
- build_time: '1604559572'
- artifacts:
- af-south-1: ami-0681a1af7ab425246
- eu-north-1: ami-0b6200a74d0b7d7af
- ap-south-1: ami-07a1638dc9908589e
- eu-west-3: ami-0d790428b555a7a7b
- eu-west-2: ami-0fa9d7f11b1c55a8d
- eu-south-1: ami-0697a63a71188ddad
- eu-west-1: ami-0d17f108d7b29fc89
- ap-northeast-2: ami-020f81b319679e216
- me-south-1: ami-01d3293169fd94d51
- ap-northeast-1: ami-0aaba61ca1bf297eb
- sa-east-1: ami-0dd5f9cde76604626
- ca-central-1: ami-0e0991e0a75183387
- ap-east-1: ami-05d1ed3955f085103
- ap-southeast-1: ami-06101a751c65e61cf
- ap-southeast-2: ami-04c8d5f2030c3d5f8
- eu-central-1: ami-098989b210ae0a152
- us-east-1: ami-0a2c4c14503968196
- us-east-2: ami-00ff52d28bb136b3c
- us-west-1: ami-054166b9e67bb0716
- us-west-2: ami-0ca706847efd66e24
- alpine-ami-edge-x86_64-20190826015716:
- description: Alpine Linux edge x86_64 20190826015716 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20190826015716'
- end_of_life: '2019-08-27T01:57:16'
- build_time: '1566813607'
- artifacts:
- eu-north-1: ami-042a6066f12f93411
- ap-south-1: ami-0c3747e69c2496209
- eu-west-3: ami-07614b8be5de3b1a0
- eu-west-2: ami-0fa5a6db02d8cff64
- eu-west-1: ami-04b8b162151a2e45d
- ap-northeast-2: ami-05cbcb200dde2845b
- ap-northeast-1: ami-0aee477cc2cee23cf
- sa-east-1: ami-09324c8018c018931
- ca-central-1: ami-0e4a890b424d67f67
- ap-southeast-1: ami-02f37bdd135ec4d42
- ap-southeast-2: ami-0463b6ff7b57d9090
- eu-central-1: ami-092b4f46b7d79af32
- us-east-1: ami-08f2e440a4fc821b0
- us-east-2: ami-002f49d922035cd6b
- us-west-1: ami-0e146ed2f408cfaee
- us-west-2: ami-052fcb0bc085a75a2
- alpine-ami-edge-x86_64-20200205024005:
- description: Alpine Linux edge x86_64 20200205024005 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20200205024005'
- end_of_life: '2020-02-06T02:40:05'
- build_time: '1580899414'
- artifacts:
- eu-north-1: ami-0440a037c49287602
- ap-south-1: ami-00563d27b2511771e
- eu-west-3: ami-0a96a077e024cf68c
- eu-west-2: ami-0c89e502a2bbae39c
- eu-west-1: ami-0c6e2f66869524c92
- ap-northeast-2: ami-0da81d92789ac64c9
- ap-northeast-1: ami-0e66e152e67bd01c4
- sa-east-1: ami-0701231683e53500b
- ca-central-1: ami-09f98f0464adfebb2
- ap-southeast-1: ami-0c319f4e0be04ba59
- ap-southeast-2: ami-0a3ef06def6f50c0d
- eu-central-1: ami-001559f80be1add88
- us-east-1: ami-002a48030440e00da
- us-east-2: ami-0ae27524e2b9bb820
- us-west-1: ami-02a94605eedcd1d51
- us-west-2: ami-034def9257bc1fa27
- alpine-ami-edge-x86_64-20200403021415:
- description: Alpine Linux edge x86_64 20200403021415 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20200403021415'
- end_of_life: '2020-04-04T02:14:15'
- build_time: '1585909041'
- artifacts:
- eu-north-1: ami-046e324b95557b67e
- ap-south-1: ami-0e9b4aa2c6dfa1c6b
- eu-west-3: ami-03b6049476dc86faa
- eu-west-2: ami-0581c02f513cab380
- eu-west-1: ami-0370efeca292a68fa
- ap-northeast-2: ami-0e5c3704b08250be0
- ap-northeast-1: ami-0a930ab443e79658a
- sa-east-1: ami-0a82e4262b07441f2
- ca-central-1: ami-078a0413716fb1ee2
- ap-southeast-1: ami-017d1c8652fe5fb6e
- ap-southeast-2: ami-0b20e853350fcc974
- eu-central-1: ami-0b949041038ac64f8
- us-east-1: ami-034b4fb0ea71693e3
- us-east-2: ami-058700b313ac9dde9
- us-west-1: ami-08e25ab23aa5a3904
- us-west-2: ami-08f7bd174f27a0375
- alpine-ami-edge-x86_64-20200104190012:
- description: Alpine Linux edge x86_64 20200104190012 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20200104190012'
- end_of_life: '2020-01-05T19:00:12'
- build_time: '1578193428'
- artifacts:
- eu-north-1: ami-063212df61bebdfac
- ap-south-1: ami-094720b652f133f9c
- eu-west-3: ami-015e5b9edb52ee495
- eu-west-2: ami-041fba8b0ded32106
- eu-west-1: ami-034638ad783384202
- ap-northeast-2: ami-0be5d677b47fce454
- ap-northeast-1: ami-0fda74ed5ffb7ccd7
- sa-east-1: ami-0dbd80d9204b2a206
- ca-central-1: ami-0fe2907efc576aa3c
- ap-southeast-1: ami-0f7d8a18e9be21cd1
- ap-southeast-2: ami-0386d4dc2cf9f3d91
- eu-central-1: ami-08caf54970e53151e
- us-east-1: ami-0047bb64e977f5521
- us-east-2: ami-024246dd06d739e37
- us-west-1: ami-089f878b5816e24f4
- us-west-2: ami-0f6dc9ba311992682
- alpine-ami-edge-x86_64-20191220032351:
- description: Alpine Linux edge x86_64 20191220032351 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20191220032351'
- end_of_life: '2019-12-21T03:23:51'
- build_time: '1576841260'
- artifacts:
- eu-north-1: ami-069b1f7572e57e869
- ap-south-1: ami-024a83d2f5f690e9c
- eu-west-3: ami-0bfe5b9d1a2d3c6c9
- eu-west-2: ami-0c8643b000cb720b6
- eu-west-1: ami-0fe261f4ce1adac48
- ap-northeast-2: ami-0ce75b84103d6cf1b
- ap-northeast-1: ami-09c848c4cb4b2bfcc
- sa-east-1: ami-075e2722dd4b1e660
- ca-central-1: ami-00f6c418339093258
- ap-southeast-1: ami-045d3298bde43a38e
- ap-southeast-2: ami-02a507af131b58f77
- eu-central-1: ami-00e094f733fa389c1
- us-east-1: ami-0d42d7ed27a1b508a
- us-east-2: ami-016775e32e6c85c18
- us-west-1: ami-065cbd73f2f0dd6d6
- us-west-2: ami-0897367ecebfd4b79
- alpine-ami-edge-x86_64-20191026200352:
- description: Alpine Linux edge x86_64 20191026200352 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20191026200352'
- end_of_life: '2019-10-27T20:03:52'
- build_time: '1572149159'
- artifacts:
- eu-north-1: ami-0787f149b1a3f8194
- ap-south-1: ami-018d0a72b1c1b2923
- eu-west-3: ami-0f0bdda8a983eace3
- eu-west-2: ami-058faf9bf50c5fdc4
- eu-west-1: ami-068378748044554e5
- ap-northeast-2: ami-085769ebaedbfdf81
- ap-northeast-1: ami-0112f6ea81c86d5e6
- sa-east-1: ami-08b88bdd43ac5d063
- ca-central-1: ami-029fabbc15f6ec893
- ap-southeast-1: ami-0efbcf7df7751898a
- ap-southeast-2: ami-06dc954ca0af33023
- eu-central-1: ami-01353f3799d62f271
- us-east-1: ami-0193a17629e6377fc
- us-east-2: ami-03db856d0b5b661ce
- us-west-1: ami-04864199556e66fad
- us-west-2: ami-03e59f12dbbee65d4
- alpine-ami-edge-x86_64-20200425232123:
- description: Alpine Linux edge x86_64 20200425232123 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20200425232123'
- end_of_life: '2020-04-26T23:21:23'
- build_time: '1587885839'
- artifacts:
- eu-north-1: ami-0ac2cb76721262b8f
- ap-south-1: ami-034d9a20d9bf2049f
- eu-west-3: ami-037d85dcf06bc913e
- eu-west-2: ami-0329b37ebc36521c7
- eu-west-1: ami-0a86b121e789d84a2
- ap-northeast-2: ami-0f6525d9186a0ee66
- ap-northeast-1: ami-0f64e8385eb16f0c5
- sa-east-1: ami-0b8e53df93ee4132d
- ca-central-1: ami-068da53b91dcfad35
- ap-southeast-1: ami-0e64d169297389f9e
- ap-southeast-2: ami-0afc0bab8196b70e4
- eu-central-1: ami-0b04139e51df7902b
- us-east-1: ami-097be5ea1a5c7b6ce
- us-east-2: ami-0f40de04e77f600b6
- us-west-1: ami-095527a55aa7c1c1d
- us-west-2: ami-0e5711189d37ddd64
- alpine-ami-edge-x86_64-20190611031724:
- description: Alpine Linux edge x86_64 20190611031724 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20190611031724'
- end_of_life: '2019-06-12T03:17:24'
- build_time: '1560252501'
- artifacts:
- eu-north-1: ami-0c3152b1fd3b21ae9
- ap-south-1: ami-09e1d1ef7cd517a64
- eu-west-3: ami-0d1e6f66f5a7fc568
- eu-west-2: ami-029d4646a3ea4fc0f
- eu-west-1: ami-031b9d6c98019452b
- ap-northeast-2: ami-00cceaf8288ee7386
- ap-northeast-1: ami-0c97e7cdda534346b
- sa-east-1: ami-0b00f41d3df265296
- ca-central-1: ami-008c0bd239c168b34
- ap-southeast-1: ami-037323416789f3ce1
- ap-southeast-2: ami-0d182653643257211
- eu-central-1: ami-0d808164dace58b4e
- us-east-1: ami-014a8bfc05b292686
- us-east-2: ami-0d99a25549626e548
- us-west-1: ami-03f03158096a615cd
- alpine-ami-edge-x86_64-20201213190459:
- description: Alpine Linux edge x86_64 20201213190459 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-x86_64
- version: edge
- release: edge
- arch: x86_64
- revision: '20201213190459'
- end_of_life: '2020-12-14T19:04:59'
- build_time: '1607915630'
- artifacts:
- us-west-2: ami-0b91b7b604d8e2698
- af-south-1: ami-0f910995b3fcbc2a1
- eu-north-1: ami-00d23d9fe5e916760
- ap-south-1: ami-02cdde8617c38b6da
- eu-west-3: ami-06649b9ba1b9c6625
- eu-west-2: ami-0b54da8cc7d2e71ab
- eu-south-1: ami-0e119f0362787d26f
- eu-west-1: ami-06bb894c2ea22cfa7
- ap-northeast-2: ami-0608684322b1df99d
- me-south-1: ami-00ad5f5422bb04d33
- ap-northeast-1: ami-00f04e83341318e5d
- sa-east-1: ami-048f22481002c6990
- ca-central-1: ami-0c6173e1c33395119
- ap-east-1: ami-0843f7ca1455bbcf3
- ap-southeast-1: ami-0a0f9e02019761a7d
- ap-southeast-2: ami-0a4aef473ddfc4942
- eu-central-1: ami-0f7ba6027999c7b2c
- us-east-1: ami-04c9b228d4a45c132
- us-east-2: ami-026a039af74def437
- us-west-1: ami-0a9ffe73ca66b492b
+ af-south-1: ami-011743658a67dd855
+ eu-north-1: ami-050c04068b77339c8
+ ap-south-1: ami-0180ec8a9b842fb7b
+ eu-west-3: ami-0423ae73dd6a792bf
+ eu-west-2: ami-0feefbd48a8e39699
+ eu-south-1: ami-0d0c75892f636d022
+ eu-west-1: ami-05e2518be7f8858dd
+ ap-northeast-2: ami-0f9ab3123bd36ee7c
+ me-south-1: ami-04649d2d92b0365f7
+ ap-northeast-1: ami-080ee407fba860248
+ sa-east-1: ami-0a9fcc32957c9f42f
+ ca-central-1: ami-07bcbb6f6af86f511
+ ap-east-1: ami-0d216cd3d020468f4
+ ap-southeast-1: ami-068588a4eea7ad3a3
+ ap-southeast-2: ami-0ae9daf7a58df4934
+ eu-central-1: ami-052c85ff0f5526102
+ us-east-1: ami-047669701018a01ac
+ us-east-2: ami-0f811ec590362fd5e
+ us-west-1: ami-02a9a916ff04c9553
+ us-west-2: ami-003decaff69790d71
alpine-ami-edge-x86_64-20201219023017:
description: Alpine Linux edge x86_64 20201219023017 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -316,10 +40,10 @@ edge-x86_64:
release: edge
arch: x86_64
revision: '20201219023017'
+ creation_date: '2020-12-19T02:41:55.000Z'
end_of_life: '2020-12-20T02:30:17'
- build_time: 1608345732
+ build_time: 1608374515
artifacts:
- us-west-2: ami-09d1611a460f7db7e
af-south-1: ami-022ac59bcd87cd5dc
eu-north-1: ami-0a0db680071981da9
ap-south-1: ami-03d1da261501ebbdc
@@ -339,8 +63,402 @@ edge-x86_64:
us-east-1: ami-0472ae2f8f4bf32df
us-east-2: ami-0f1724b67cf38a4d3
us-west-1: ami-09eb6f67937a05178
-v3_12-aarch64:
- 3.12.1:
+ us-west-2: ami-09d1611a460f7db7e
+ alpine-ami-edge-x86_64-20201229232619:
+ description: Alpine Linux edge x86_64 20201229232619 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: edge-x86_64
+ version: edge
+ release: edge
+ arch: x86_64
+ revision: '20201229232619'
+ creation_date: '2020-12-29T23:29:13.000Z'
+ end_of_life: '2020-12-30T23:26:19'
+ build_time: 1609313353
+ artifacts:
+ af-south-1: ami-06d08d91f91f63804
+ eu-north-1: ami-00886727f059b0afe
+ ap-south-1: ami-0cb996c5d5d55aa32
+ eu-west-3: ami-0a9ab81ddd9fdd793
+ eu-west-2: ami-0da5d25c4237ce335
+ eu-south-1: ami-0d054749ede29dad2
+ eu-west-1: ami-034b257e9f49bccd3
+ ap-northeast-2: ami-0ee08d2da0b365caf
+ me-south-1: ami-08b358b4f6cc096a5
+ ap-northeast-1: ami-07fdc870b8939e163
+ sa-east-1: ami-0f0a9a43ade16b9f6
+ ca-central-1: ami-003a2a13710a487e0
+ ap-east-1: ami-0f9ca91da6150b03a
+ ap-southeast-1: ami-016403a889f9108c9
+ ap-southeast-2: ami-0c809f2c61684080d
+ eu-central-1: ami-05592a5b5a37344b5
+ us-east-1: ami-0710a2b23bc39e67a
+ us-east-2: ami-069a7171fde662e9b
+ us-west-1: ami-076dc2e3957834509
+ us-west-2: ami-0fd667e7abfe3b6d2
+ alpine-ami-edge-x86_64-20201229214956:
+ description: Alpine Linux edge x86_64 20201229214956 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: edge-x86_64
+ version: edge
+ release: edge
+ arch: x86_64
+ revision: '20201229214956'
+ creation_date: '2020-12-29T21:53:05.000Z'
+ end_of_life: '2020-12-30T21:49:56'
+ build_time: 1609307585
+ artifacts:
+ af-south-1: ami-08dc0399ed9bd830f
+ eu-north-1: ami-02593586a624c644e
+ ap-south-1: ami-0485245862afd6a94
+ eu-west-3: ami-08a2c7883f069fa11
+ eu-west-2: ami-085e38f6a9097b10d
+ eu-south-1: ami-0031e41f580bd7bc6
+ eu-west-1: ami-01d646d460450e5df
+ ap-northeast-2: ami-0cb9c48206930d2e1
+ me-south-1: ami-085f853cc2b44d8a9
+ ap-northeast-1: ami-007fdf68b6a1ea3d7
+ sa-east-1: ami-0abf25b78b35ce41d
+ ca-central-1: ami-0d32f1c3b151a073b
+ ap-east-1: ami-00eba1e6d8c374fa3
+ ap-southeast-1: ami-004c0b5ee0b352196
+ ap-southeast-2: ami-0fe124200ff8062fd
+ eu-central-1: ami-0b9ee3bdd290af3c4
+ us-east-1: ami-062feb589ae24631b
+ us-east-2: ami-07188d526cdddcda9
+ us-west-1: ami-080688ba76a53e6f7
+ us-west-2: ami-086cf146f39eb2693
+ alpine-ami-edge-x86_64-20201229224611:
+ description: Alpine Linux edge x86_64 20201229224611 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: edge-x86_64
+ version: edge
+ release: edge
+ arch: x86_64
+ revision: '20201229224611'
+ creation_date: '2020-12-29T22:48:52.000Z'
+ end_of_life: '2020-12-30T22:46:11'
+ build_time: 1609310932
+ artifacts:
+ af-south-1: ami-0c0c9f458cd3302b7
+ eu-north-1: ami-0de5739f5fc9d92b0
+ ap-south-1: ami-07ff15b57d4238dec
+ eu-west-3: ami-0ee119647d35ac82e
+ eu-west-2: ami-077605ea3fb11b261
+ eu-south-1: ami-0cbb4d2d2edeffedf
+ eu-west-1: ami-0b763b5fcd836a2c7
+ ap-northeast-2: ami-05f53fe3ad2cf3558
+ me-south-1: ami-079cc6ecfba9ad180
+ ap-northeast-1: ami-0a475efe1d176f2ef
+ sa-east-1: ami-0ccfaae08a3064763
+ ca-central-1: ami-0644084a7cdbd26fc
+ ap-east-1: ami-099b5dd0fcedb734d
+ ap-southeast-1: ami-027dfaccb2e7e74a5
+ ap-southeast-2: ami-010fee6f93cdc98ef
+ eu-central-1: ami-0e03ed40c25ffa518
+ us-east-1: ami-0d7e8605cde01ae43
+ us-east-2: ami-0726364161f193345
+ us-west-1: ami-0d2806a3f473e92d3
+ us-west-2: ami-0062c351ab20e14cf
+ edge-aarch64:
+ alpine-ami-edge-aarch64-20201219023017:
+ description: Alpine Linux edge aarch64 20201219023017 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: edge-aarch64
+ version: edge
+ release: edge
+ arch: aarch64
+ revision: '20201219023017'
+ creation_date: '2020-12-19T02:38:38.000Z'
+ end_of_life: '2020-12-20T02:30:17'
+ build_time: 1608374318
+ artifacts:
+ af-south-1: ami-07a6dbca85456ca7d
+ eu-north-1: ami-0e99b8aafb11d906e
+ ap-south-1: ami-083d9e5de667bf303
+ eu-west-3: ami-071c3f1a5e6149b8d
+ eu-west-2: ami-06a6c48ddf101be91
+ eu-south-1: ami-0439753d6d0a62c8c
+ eu-west-1: ami-0fb7049a355e67dd0
+ ap-northeast-2: ami-00c4b2ff9ba78029f
+ me-south-1: ami-0c104cc8c6b41dee0
+ ap-northeast-1: ami-059d668e854ac0219
+ sa-east-1: ami-005599fbab4c82cc9
+ ca-central-1: ami-0727dd3c84677edaa
+ ap-east-1: ami-07f55a0f369e88cc4
+ ap-southeast-1: ami-0ccbac70492a3aaaf
+ ap-southeast-2: ami-0ae21901800152085
+ eu-central-1: ami-0d31dea4e6538c397
+ us-east-1: ami-04e9e4c6e875ee40d
+ us-east-2: ami-06f27121f9aae420c
+ us-west-1: ami-0dbd39c2a43b4775c
+ us-west-2: ami-082390a369bbeec92
+ alpine-ami-edge-aarch64-20201229230708:
+ description: Alpine Linux edge aarch64 20201229230708 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: edge-aarch64
+ version: edge
+ release: edge
+ arch: aarch64
+ revision: '20201229230708'
+ creation_date: '2020-12-29T23:09:57.000Z'
+ end_of_life: '2020-12-30T23:07:08'
+ build_time: 1609312197
+ artifacts:
+ af-south-1: ami-0a3bd3c9b36d7c6c7
+ eu-north-1: ami-0bcce26e70065a5bc
+ ap-south-1: ami-087b62ebfa3c397c2
+ eu-west-3: ami-0a1fbfa66ea6eecb5
+ eu-west-2: ami-0595a6eca3bd3c78c
+ eu-south-1: ami-0163588672a0237ac
+ eu-west-1: ami-051a49d029615ee41
+ ap-northeast-2: ami-0197cd016b53ae164
+ me-south-1: ami-07f6eca663666a336
+ ap-northeast-1: ami-0243bfa4774e3c140
+ sa-east-1: ami-042078f38a1acc839
+ ca-central-1: ami-0e37054697017f838
+ ap-east-1: ami-0bbd759c49ca213cd
+ ap-southeast-1: ami-01390e61c6fc639fb
+ ap-southeast-2: ami-0a71db741f8439bdb
+ eu-central-1: ami-0a3f2fc4f69b52ef6
+ us-east-1: ami-05f3be0c13cf0567e
+ us-east-2: ami-0ca827ab7ce9db92a
+ us-west-1: ami-01a1c6b3c2c1952d0
+ us-west-2: ami-0abd8ada6afb9e527
+ alpine-ami-edge-aarch64-20201231045833:
+ description: Alpine Linux edge aarch64 20201231045833 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: edge-aarch64
+ version: edge
+ release: edge
+ arch: aarch64
+ revision: '20201231045833'
+ creation_date: '2020-12-31T05:04:00.000Z'
+ end_of_life: '2021-01-01T04:58:33'
+ build_time: 1609419840
+ artifacts:
+ af-south-1: ami-0b183c56bd131ed3a
+ eu-north-1: ami-0164bce0c7d9f1741
+ ap-south-1: ami-03dd8e847479cf769
+ eu-west-3: ami-0a8f99b7d240e427c
+ eu-west-2: ami-0dbd0469355fb628b
+ eu-south-1: ami-02fe886c007469453
+ eu-west-1: ami-052c81600bc9265a2
+ ap-northeast-2: ami-0b1cb303b405d3097
+ me-south-1: ami-03e34a8c3f39d75a8
+ ap-northeast-1: ami-0e4e372058199d5ef
+ sa-east-1: ami-0c049c43758d1c6ae
+ ca-central-1: ami-0028affab88bac113
+ ap-east-1: ami-08b75758d2db7dfca
+ ap-southeast-1: ami-0f63ec4ee42f919af
+ ap-southeast-2: ami-0cfb54d89d91b4588
+ eu-central-1: ami-0a3002a25422450ec
+ us-east-1: ami-0d4bf5cbd324d086a
+ us-east-2: ami-07434f0295f2816c8
+ us-west-1: ami-0e2ddb3719b40d721
+ us-west-2: ami-07ab85086738d655c
+ alpine-ami-edge-aarch64-20201229214956:
+ description: Alpine Linux edge aarch64 20201229214956 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: edge-aarch64
+ version: edge
+ release: edge
+ arch: aarch64
+ revision: '20201229214956'
+ creation_date: '2020-12-29T21:56:23.000Z'
+ end_of_life: '2020-12-30T21:49:56'
+ build_time: 1609307783
+ artifacts:
+ af-south-1: ami-0c04fcc8f2372b696
+ eu-north-1: ami-05a8bf63fc921394d
+ ap-south-1: ami-0f5ede5d876f0f06d
+ eu-west-3: ami-057f73f3491d66c21
+ eu-west-2: ami-0408124ec9dfa3e42
+ eu-south-1: ami-00ea83ffa212c5b83
+ eu-west-1: ami-08e4b7b4d0254bfe2
+ ap-northeast-2: ami-0ac6766dfdf0ecbd7
+ me-south-1: ami-0cc2a40f9ac891f6c
+ ap-northeast-1: ami-029e0d778de8f78cd
+ sa-east-1: ami-0aa2d0ef1395143d7
+ ca-central-1: ami-0b25ce7faaa294f50
+ ap-east-1: ami-07b598f5bafaae0e7
+ ap-southeast-1: ami-0e41f9097081fb82b
+ ap-southeast-2: ami-0a892f43c87a6bf46
+ eu-central-1: ami-039e58598e4e69589
+ us-east-1: ami-0c5fa29ef9fde7556
+ us-east-2: ami-0f573107d2294271b
+ us-west-1: ami-059fba50c56721d6a
+ us-west-2: ami-01e0b20bb07854059
+3.12.2:
+ v3_12-aarch64:
+ alpine-ami-3.12.2-aarch64-r0:
+ description: Alpine Linux 3.12.2 aarch64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_12-aarch64
+ version: '3.12'
+ release: 3.12.2
+ arch: aarch64
+ revision: r0
+ creation_date: '2020-12-13T19:29:16.000Z'
+ end_of_life: '2022-05-01T00:00:00'
+ build_time: 1607916556
+ artifacts:
+ af-south-1: ami-01bddee275c090a50
+ eu-north-1: ami-07b793f6b41391228
+ ap-south-1: ami-0759affb95b30e7fb
+ eu-west-3: ami-0e27cfc827138e618
+ eu-west-2: ami-007b53f9896902dbb
+ eu-south-1: ami-093ee59d023f73f01
+ eu-west-1: ami-0872a57824a7c8a0f
+ ap-northeast-2: ami-053378f981bc37c5a
+ me-south-1: ami-0d6b8517fe502f094
+ ap-northeast-1: ami-0a5c2347daea31320
+ sa-east-1: ami-0cb7785de4b330978
+ ca-central-1: ami-0d144a02a790d54a3
+ ap-east-1: ami-0f991dfb212ea3e30
+ ap-southeast-1: ami-0a9dfde00c4fdbf44
+ ap-southeast-2: ami-0432ec565b29d3f0e
+ eu-central-1: ami-0bde2f5e41915b4a2
+ us-east-1: ami-0f20521153a6af3e7
+ us-east-2: ami-064923dd78bf778a8
+ us-west-1: ami-0f49257c4ee6311a5
+ us-west-2: ami-0e308f03a3776ea1f
+ v3_12-x86_64:
+ alpine-ami-3.12.2-x86_64-r0:
+ description: Alpine Linux 3.12.2 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_12-x86_64
+ version: '3.12'
+ release: 3.12.2
+ arch: x86_64
+ revision: r0
+ creation_date: '2020-12-13T19:07:54.000Z'
+ end_of_life: '2022-05-01T00:00:00'
+ build_time: 1607915274
+ artifacts:
+ af-south-1: ami-0a2c528c48b724eb1
+ eu-north-1: ami-0f97b4e83b330a44b
+ ap-south-1: ami-0082a1edc963aa684
+ eu-west-3: ami-0837b3fcb00163a7d
+ eu-west-2: ami-0a8578d7d4ebca125
+ eu-south-1: ami-027ed683f42684d45
+ eu-west-1: ami-00185f6c477e1099d
+ ap-northeast-2: ami-0c869c3c23407b0d5
+ me-south-1: ami-0ff80f770d65d1cbf
+ ap-northeast-1: ami-0e4245b0cbe57cb99
+ sa-east-1: ami-0d276bc117826a38a
+ ca-central-1: ami-090b8e0d13afd07c1
+ ap-east-1: ami-0efde8684085c8a1e
+ ap-southeast-1: ami-0a40d2bc9bfc47553
+ ap-southeast-2: ami-0e7c828c974171a77
+ eu-central-1: ami-062cda84fa4f4abe0
+ us-east-1: ami-042e99e8ac5b82667
+ us-east-2: ami-0bf39a1d2a7d83170
+ us-west-1: ami-089fe5bbb8ee72815
+ us-west-2: ami-096f9b59745c9d447
+3.12.3:
+ v3_12-aarch64:
+ alpine-ami-3.12.3-aarch64-r0:
+ description: Alpine Linux 3.12.3 aarch64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_12-aarch64
+ version: '3.12'
+ release: 3.12.3
+ arch: aarch64
+ revision: r0
+ creation_date: '2020-12-19T02:44:37.000Z'
+ end_of_life: '2022-05-01T00:00:00'
+ build_time: 1608374677
+ artifacts:
+ af-south-1: ami-025ddc2e2931d0bf2
+ eu-north-1: ami-0e3ad874b66b72f5b
+ ap-south-1: ami-00de8b114b35175e6
+ eu-west-3: ami-0d3cfa58b050f7090
+ eu-west-2: ami-08b76009eb990b44a
+ eu-south-1: ami-084274896601da8f5
+ eu-west-1: ami-055f823d50dc901c0
+ ap-northeast-2: ami-09702b3f22e8616c8
+ me-south-1: ami-05a9eaed7e7f67c95
+ ap-northeast-1: ami-010debbee0fe7fbcb
+ sa-east-1: ami-00890e1d93b0d2750
+ ca-central-1: ami-0a1a8875a6a460565
+ ap-east-1: ami-023ba7dde5800c5b5
+ ap-southeast-1: ami-0e3ff62bec8a2f949
+ ap-southeast-2: ami-077f7467876246e89
+ eu-central-1: ami-00e9dcc013b89ec7b
+ us-east-1: ami-044f158b810baa6d4
+ us-east-2: ami-0973e3c7bc90a4801
+ us-west-1: ami-01834462564dfb367
+ us-west-2: ami-0bedcc0226437e2e0
+ v3_12-x86_64:
+ alpine-ami-3.12.3-x86_64-r0:
+ description: Alpine Linux 3.12.3 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_12-x86_64
+ version: '3.12'
+ release: 3.12.3
+ arch: x86_64
+ revision: r0
+ creation_date: '2020-12-19T02:33:21.000Z'
+ end_of_life: '2022-05-01T00:00:00'
+ build_time: 1608374001
+ artifacts:
+ af-south-1: ami-06d5540221d65ca01
+ eu-north-1: ami-051fcf0312ac02b05
+ ap-south-1: ami-023fe0b4c4dc73f8c
+ eu-west-3: ami-0fa68ac5365833d75
+ eu-west-2: ami-01282190055d34e3e
+ eu-south-1: ami-06b311d896c16a3a2
+ eu-west-1: ami-0846229ad28aefe20
+ ap-northeast-2: ami-0cfb5eabfb58d5f72
+ me-south-1: ami-0bee0f3b523892c11
+ ap-northeast-1: ami-0250e4a691729357a
+ sa-east-1: ami-0af3d5295dfa78f9a
+ ca-central-1: ami-0a5084eac39a18d31
+ ap-east-1: ami-02c576f223356bf34
+ ap-southeast-1: ami-0f06993534aec820f
+ ap-southeast-2: ami-0f66203a3a619f732
+ eu-central-1: ami-06a298dc479cf2a73
+ us-east-1: ami-098a996634a88542f
+ us-east-2: ami-07012d290ef9c028e
+ us-west-1: ami-0570d3bcb39152bb8
+ us-west-2: ami-009f13dc01dec6a56
+3.11.7:
+ v3_11-x86_64:
+ alpine-ami-3.11.7-x86_64-r0:
+ description: Alpine Linux 3.11.7 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_11-x86_64
+ version: '3.11'
+ release: 3.11.7
+ arch: x86_64
+ revision: r0
+ creation_date: '2020-12-19T02:48:10.000Z'
+ end_of_life: '2021-11-01T00:00:00'
+ build_time: 1608374890
+ artifacts:
+ af-south-1: ami-05cf48a10f6002168
+ eu-north-1: ami-05b0683850b38c6d5
+ ap-south-1: ami-050c579c7459a48c2
+ eu-west-3: ami-07e0f0262ff7b7da9
+ eu-west-2: ami-07e738b263969a042
+ eu-south-1: ami-0642f11c989872666
+ eu-west-1: ami-0956524d21583a27a
+ ap-northeast-2: ami-09346dc8fc008c9f3
+ me-south-1: ami-0d033bc51aa9fc3c6
+ ap-northeast-1: ami-0dc80e3c7e0aedb4e
+ sa-east-1: ami-07ec4797792079c72
+ ca-central-1: ami-0af7eccbeacce0f05
+ ap-east-1: ami-096def05737bb9fa5
+ ap-southeast-1: ami-02d1e1bf59cca56f6
+ ap-southeast-2: ami-055e9bb961d28d69d
+ eu-central-1: ami-05794ddba50a9a744
+ us-east-1: ami-0f5a58345290f20fe
+ us-east-2: ami-089db2524f896109e
+ us-west-1: ami-0a0564916b7d4a510
+ us-west-2: ami-0b9f7e5619a03a0ea
+3.12.1:
+ v3_12-aarch64:
alpine-ami-3.12.1-aarch64-r1:
description: Alpine Linux 3.12.1 aarch64 r1 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -349,8 +467,9 @@ v3_12-aarch64:
release: 3.12.1
arch: aarch64
revision: r1
+ creation_date: '2020-11-22T03:11:36.000Z'
end_of_life: '2022-05-01T00:00:00'
- build_time: '1606044423'
+ build_time: 1606043496
artifacts:
af-south-1: ami-06588f43a51375252
eu-north-1: ami-0cfce5134bf4de486
@@ -380,8 +499,9 @@ v3_12-aarch64:
release: 3.12.1
arch: aarch64
revision: r0
+ creation_date: '2020-11-04T22:49:01.000Z'
end_of_life: '2022-05-01T00:00:00'
- build_time: '1604561089'
+ build_time: 1604558941
artifacts:
af-south-1: ami-09fcd0ee80e2c6ced
eu-north-1: ami-0b1aad32939a91c82
@@ -403,198 +523,7 @@ v3_12-aarch64:
us-east-2: ami-07deadfa79bb4613a
us-west-1: ami-0daaa29d5c8b1ecaf
us-west-2: ami-0d6579e59926d4377
- 3.12.2:
- alpine-ami-3.12.2-aarch64-r0:
- description: Alpine Linux 3.12.2 aarch64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_12-aarch64
- version: '3.12'
- release: 3.12.2
- arch: aarch64
- revision: r0
- end_of_life: '2022-05-01T00:00:00'
- build_time: '1607916556'
- artifacts:
- us-west-2: ami-0e308f03a3776ea1f
- af-south-1: ami-01bddee275c090a50
- eu-north-1: ami-07b793f6b41391228
- ap-south-1: ami-0759affb95b30e7fb
- eu-west-3: ami-0e27cfc827138e618
- eu-west-2: ami-007b53f9896902dbb
- eu-south-1: ami-093ee59d023f73f01
- eu-west-1: ami-0872a57824a7c8a0f
- ap-northeast-2: ami-053378f981bc37c5a
- me-south-1: ami-0d6b8517fe502f094
- ap-northeast-1: ami-0a5c2347daea31320
- sa-east-1: ami-0cb7785de4b330978
- ca-central-1: ami-0d144a02a790d54a3
- ap-east-1: ami-0f991dfb212ea3e30
- ap-southeast-1: ami-0a9dfde00c4fdbf44
- ap-southeast-2: ami-0432ec565b29d3f0e
- eu-central-1: ami-0bde2f5e41915b4a2
- us-east-1: ami-0f20521153a6af3e7
- us-east-2: ami-064923dd78bf778a8
- us-west-1: ami-0f49257c4ee6311a5
- 3.12.3:
- alpine-ami-3.12.3-aarch64-r0:
- description: Alpine Linux 3.12.3 aarch64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_12-aarch64
- version: '3.12'
- release: 3.12.3
- arch: aarch64
- revision: r0
- end_of_life: '2022-05-01T00:00:00'
- build_time: 1608345895
- artifacts:
- us-west-2: ami-0bedcc0226437e2e0
- af-south-1: ami-025ddc2e2931d0bf2
- eu-north-1: ami-0e3ad874b66b72f5b
- ap-south-1: ami-00de8b114b35175e6
- eu-west-3: ami-0d3cfa58b050f7090
- eu-west-2: ami-08b76009eb990b44a
- eu-south-1: ami-084274896601da8f5
- eu-west-1: ami-055f823d50dc901c0
- ap-northeast-2: ami-09702b3f22e8616c8
- me-south-1: ami-05a9eaed7e7f67c95
- ap-northeast-1: ami-010debbee0fe7fbcb
- sa-east-1: ami-00890e1d93b0d2750
- ca-central-1: ami-0a1a8875a6a460565
- ap-east-1: ami-023ba7dde5800c5b5
- ap-southeast-1: ami-0e3ff62bec8a2f949
- ap-southeast-2: ami-077f7467876246e89
- eu-central-1: ami-00e9dcc013b89ec7b
- us-east-1: ami-044f158b810baa6d4
- us-east-2: ami-0973e3c7bc90a4801
- us-west-1: ami-01834462564dfb367
-edge-aarch64:
- edge:
- alpine-ami-edge-aarch64-20201104223817:
- description: Alpine Linux edge aarch64 20201104223817 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-aarch64
- version: edge
- release: edge
- arch: aarch64
- revision: '20201104223817'
- end_of_life: '2020-11-05T22:38:17'
- build_time: '1604559828'
- artifacts:
- af-south-1: ami-0752fc9ce476a4721
- eu-north-1: ami-0f4fa14d45948f11a
- ap-south-1: ami-08c7798c7f965cd80
- eu-west-3: ami-0f34326e028b1a6b1
- eu-west-2: ami-0031a8d8a3e592132
- eu-south-1: ami-05cb6a0b441d9fef4
- eu-west-1: ami-04e9f2e813ff9fe6a
- ap-northeast-2: ami-046e31ba8884954fd
- me-south-1: ami-007fc801f4d00c286
- ap-northeast-1: ami-026b0f30357b6c249
- sa-east-1: ami-09a322ab8f34e327f
- ca-central-1: ami-0f17d9899463f2d0c
- ap-east-1: ami-0a676c33f22ff9796
- ap-southeast-1: ami-0466de6f68ac671b5
- ap-southeast-2: ami-073efd513d0bf10d1
- eu-central-1: ami-0632fda5bb88d28fc
- us-east-1: ami-0fb5290b89cd3ae5d
- us-east-2: ami-0962215a714b76135
- us-west-1: ami-091c85b576c87cfae
- us-west-2: ami-0fba23a2dedcb193e
- alpine-ami-edge-aarch64-20201122030849:
- description: Alpine Linux edge aarch64 20201122030849 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-aarch64
- version: edge
- release: edge
- arch: aarch64
- revision: '20201122030849'
- end_of_life: '2020-11-23T03:08:49'
- build_time: '1606047950'
- artifacts:
- af-south-1: ami-0935c72001f7a2f54
- eu-north-1: ami-036b9e312ed47bc58
- ap-south-1: ami-09ba0c9f67aee101b
- eu-west-3: ami-0309fb3773c6ca01f
- eu-west-2: ami-010f08d8babfeba66
- eu-south-1: ami-0ed4d967ec895a6dd
- eu-west-1: ami-0bd9b6eea6a55c618
- ap-northeast-2: ami-08c14f5cd992d6cfd
- me-south-1: ami-0a57b6a1ca13e2c16
- ap-northeast-1: ami-0d724ea7e866b21ce
- sa-east-1: ami-0fa45fb2df9da5785
- ca-central-1: ami-022ed81730915d151
- ap-east-1: ami-0a043964fc03396fe
- ap-southeast-1: ami-0933f563594672cec
- ap-southeast-2: ami-08dbccb68710bda49
- eu-central-1: ami-04215f5b57249ad9c
- us-east-1: ami-0929958d98bd00814
- us-east-2: ami-0b7166a71a0e31b0b
- us-west-1: ami-0cef2acb137d37026
- us-west-2: ami-0d4de7896759005a1
- alpine-ami-edge-aarch64-20201213190459:
- description: Alpine Linux edge aarch64 20201213190459 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-aarch64
- version: edge
- release: edge
- arch: aarch64
- revision: '20201213190459'
- end_of_life: '2020-12-14T19:04:59'
- build_time: '1607915770'
- artifacts:
- us-west-2: ami-0769e7ae6646ee6ce
- af-south-1: ami-0ef1ed51536d4c21c
- eu-north-1: ami-0fd0089405ce34751
- ap-south-1: ami-0fb7826afebdee836
- eu-west-3: ami-0a5b6e3683e165f46
- eu-west-2: ami-01f876c398a9a1e8a
- eu-south-1: ami-08a7fd2863b4cf769
- eu-west-1: ami-06844e8cfb88e3488
- ap-northeast-2: ami-0be33da35fb42cf91
- me-south-1: ami-012a6c8b0aa9755e5
- ap-northeast-1: ami-0c3e9ea96d54b2fa6
- sa-east-1: ami-0490301bf3d8f367b
- ca-central-1: ami-03a14b888f050a80c
- ap-east-1: ami-0960c97dbfb4c2370
- ap-southeast-1: ami-052c0924f23638e55
- ap-southeast-2: ami-08a3a7e67af495c34
- eu-central-1: ami-0c1ed5c6c58a479a1
- us-east-1: ami-088169794239b59c9
- us-east-2: ami-08d78e14e90b41779
- us-west-1: ami-0fc9b035119434b1a
- alpine-ami-edge-aarch64-20201219023017:
- description: Alpine Linux edge aarch64 20201219023017 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: edge-aarch64
- version: edge
- release: edge
- arch: aarch64
- revision: '20201219023017'
- end_of_life: '2020-12-20T02:30:17'
- build_time: 1608345536
- artifacts:
- us-west-2: ami-082390a369bbeec92
- af-south-1: ami-07a6dbca85456ca7d
- eu-north-1: ami-0e99b8aafb11d906e
- ap-south-1: ami-083d9e5de667bf303
- eu-west-3: ami-071c3f1a5e6149b8d
- eu-west-2: ami-06a6c48ddf101be91
- eu-south-1: ami-0439753d6d0a62c8c
- eu-west-1: ami-0fb7049a355e67dd0
- ap-northeast-2: ami-00c4b2ff9ba78029f
- me-south-1: ami-0c104cc8c6b41dee0
- ap-northeast-1: ami-059d668e854ac0219
- sa-east-1: ami-005599fbab4c82cc9
- ca-central-1: ami-0727dd3c84677edaa
- ap-east-1: ami-07f55a0f369e88cc4
- ap-southeast-1: ami-0ccbac70492a3aaaf
- ap-southeast-2: ami-0ae21901800152085
- eu-central-1: ami-0d31dea4e6538c397
- us-east-1: ami-04e9e4c6e875ee40d
- us-east-2: ami-06f27121f9aae420c
- us-west-1: ami-0dbd39c2a43b4775c
-v3_12-x86_64:
- 3.12.1:
+ v3_12-x86_64:
alpine-ami-3.12.1-x86_64-r0:
description: Alpine Linux 3.12.1 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -603,8 +532,9 @@ v3_12-x86_64:
release: 3.12.1
arch: x86_64
revision: r0
+ creation_date: '2020-11-04T22:43:40.000Z'
end_of_life: '2022-05-01T00:00:00'
- build_time: '1604561032'
+ build_time: 1604558620
artifacts:
af-south-1: ami-0fa34e940c7164179
eu-north-1: ami-043101bc60cae6466
@@ -626,210 +556,8 @@ v3_12-x86_64:
us-east-2: ami-07243c178e6ca055c
us-west-1: ami-0c9a9eac6d74fff97
us-west-2: ami-03d82b210e0c36983
- 3.12.2:
- alpine-ami-3.12.2-x86_64-r0:
- description: Alpine Linux 3.12.2 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_12-x86_64
- version: '3.12'
- release: 3.12.2
- arch: x86_64
- revision: r0
- end_of_life: '2022-05-01T00:00:00'
- build_time: '1607915274'
- artifacts:
- us-west-2: ami-096f9b59745c9d447
- af-south-1: ami-0a2c528c48b724eb1
- eu-north-1: ami-0f97b4e83b330a44b
- ap-south-1: ami-0082a1edc963aa684
- eu-west-3: ami-0837b3fcb00163a7d
- eu-west-2: ami-0a8578d7d4ebca125
- eu-south-1: ami-027ed683f42684d45
- eu-west-1: ami-00185f6c477e1099d
- ap-northeast-2: ami-0c869c3c23407b0d5
- me-south-1: ami-0ff80f770d65d1cbf
- ap-northeast-1: ami-0e4245b0cbe57cb99
- sa-east-1: ami-0d276bc117826a38a
- ca-central-1: ami-090b8e0d13afd07c1
- ap-east-1: ami-0efde8684085c8a1e
- ap-southeast-1: ami-0a40d2bc9bfc47553
- ap-southeast-2: ami-0e7c828c974171a77
- eu-central-1: ami-062cda84fa4f4abe0
- us-east-1: ami-042e99e8ac5b82667
- us-east-2: ami-0bf39a1d2a7d83170
- us-west-1: ami-089fe5bbb8ee72815
- 3.12.3:
- alpine-ami-3.12.3-x86_64-r0:
- description: Alpine Linux 3.12.3 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_12-x86_64
- version: '3.12'
- release: 3.12.3
- arch: x86_64
- revision: r0
- end_of_life: '2022-05-01T00:00:00'
- build_time: 1608345219
- artifacts:
- us-west-2: ami-009f13dc01dec6a56
- af-south-1: ami-06d5540221d65ca01
- eu-north-1: ami-051fcf0312ac02b05
- ap-south-1: ami-023fe0b4c4dc73f8c
- eu-west-3: ami-0fa68ac5365833d75
- eu-west-2: ami-01282190055d34e3e
- eu-south-1: ami-06b311d896c16a3a2
- eu-west-1: ami-0846229ad28aefe20
- ap-northeast-2: ami-0cfb5eabfb58d5f72
- me-south-1: ami-0bee0f3b523892c11
- ap-northeast-1: ami-0250e4a691729357a
- sa-east-1: ami-0af3d5295dfa78f9a
- ca-central-1: ami-0a5084eac39a18d31
- ap-east-1: ami-02c576f223356bf34
- ap-southeast-1: ami-0f06993534aec820f
- ap-southeast-2: ami-0f66203a3a619f732
- eu-central-1: ami-06a298dc479cf2a73
- us-east-1: ami-098a996634a88542f
- us-east-2: ami-07012d290ef9c028e
- us-west-1: ami-0570d3bcb39152bb8
-v3_10-x86_64:
- 3.10.4:
- alpine-ami-3.10.4-x86_64-r0:
- description: Alpine Linux 3.10.4 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_10-x86_64
- version: '3.10'
- release: 3.10.4
- arch: x86_64
- revision: r0
- end_of_life: '2021-05-01T00:00:00'
- build_time: '1580899963'
- artifacts:
- eu-north-1: ami-0011e13dbacb8fcb4
- ap-south-1: ami-00fac10f41dff96e4
- eu-west-3: ami-070b405f25870cfa4
- eu-west-2: ami-047029018b46688b5
- eu-west-1: ami-0d645d9aa9af199e7
- ap-northeast-2: ami-03a2be707d4d83cea
- ap-northeast-1: ami-0dc770d65f50e9339
- sa-east-1: ami-01af983d84e7075aa
- ca-central-1: ami-0a54918dadce6828a
- ap-southeast-1: ami-0aadcaa1f71c42546
- ap-southeast-2: ami-0ba48065660ab830f
- eu-central-1: ami-01de425983c4c1bfc
- us-east-1: ami-014e31a6d6da30eb7
- us-east-2: ami-004421f607bf25444
- us-west-1: ami-0e07b975efa6cba65
- us-west-2: ami-07128e75c4dcc9c7c
- 3.10.3:
- alpine-ami-3.10.3-x86_64-r1:
- description: Alpine Linux 3.10.3 x86_64 r1 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_10-x86_64
- version: '3.10'
- release: 3.10.3
- arch: x86_64
- revision: r1
- end_of_life: '2021-05-01T00:00:00'
- build_time: '1572150070'
- artifacts:
- eu-north-1: ami-00207f3df9a9cb088
- ap-south-1: ami-0a8839c12787f0c46
- eu-west-3: ami-0ef9a828aded0a0de
- eu-west-2: ami-02520e7e046db5d8f
- eu-west-1: ami-01c1ec8fdefc61650
- ap-northeast-2: ami-0e749a03d064c1e47
- ap-northeast-1: ami-0760cd78e75cb77a4
- sa-east-1: ami-0ee958f7773223770
- ca-central-1: ami-016d172dee4ff4a22
- ap-southeast-1: ami-0f0e2be5d8c0110c1
- ap-southeast-2: ami-0ca4caea0ce1f4a8a
- eu-central-1: ami-04e50c8006d4bc2bf
- us-east-1: ami-063cb098a86c1c4cc
- us-east-2: ami-0110d80369eb75f49
- us-west-1: ami-00b06ce695a617956
- us-west-2: ami-0d0b7768c8cd9a8c8
- 3.10.1:
- alpine-ami-3.10.1-x86_64-r0:
- description: Alpine Linux 3.10.1 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_10-x86_64
- version: '3.10'
- release: 3.10.1
- arch: x86_64
- revision: r0
- end_of_life: '2021-05-01T00:00:00'
- build_time: '1562975219'
- artifacts:
- eu-north-1: ami-020c6eab877f87e9c
- ap-south-1: ami-0f704cf587a1bd591
- eu-west-3: ami-07098b9dc4e34adee
- eu-west-2: ami-01fe12a7b5f0ae5e4
- eu-west-1: ami-08f5d4eaae3855536
- ap-northeast-2: ami-0fc9157e14e1701ea
- ap-northeast-1: ami-039a6734ca3e107c2
- sa-east-1: ami-06b3a596069b29720
- ca-central-1: ami-073a7bdf1f93fdf07
- ap-southeast-1: ami-04ee093ad3986c1e2
- ap-southeast-2: ami-08b686d005668aa12
- eu-central-1: ami-02b0787907fb72c16
- us-east-1: ami-0cce76b5f0a9c52f3
- us-east-2: ami-0e0eea8fb3cea9bf6
- us-west-1: ami-0db3b834555de24aa
- us-west-2: ami-01ddc73ca7c75f53d
- alpine-ami-3.10.1-x86_64-r1:
- description: Alpine Linux 3.10.1 x86_64 r1 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_10-x86_64
- version: '3.10'
- release: 3.10.1
- arch: x86_64
- revision: r1
- end_of_life: '2021-05-01T00:00:00'
- build_time: '1564213143'
- artifacts:
- eu-north-1: ami-0859a31a742c902ed
- ap-south-1: ami-09e1bd549945283a2
- eu-west-3: ami-06a5559ce996d5bac
- eu-west-2: ami-06e36c52d4a7c245a
- eu-west-1: ami-00fcd74ef57d7f27d
- ap-northeast-2: ami-06637cd011ec49efa
- ap-northeast-1: ami-0adeee26a46805278
- sa-east-1: ami-0087fd3ce3d62d34d
- ca-central-1: ami-02fed61c453469d90
- ap-southeast-1: ami-081de8e0c4d9e28e5
- ap-southeast-2: ami-0e2c774fdc1d38ba1
- eu-central-1: ami-0659cf3939d5818e6
- us-east-1: ami-063929a9ea787ced6
- us-east-2: ami-0a5ef71ab2deee8fd
- us-west-1: ami-04165aa967c5fb241
- us-west-2: ami-08147c2b1a80b44c4
- 3.10.5:
- alpine-ami-3.10.5-x86_64-r0:
- description: Alpine Linux 3.10.5 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_10-x86_64
- version: '3.10'
- release: 3.10.5
- arch: x86_64
- revision: r0
- end_of_life: '2021-05-01T00:00:00'
- build_time: '1587886362'
- artifacts:
- eu-north-1: ami-041b6bdb27dbc8226
- ap-south-1: ami-0c8a22fa0ee90c07a
- eu-west-3: ami-0bbb1a9d10ee0e6ee
- eu-west-2: ami-08ca328d558bee247
- eu-west-1: ami-0451f26166639b1b9
- ap-northeast-2: ami-0595dc50c0f0e23f7
- ap-northeast-1: ami-043d40c880c7a176b
- sa-east-1: ami-088bc83fe1497e710
- ca-central-1: ami-08c250f635a417222
- ap-southeast-1: ami-0244d1373053cfe5b
- ap-southeast-2: ami-0cf284dc25e35862d
- eu-central-1: ami-0a626b78c94340b6e
- us-east-1: ami-0e635ea3ca126c707
- us-east-2: ami-0f5a09a7d1d0ae35f
- us-west-1: ami-06c2aa86f3a72385e
- us-west-2: ami-0b6f8a395fa8b5961
+3.10.5:
+ v3_10-x86_64:
alpine-ami-3.10.5-x86_64-r1:
description: Alpine Linux 3.10.5 x86_64 r1 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -838,10 +566,10 @@ v3_10-x86_64:
release: 3.10.5
arch: x86_64
revision: r1
+ creation_date: '2020-12-19T02:36:06.000Z'
end_of_life: '2021-05-01T00:00:00'
- build_time: 1608345383
+ build_time: 1608374166
artifacts:
- us-west-2: ami-0605acecb09204ae6
af-south-1: ami-0f04d696b9bb2a043
eu-north-1: ami-00b16b9ae0a30f956
ap-south-1: ami-07e6e99350bef94dd
@@ -861,64 +589,97 @@ v3_10-x86_64:
us-east-1: ami-0ad73f561b0d903fa
us-east-2: ami-0c15ef6ad3bdb364d
us-west-1: ami-0f06f7abd4a2481fc
- 3.10.0:
- alpine-ami-3.10.0-x86_64-r0:
- description: Alpine Linux 3.10.0 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ us-west-2: ami-0605acecb09204ae6
+ alpine-ami-3.10.5-x86_64-r0:
+ description: Alpine Linux 3.10.5 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
profile_build: v3_10-x86_64
version: '3.10'
- release: 3.10.0
+ release: 3.10.5
arch: x86_64
revision: r0
+ creation_date: '2020-04-25T23:32:37.000Z'
end_of_life: '2021-05-01T00:00:00'
- build_time: '1561036079'
+ build_time: 1587886357
artifacts:
- eu-north-1: ami-069c11c7844825375
- ap-south-1: ami-06ab2e1b19df43403
- eu-west-3: ami-0385dc3d759aaa464
- eu-west-2: ami-0a5d209eea58688c2
- eu-west-1: ami-076b4d480f72a117f
- ap-northeast-2: ami-0b2ab59439d69c87f
- ap-northeast-1: ami-00d72ba9e4e50e6f0
- sa-east-1: ami-04ddd371cd342921d
- ca-central-1: ami-035f9ddc53b8e3c94
- ap-southeast-1: ami-097e487f602370726
- ap-southeast-2: ami-0f2248216c030f2ea
- eu-central-1: ami-0c2583ed13862fb17
- us-east-1: ami-0647412cf72f247d9
- us-east-2: ami-0fb394548acf15691
- us-west-1: ami-04d80966c446c3f58
- us-west-2: ami-0c71a8664131b42b3
- 3.10.2:
- alpine-ami-3.10.2-x86_64-r1:
- description: Alpine Linux 3.10.2 x86_64 r1 - https://github.com/mcrute/alpine-ec2-ami
+ eu-north-1: ami-041b6bdb27dbc8226
+ ap-south-1: ami-0c8a22fa0ee90c07a
+ eu-west-3: ami-0bbb1a9d10ee0e6ee
+ eu-west-2: ami-08ca328d558bee247
+ eu-west-1: ami-0451f26166639b1b9
+ ap-northeast-2: ami-0595dc50c0f0e23f7
+ ap-northeast-1: ami-043d40c880c7a176b
+ sa-east-1: ami-088bc83fe1497e710
+ ca-central-1: ami-08c250f635a417222
+ ap-southeast-1: ami-0244d1373053cfe5b
+ ap-southeast-2: ami-0cf284dc25e35862d
+ eu-central-1: ami-0a626b78c94340b6e
+ us-east-1: ami-0e635ea3ca126c707
+ us-east-2: ami-0f5a09a7d1d0ae35f
+ us-west-1: ami-06c2aa86f3a72385e
+ us-west-2: ami-0b6f8a395fa8b5961
+3.10.4:
+ v3_10-x86_64:
+ alpine-ami-3.10.4-x86_64-r0:
+ description: Alpine Linux 3.10.4 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
profile_build: v3_10-x86_64
version: '3.10'
- release: 3.10.2
+ release: 3.10.4
+ arch: x86_64
+ revision: r0
+ creation_date: '2020-02-05T02:52:39.000Z'
+ end_of_life: '2021-05-01T00:00:00'
+ build_time: 1580899959
+ artifacts:
+ eu-north-1: ami-0011e13dbacb8fcb4
+ ap-south-1: ami-00fac10f41dff96e4
+ eu-west-3: ami-070b405f25870cfa4
+ eu-west-2: ami-047029018b46688b5
+ eu-west-1: ami-0d645d9aa9af199e7
+ ap-northeast-2: ami-03a2be707d4d83cea
+ ap-northeast-1: ami-0dc770d65f50e9339
+ sa-east-1: ami-01af983d84e7075aa
+ ca-central-1: ami-0a54918dadce6828a
+ ap-southeast-1: ami-0aadcaa1f71c42546
+ ap-southeast-2: ami-0ba48065660ab830f
+ eu-central-1: ami-01de425983c4c1bfc
+ us-east-1: ami-014e31a6d6da30eb7
+ us-east-2: ami-004421f607bf25444
+ us-west-1: ami-0e07b975efa6cba65
+ us-west-2: ami-07128e75c4dcc9c7c
+3.10.3:
+ v3_10-x86_64:
+ alpine-ami-3.10.3-x86_64-r1:
+ description: Alpine Linux 3.10.3 x86_64 r1 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_10-x86_64
+ version: '3.10'
+ release: 3.10.3
arch: x86_64
revision: r1
+ creation_date: '2019-10-26T20:21:08.000Z'
end_of_life: '2021-05-01T00:00:00'
- build_time: '1566814550'
+ build_time: 1572150068
artifacts:
- eu-north-1: ami-0ac4f026a4624309e
- ap-south-1: ami-03c079c4f6a77bcd8
- eu-west-3: ami-0196d7c3d0c2e5230
- eu-west-2: ami-04c585868e7f9016e
- eu-west-1: ami-073456a92b131bee5
- ap-northeast-2: ami-0eb3806a09c62e80a
- ap-northeast-1: ami-0865b6aea9d3d4e9a
- sa-east-1: ami-0437041273be4d2b3
- ca-central-1: ami-0aeee1c23a65f09e5
- ap-southeast-1: ami-03cbf9e5c42bd2de0
- ap-southeast-2: ami-040ee9c325bd773bb
- eu-central-1: ami-01c4a5f25d39d8c1d
- us-east-1: ami-0b13bd8ab9492449c
- us-east-2: ami-0a87fa8a73b9b850c
- us-west-1: ami-009961e3d2d7ccaa8
- us-west-2: ami-0a083cc95e2bbc4b0
-v3_9-x86_64:
- 3.9.4:
+ eu-north-1: ami-00207f3df9a9cb088
+ ap-south-1: ami-0a8839c12787f0c46
+ eu-west-3: ami-0ef9a828aded0a0de
+ eu-west-2: ami-02520e7e046db5d8f
+ eu-west-1: ami-01c1ec8fdefc61650
+ ap-northeast-2: ami-0e749a03d064c1e47
+ ap-northeast-1: ami-0760cd78e75cb77a4
+ sa-east-1: ami-0ee958f7773223770
+ ca-central-1: ami-016d172dee4ff4a22
+ ap-southeast-1: ami-0f0e2be5d8c0110c1
+ ap-southeast-2: ami-0ca4caea0ce1f4a8a
+ eu-central-1: ami-04e50c8006d4bc2bf
+ us-east-1: ami-063cb098a86c1c4cc
+ us-east-2: ami-0110d80369eb75f49
+ us-west-1: ami-00b06ce695a617956
+ us-west-2: ami-0d0b7768c8cd9a8c8
+3.9.4:
+ v3_9-x86_64:
alpine-ami-3.9.4-x86_64-r1:
description: Alpine Linux 3.9.4 x86_64 r1 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -927,8 +688,9 @@ v3_9-x86_64:
release: 3.9.4
arch: x86_64
revision: r1
+ creation_date: '2019-07-26T23:48:27.000Z'
end_of_life: '2021-01-01T00:00:00'
- build_time: '1564213710'
+ build_time: 1564213707
artifacts:
eu-north-1: ami-01c04b1d21717da2d
ap-south-1: ami-091de53a3582f2779
@@ -954,8 +716,9 @@ v3_9-x86_64:
release: 3.9.4
arch: x86_64
revision: r0
+ creation_date: '2019-06-20T05:16:50.000Z'
end_of_life: '2021-01-01T00:00:00'
- build_time: '1561036615'
+ build_time: 1561036610
artifacts:
eu-north-1: ami-09267b5c6d7722fdd
ap-south-1: ami-0cb67b835ca871537
@@ -973,64 +736,8 @@ v3_9-x86_64:
us-east-2: ami-074a01fd0b7de0135
us-west-1: ami-0a70d6f1ce22ddfb1
us-west-2: ami-006aeb6d57c92f978
- 3.9.6:
- alpine-ami-3.9.6-x86_64-r0:
- description: Alpine Linux 3.9.6 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_9-x86_64
- version: '3.9'
- release: 3.9.6
- arch: x86_64
- revision: r0
- end_of_life: '2021-01-01T00:00:00'
- build_time: '1587887420'
- artifacts:
- eu-north-1: ami-07a2b23059054aea3
- ap-south-1: ami-00af726ec2f4077a2
- eu-west-3: ami-00a425aa20737343e
- eu-west-2: ami-08c87b358b24d1df3
- eu-west-1: ami-0eb2b54ab4d09eb80
- ap-northeast-2: ami-0f9ad7c51e14bdc3d
- ap-northeast-1: ami-0133f3a571f684178
- sa-east-1: ami-0ea679407da47b78a
- ca-central-1: ami-0583a99f342097b6c
- ap-southeast-1: ami-0d52e9d7f91ca051c
- ap-southeast-2: ami-054360648343b66bc
- eu-central-1: ami-051eec0106a08df6d
- us-east-1: ami-004f0550310a2d7aa
- us-east-2: ami-045a2cc3fe272caee
- us-west-1: ami-026a54e52daea1233
- us-west-2: ami-0b933475d362cbfab
- 3.9.5:
- alpine-ami-3.9.5-x86_64-r0:
- description: Alpine Linux 3.9.5 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_9-x86_64
- version: '3.9'
- release: 3.9.5
- arch: x86_64
- revision: r0
- end_of_life: '2021-01-01T00:00:00'
- build_time: '1580901101'
- artifacts:
- eu-north-1: ami-0dae27e872bbb58a3
- ap-south-1: ami-03aa6dfb6b5c5b24d
- eu-west-3: ami-01d92abfc31832091
- eu-west-2: ami-0ca53eef190752d9b
- eu-west-1: ami-032df31e3645eac89
- ap-northeast-2: ami-042ed34c048fd4dde
- ap-northeast-1: ami-0f22ba5f542102103
- sa-east-1: ami-044b116c38c67bbe6
- ca-central-1: ami-07ced81b329157965
- ap-southeast-1: ami-09aa8a66b52872964
- ap-southeast-2: ami-0883e80a814ca1ead
- eu-central-1: ami-0b1156425ee49460e
- us-east-1: ami-01d51c30d2c611d0b
- us-east-2: ami-023a120054be00f14
- us-west-1: ami-0b628545bb655d1e3
- us-west-2: ami-06dc8e37edaccd91d
-v3_11-x86_64:
- 3.11.0:
+3.11.0:
+ v3_11-x86_64:
alpine-ami-3.11.0-x86_64-r0:
description: Alpine Linux 3.11.0 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -1039,8 +746,9 @@ v3_11-x86_64:
release: 3.11.0
arch: x86_64
revision: r0
+ creation_date: '2019-12-20T03:36:53.000Z'
end_of_life: '2021-05-01T00:00:00'
- build_time: '1576841818'
+ build_time: 1576841813
artifacts:
eu-north-1: ami-01dc7a794c0c8062b
ap-south-1: ami-0dba9ec182268ab0a
@@ -1058,7 +766,66 @@ v3_11-x86_64:
us-east-2: ami-01d8b7e276ad609aa
us-west-1: ami-08d909997839b6030
us-west-2: ami-07a62f65352c51750
- 3.11.3:
+3.10.1:
+ v3_10-x86_64:
+ alpine-ami-3.10.1-x86_64-r0:
+ description: Alpine Linux 3.10.1 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_10-x86_64
+ version: '3.10'
+ release: 3.10.1
+ arch: x86_64
+ revision: r0
+ creation_date: '2019-07-12T15:46:56.000Z'
+ end_of_life: '2021-05-01T00:00:00'
+ build_time: 1562975216
+ artifacts:
+ eu-north-1: ami-020c6eab877f87e9c
+ ap-south-1: ami-0f704cf587a1bd591
+ eu-west-3: ami-07098b9dc4e34adee
+ eu-west-2: ami-01fe12a7b5f0ae5e4
+ eu-west-1: ami-08f5d4eaae3855536
+ ap-northeast-2: ami-0fc9157e14e1701ea
+ ap-northeast-1: ami-039a6734ca3e107c2
+ sa-east-1: ami-06b3a596069b29720
+ ca-central-1: ami-073a7bdf1f93fdf07
+ ap-southeast-1: ami-04ee093ad3986c1e2
+ ap-southeast-2: ami-08b686d005668aa12
+ eu-central-1: ami-02b0787907fb72c16
+ us-east-1: ami-0cce76b5f0a9c52f3
+ us-east-2: ami-0e0eea8fb3cea9bf6
+ us-west-1: ami-0db3b834555de24aa
+ us-west-2: ami-01ddc73ca7c75f53d
+ alpine-ami-3.10.1-x86_64-r1:
+ description: Alpine Linux 3.10.1 x86_64 r1 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_10-x86_64
+ version: '3.10'
+ release: 3.10.1
+ arch: x86_64
+ revision: r1
+ creation_date: '2019-07-26T23:39:00.000Z'
+ end_of_life: '2021-05-01T00:00:00'
+ build_time: 1564213140
+ artifacts:
+ eu-north-1: ami-0859a31a742c902ed
+ ap-south-1: ami-09e1bd549945283a2
+ eu-west-3: ami-06a5559ce996d5bac
+ eu-west-2: ami-06e36c52d4a7c245a
+ eu-west-1: ami-00fcd74ef57d7f27d
+ ap-northeast-2: ami-06637cd011ec49efa
+ ap-northeast-1: ami-0adeee26a46805278
+ sa-east-1: ami-0087fd3ce3d62d34d
+ ca-central-1: ami-02fed61c453469d90
+ ap-southeast-1: ami-081de8e0c4d9e28e5
+ ap-southeast-2: ami-0e2c774fdc1d38ba1
+ eu-central-1: ami-0659cf3939d5818e6
+ us-east-1: ami-063929a9ea787ced6
+ us-east-2: ami-0a5ef71ab2deee8fd
+ us-west-1: ami-04165aa967c5fb241
+ us-west-2: ami-08147c2b1a80b44c4
+3.11.3:
+ v3_11-x86_64:
alpine-ami-3.11.3-x86_64-r0:
description: Alpine Linux 3.11.3 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -1067,8 +834,9 @@ v3_11-x86_64:
release: 3.11.3
arch: x86_64
revision: r0
+ creation_date: '2020-02-05T03:01:56.000Z'
end_of_life: '2021-11-01T00:00:00'
- build_time: '1580900519'
+ build_time: 1580900516
artifacts:
eu-north-1: ami-025350371c14bbcf9
ap-south-1: ami-01597af5b044c6534
@@ -1086,7 +854,8 @@ v3_11-x86_64:
us-east-2: ami-0741188fc6d365c12
us-west-1: ami-065633a2b189f7550
us-west-2: ami-050dd0423825ae4cd
- 3.11.6:
+3.11.6:
+ v3_11-x86_64:
alpine-ami-3.11.6-x86_64-r0:
description: Alpine Linux 3.11.6 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -1095,8 +864,9 @@ v3_11-x86_64:
release: 3.11.6
arch: x86_64
revision: r0
+ creation_date: '2020-04-25T23:41:10.000Z'
end_of_life: '2021-11-01T00:00:00'
- build_time: '1587886872'
+ build_time: 1587886870
artifacts:
eu-north-1: ami-03830331da71d3b6a
ap-south-1: ami-08437e8244154999a
@@ -1114,7 +884,8 @@ v3_11-x86_64:
us-east-2: ami-014d15ba809c1e48f
us-west-1: ami-05f659e5fe3528bbd
us-west-2: ami-0380e01590d421d3e
- 3.11.2:
+3.11.2:
+ v3_11-x86_64:
alpine-ami-3.11.2-x86_64-r0:
description: Alpine Linux 3.11.2 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -1123,8 +894,9 @@ v3_11-x86_64:
release: 3.11.2
arch: x86_64
revision: r0
+ creation_date: '2020-01-04T19:12:52.000Z'
end_of_life: '2021-11-01T00:00:00'
- build_time: '1578193976'
+ build_time: 1578193972
artifacts:
eu-north-1: ami-03ce6e520f43392b9
ap-south-1: ami-0b0f33d8cfb9e5051
@@ -1142,7 +914,128 @@ v3_11-x86_64:
us-east-2: ami-018b2823c3aa8b78e
us-west-1: ami-04de5ae2ed495f580
us-west-2: ami-0282e49ac0502691d
- 3.11.5:
+3.10.0:
+ v3_10-x86_64:
+ alpine-ami-3.10.0-x86_64-r0:
+ description: Alpine Linux 3.10.0 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_10-x86_64
+ version: '3.10'
+ release: 3.10.0
+ arch: x86_64
+ revision: r0
+ creation_date: '2019-06-20T05:07:53.000Z'
+ end_of_life: '2021-05-01T00:00:00'
+ build_time: 1561036073
+ artifacts:
+ eu-north-1: ami-069c11c7844825375
+ ap-south-1: ami-06ab2e1b19df43403
+ eu-west-3: ami-0385dc3d759aaa464
+ eu-west-2: ami-0a5d209eea58688c2
+ eu-west-1: ami-076b4d480f72a117f
+ ap-northeast-2: ami-0b2ab59439d69c87f
+ ap-northeast-1: ami-00d72ba9e4e50e6f0
+ sa-east-1: ami-04ddd371cd342921d
+ ca-central-1: ami-035f9ddc53b8e3c94
+ ap-southeast-1: ami-097e487f602370726
+ ap-southeast-2: ami-0f2248216c030f2ea
+ eu-central-1: ami-0c2583ed13862fb17
+ us-east-1: ami-0647412cf72f247d9
+ us-east-2: ami-0fb394548acf15691
+ us-west-1: ami-04d80966c446c3f58
+ us-west-2: ami-0c71a8664131b42b3
+3.9.6:
+ v3_9-x86_64:
+ alpine-ami-3.9.6-x86_64-r0:
+ description: Alpine Linux 3.9.6 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_9-x86_64
+ version: '3.9'
+ release: 3.9.6
+ arch: x86_64
+ revision: r0
+ creation_date: '2020-04-25T23:50:15.000Z'
+ end_of_life: '2021-01-01T00:00:00'
+ build_time: 1587887415
+ artifacts:
+ eu-north-1: ami-07a2b23059054aea3
+ ap-south-1: ami-00af726ec2f4077a2
+ eu-west-3: ami-00a425aa20737343e
+ eu-west-2: ami-08c87b358b24d1df3
+ eu-west-1: ami-0eb2b54ab4d09eb80
+ ap-northeast-2: ami-0f9ad7c51e14bdc3d
+ ap-northeast-1: ami-0133f3a571f684178
+ sa-east-1: ami-0ea679407da47b78a
+ ca-central-1: ami-0583a99f342097b6c
+ ap-southeast-1: ami-0d52e9d7f91ca051c
+ ap-southeast-2: ami-054360648343b66bc
+ eu-central-1: ami-051eec0106a08df6d
+ us-east-1: ami-004f0550310a2d7aa
+ us-east-2: ami-045a2cc3fe272caee
+ us-west-1: ami-026a54e52daea1233
+ us-west-2: ami-0b933475d362cbfab
+3.10.2:
+ v3_10-x86_64:
+ alpine-ami-3.10.2-x86_64-r1:
+ description: Alpine Linux 3.10.2 x86_64 r1 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_10-x86_64
+ version: '3.10'
+ release: 3.10.2
+ arch: x86_64
+ revision: r1
+ creation_date: '2019-08-26T02:15:44.000Z'
+ end_of_life: '2021-05-01T00:00:00'
+ build_time: 1566814544
+ artifacts:
+ eu-north-1: ami-0ac4f026a4624309e
+ ap-south-1: ami-03c079c4f6a77bcd8
+ eu-west-3: ami-0196d7c3d0c2e5230
+ eu-west-2: ami-04c585868e7f9016e
+ eu-west-1: ami-073456a92b131bee5
+ ap-northeast-2: ami-0eb3806a09c62e80a
+ ap-northeast-1: ami-0865b6aea9d3d4e9a
+ sa-east-1: ami-0437041273be4d2b3
+ ca-central-1: ami-0aeee1c23a65f09e5
+ ap-southeast-1: ami-03cbf9e5c42bd2de0
+ ap-southeast-2: ami-040ee9c325bd773bb
+ eu-central-1: ami-01c4a5f25d39d8c1d
+ us-east-1: ami-0b13bd8ab9492449c
+ us-east-2: ami-0a87fa8a73b9b850c
+ us-west-1: ami-009961e3d2d7ccaa8
+ us-west-2: ami-0a083cc95e2bbc4b0
+3.9.5:
+ v3_9-x86_64:
+ alpine-ami-3.9.5-x86_64-r0:
+ description: Alpine Linux 3.9.5 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
+ profile: alpine
+ profile_build: v3_9-x86_64
+ version: '3.9'
+ release: 3.9.5
+ arch: x86_64
+ revision: r0
+ creation_date: '2020-02-05T03:11:35.000Z'
+ end_of_life: '2021-01-01T00:00:00'
+ build_time: 1580901095
+ artifacts:
+ eu-north-1: ami-0dae27e872bbb58a3
+ ap-south-1: ami-03aa6dfb6b5c5b24d
+ eu-west-3: ami-01d92abfc31832091
+ eu-west-2: ami-0ca53eef190752d9b
+ eu-west-1: ami-032df31e3645eac89
+ ap-northeast-2: ami-042ed34c048fd4dde
+ ap-northeast-1: ami-0f22ba5f542102103
+ sa-east-1: ami-044b116c38c67bbe6
+ ca-central-1: ami-07ced81b329157965
+ ap-southeast-1: ami-09aa8a66b52872964
+ ap-southeast-2: ami-0883e80a814ca1ead
+ eu-central-1: ami-0b1156425ee49460e
+ us-east-1: ami-01d51c30d2c611d0b
+ us-east-2: ami-023a120054be00f14
+ us-west-1: ami-0b628545bb655d1e3
+ us-west-2: ami-06dc8e37edaccd91d
+3.11.5:
+ v3_11-x86_64:
alpine-ami-3.11.5-x86_64-r0:
description: Alpine Linux 3.11.5 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
profile: alpine
@@ -1151,8 +1044,9 @@ v3_11-x86_64:
release: 3.11.5
arch: x86_64
revision: r0
+ creation_date: '2020-04-03T02:27:09.000Z'
end_of_life: '2021-11-01T00:00:00'
- build_time: '1585909634'
+ build_time: 1585909629
artifacts:
eu-north-1: ami-0f326f36494b66d68
ap-south-1: ami-0df79a6a767372395
@@ -1170,63 +1064,3 @@ v3_11-x86_64:
us-east-2: ami-0325fc21b50ee19ba
us-west-1: ami-003d6e7746c7e938e
us-west-2: ami-0966c757f79c1a553
- 3.11.7:
- alpine-ami-3.11.7-x86_64-r0:
- description: Alpine Linux 3.11.7 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: v3_11-x86_64
- version: '3.11'
- release: 3.11.7
- arch: x86_64
- revision: r0
- end_of_life: '2021-11-01T00:00:00'
- build_time: 1608346108
- artifacts:
- us-west-2: ami-0b9f7e5619a03a0ea
- af-south-1: ami-05cf48a10f6002168
- eu-north-1: ami-05b0683850b38c6d5
- ap-south-1: ami-050c579c7459a48c2
- eu-west-3: ami-07e0f0262ff7b7da9
- eu-west-2: ami-07e738b263969a042
- eu-south-1: ami-0642f11c989872666
- eu-west-1: ami-0956524d21583a27a
- ap-northeast-2: ami-09346dc8fc008c9f3
- me-south-1: ami-0d033bc51aa9fc3c6
- ap-northeast-1: ami-0dc80e3c7e0aedb4e
- sa-east-1: ami-07ec4797792079c72
- ca-central-1: ami-0af7eccbeacce0f05
- ap-east-1: ami-096def05737bb9fa5
- ap-southeast-1: ami-02d1e1bf59cca56f6
- ap-southeast-2: ami-055e9bb961d28d69d
- eu-central-1: ami-05794ddba50a9a744
- us-east-1: ami-0f5a58345290f20fe
- us-east-2: ami-089db2524f896109e
- us-west-1: ami-0a0564916b7d4a510
-current-x86_64:
- 3.9.4:
- alpine-ami-3.9.4-x86_64-r0:
- description: Alpine Linux 3.9.4 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
- profile: alpine
- profile_build: current-x86_64
- version: '3.9'
- release: 3.9.4
- arch: x86_64
- revision: r0
- end_of_life: '2021-01-01T00:00:00'
- build_time: '1560251961'
- artifacts:
- eu-north-1: ami-0f7b7e2bef1209f6c
- ap-south-1: ami-0f94a69d1ff0a7860
- eu-west-3: ami-084cb673481c3f793
- eu-west-2: ami-091a16ac6bd29bdd3
- eu-west-1: ami-09234e83a8015efa4
- ap-northeast-2: ami-028d3d1675161319e
- ap-northeast-1: ami-0bb4073495ff2021e
- sa-east-1: ami-014d631c23ebf306a
- ca-central-1: ami-05a3c167410bf6b35
- ap-southeast-1: ami-0f1c039e595dd2d02
- ap-southeast-2: ami-0ca5b7ca3caa92758
- eu-central-1: ami-02df82b83ad2cdaec
- us-east-1: ami-04a29b11e34acf54d
- us-east-2: ami-0d9445885a19e00ca
- us-west-1: ami-0bef2dc6d3f4e19a2
diff --git a/scripts/builder.py b/scripts/builder.py
index 26c2826..8eb1c70 100755
--- a/scripts/builder.py
+++ b/scripts/builder.py
@@ -55,6 +55,16 @@ import boto3
import pyhocon
+# allows us to set values deep within an object that might not be fully defined
+def dictfactory():
+ return defaultdict(dictfactory)
+
+# undo dictfactory() objects to normal objects
+def undictfactory(o):
+ if isinstance(o, defaultdict):
+ o = {k: undictfactory(v) for k, v in o.items()}
+ return o
+
# This is an ugly hack. We occasionally need the region name but it's not
# attached to anything publicly exposed on the client objects. Hide this here.
def region_from_client(client):
@@ -376,347 +386,6 @@ class IdentityBrokerClient:
yield self._boto3_session_from_creds(self._get(cred_url), region)
-class GenReleaseReadme:
- """Generate releases/README_.md
- """
-
- command_name = "gen-release-readme"
-
- SECTION_TPL = textwrap.dedent("""
- ### Alpine Linux {release} ({date})
- click to show/hide
-
- {rows}
-
-
- """)
-
- AMI_TPL = (
- " [{id}](https://{r}.console.aws.amazon.com/ec2/home"
- "#Images:visibility=public-images;imageId={id}) "
- "([launch](https://{r}.console.aws.amazon.com/ec2/home"
- "#launchAmi={id})) |"
- )
-
- archs = ['x86_64', 'aarch64']
-
- @staticmethod
- def extract_ver(x):
- return StrictVersion("0.0" if x["release"] == "edge" else x["release"])
-
- def get_sorted_releases(self, release_data):
- sections = defaultdict(lambda: {
- "release": "",
- "built": {},
- "name": {},
- "ami": defaultdict(dict)
- })
-
- for build, releases in release_data.items():
- for release, amis in releases.items():
- for name, info in amis.items():
- arch = info["arch"]
- built = int(info["build_time"])
- ver = sections[info["version"]]
-
- if arch not in ver["built"] or ver["built"][arch] < built:
- ver["release"] = release
- ver["name"][arch] = name
- ver["built"][arch] = built
-
- for region, ami in info["artifacts"].items():
- ver["ami"][region][arch] = ami
-
- return sorted(sections.values(), key=self.extract_ver, reverse=True)
-
- def make_ami_list(self, sorted_releases):
- ami_list = "## AMIs\n"
-
- # TODO: this may need some more thought for (rare) cases when regions
- # don't all have the same-named images for some reason
- for info in sorted_releases:
- rows = ["| Region |", "| ------ |"]
-
- for arch in self.archs:
- if arch in info["name"]:
- rows[0] += f" {info['name'][arch]} |"
- rows[1] += " --- |"
-
- for region, amis in sorted(info["ami"].items()):
- row = f"| {region} |"
- for arch in self.archs:
- if arch in amis:
- row += self.AMI_TPL.format(r=region, id=amis[arch])
- rows.append(row)
-
- ami_list += self.SECTION_TPL.format(
- release=info["release"].capitalize(),
- date=datetime.utcfromtimestamp(
- max(info["built"].values())).date(),
- rows="\n".join(rows))
-
- return ami_list
-
- @staticmethod
- def add_args(parser):
- parser.add_argument("profile", help="name of profile to update")
-
- def run(self, args, root, log):
- profile = args.profile
-
- release_dir = os.path.join(root, "releases")
- profile_file = os.path.join(release_dir, f"{profile}.yaml")
- with open(profile_file, "r") as data:
- sorted_releases = self.get_sorted_releases(yaml.safe_load(data))
-
- readme_md = os.path.join(release_dir, f"README_{profile}.md")
-
- readme = ""
- action = "Updated"
- if os.path.exists(readme_md):
- with open(readme_md, "r") as file:
- readme = file.read()
- else:
- action = "Created"
-
- re_images = re.compile(r"## AMIs.*\Z", flags=re.DOTALL)
-
- if re_images.search(readme):
- re_images.sub(
- self.make_ami_list(sorted_releases),
- readme)
- else:
- readme += "\n" + self.make_ami_list(sorted_releases)
-
- with open(readme_md, "w") as file:
- file.write(readme)
-
- log.info(f"{action} {readme_md}")
-
-
-class MakeAMIs:
- """Build Packer JSON variable files from HOCON build profiles
- """
-
- command_name = "make-amis"
-
- @staticmethod
- def add_args(parser):
- parser.add_argument("--region", "-r", default="us-west-2",
- help="region to use for build")
- parser.add_argument("--use-broker", action="store_true",
- help="use identity broker to obtain per-region credentials")
- parser.add_argument("profile", help="name of profile to build")
- parser.add_argument("builds", nargs="*",
- help="name of builds within a profile to build")
-
- @staticmethod
- def get_artifact_id(root, profile, build):
- manifest_json = os.path.join(
- root, "build", "profile", profile, build,
- "manifest.json")
- with open(manifest_json, "r") as data:
- manifest = json.load(data)
- return manifest['builds'][0]['artifact_id'].split(':')[1]
-
- def run(self, args, root, log):
- os.chdir(os.path.join(root, "build"))
-
- builds = args.builds or os.listdir(
- os.path.join("profile", args.profile))
-
- artifacts = []
-
- for build in builds:
- log.info("\n*** Building %s/%s ***\n\n", args.profile, build)
-
- build_dir = os.path.join("profile", args.profile, build)
- if not os.path.exists(build_dir):
- log.info("Build dir '%s' does not exist", build_dir)
- break
-
- env = None
- if args.use_broker:
- creds = IdentityBrokerClient().get_credentials(args.region)
- env = {
- "PATH": os.environ.get("PATH"),
- "AWS_ACCESS_KEY_ID": creds["access_key"],
- "AWS_SECRET_ACCESS_KEY": creds["secret_key"],
- "AWS_SESSION_TOKEN": creds["session_token"],
- "AWS_DEFAULT_REGION": args.region,
- }
-
- out = io.StringIO()
-
- res = subprocess.Popen([
- os.environ.get("PACKER", "packer"),
- "build",
- f"-var-file={build_dir}/vars.json",
- "packer.json"
- ], stdout=subprocess.PIPE, encoding="utf-8", env=env)
-
- while res.poll() is None:
- text = res.stdout.readline()
- out.write(text)
- print(text, end="") # input is already colorized
-
- if res.returncode == 0:
- artifacts.append(self.get_artifact_id(root, args.profile, build))
- else:
- if "is used by an existing AMI" in out.getvalue():
- continue
- else:
- sys.exit(res.returncode)
-
- log.info("\n=== DONE ===\n\nNew: " + ' '.join(artifacts) + "\n")
-
-
-# TODO: profiles should encode retention policy...
-# - keeping latest images per
-# - keeping images past their EOL
-class PruneAMIs:
- """Prune AMIs from AWS
- """
-
- command_name = "prune-amis"
-
- @staticmethod
- def add_args(parser):
- LEVEL_HELP = textwrap.dedent("""\
- revision - keep only the latest revision per release
- release - keep only the latest release per version
- version - keep only the versions that aren't end-of-life
- """)
-
- parser.add_argument(
- "level", choices=["revision", "release", "version"],
- help=LEVEL_HELP)
- # TODO: add --region and --use-broker
- parser.add_argument("profile", help="profile to prune")
- parser.add_argument(
- "build", nargs="?", help="build(s) within profile to prune")
- parser.add_argument(
- '--no-pretend', action='store_true',
- help='actually prune images'
- )
-
- @staticmethod
- def delete_image(ec2, image):
- ec2.deregister_image(ImageId=image["ImageId"])
-
- for blockdev in image["BlockDeviceMappings"]:
- if "Ebs" not in blockdev:
- continue
-
- ec2.delete_snapshot(SnapshotId=blockdev["Ebs"]["SnapshotId"])
-
- def run(self, args, root, log):
- now = datetime.utcnow()
- release_yaml = os.path.join(root, "releases", f"{args.profile}.yaml")
-
- with open(release_yaml, "r") as data:
- before = yaml.safe_load(data)
-
- known = defaultdict(list)
- prune = defaultdict(list)
- after = defaultdict(lambda: defaultdict(dict))
-
- # for all builds in the profile...
- for build_name, releases in before.items():
- # this is not the build that was specified
- if args.build is not None and args.build != build_name:
- log.info("< skipping %s/%s", args.profile, build_name)
- # ensure its release data remains intact
- after[build_name] = before[build_name]
- continue
- else:
- log.info("> PRUNING %s/%s for %s",
- args.profile, build_name, args.level)
-
- criteria = {}
-
- # scan releases for pruning criteria
- for release, amis in releases.items():
- for ami_name, info in amis.items():
- version = info["version"]
- built = info["build_time"]
-
- eol = info.get("end_of_life")
- if eol:
- eol = datetime.fromisoformat(info["end_of_life"])
-
- for region, ami_id in info["artifacts"].items():
- known[region].append(ami_id)
-
- if args.level == "revision":
- # find build timestamp of most recent revision, per release
- if release not in criteria or built > criteria[release]:
- criteria[release] = built
- elif args.level == "release":
- # find build timestamp of most recent revision, per version
- if version not in criteria or built > criteria[version]:
- criteria[version] = built
- elif args.level == "version":
- # find latest EOL date, per version
- if (
- version not in criteria or
- (not criteria[version]) or
- (eol and eol > criteria[version])
- ):
- criteria[version] = eol
-
- # rescan again to determine what doesn't make the cut
- for release, amis in releases.items():
- for ami_name, info in amis.items():
- version = info["version"]
-
- eol = info.get("end_of_life")
- if eol:
- eol = datetime.fromisoformat(info["end_of_life"])
-
- if args.level == "revision":
- if info["build_time"] < criteria[release]:
- for region, ami_id in info["artifacts"].items():
- prune[region].append(ami_id)
- elif args.level == "release":
- if info["build_time"] < criteria[version]:
- for region, ami_id in info["artifacts"].items():
- prune[region].append(ami_id)
- elif args.level == "version":
- if criteria[version] and (
- (version != "edge" and criteria[version] < now) or
- (version == "edge" and ((not eol) or (eol < now)))
- ):
- for region, ami_id in info["artifacts"].items():
- prune[region].append(ami_id)
- else:
- after[build_name][release][ami_name] = info
-
- for session in IdentityBrokerClient().iter_regions():
- region = session.region_name
-
- log.info("* scanning: %s ...", region)
-
- ec2 = session.client("ec2")
- for image in ec2.describe_images(Owners=["self"])["Images"]:
- image_name, image_id = image["Name"], image["ImageId"]
-
- if region in prune and image["ImageId"] in prune[region]:
- if args.no_pretend is True:
- log.error("REMOVING: %s = %s", image_id, image_name)
- self.delete_image(image)
- else:
- log.error("TO_PRUNE: %s = %s", image_id, image_name)
- elif region in known and image["ImageId"] in known[region]:
- log.info("KEEPING: %s = %s", image_id, image_name)
- else:
- log.warning("UNKNOWN: %s = %s", image_id, image_name)
-
- # TODO: need parity with args first
- #if args.no_pretend is True:
- # UpdateReleases.run(args, root, log)
-
-
class ConfigBuilder:
now = datetime.utcnow()
@@ -844,80 +513,180 @@ class ConfigBuilder:
json.dump(cfg, out, indent=4, separators=(",", ": "))
-class ResolveProfiles:
- """Build Packer JSON variable files from HOCON build profiles
+class BuildAMIs:
+ """Build all AMIs for profile, or specific builds within a profile
"""
-
- command_name = "resolve-profiles"
+ command_name = "amis"
@staticmethod
def add_args(parser):
- parser.add_argument(
- "profile", help="name of profile to build", nargs="*")
+ # NOTE: --use-broker and --region are not mutually exclusive here!
+ parser.add_argument("--use-broker", action="store_true",
+ help="use identity broker to obtain region credentials")
+ parser.add_argument("--region", "-r", default="us-west-2",
+ help="region to use for build")
+ parser.add_argument("profile", metavar="PROFILE",
+ help="name of profile to build")
+ parser.add_argument("builds", metavar="BUILD", nargs="*",
+ help="name of build within a profile (multiple OK)")
- def resolve_profiles(self, profiles, root):
+ @staticmethod
+ def get_artifact_id(root, profile, build):
+ manifest_json = os.path.join(
+ root, "build", "profile", profile, build,
+ "manifest.json")
+ with open(manifest_json, "r") as data:
+ manifest = json.load(data)
+ return manifest['builds'][0]['artifact_id'].split(':')[1]
+
+ def make_amis(self, args, root, log):
+ os.chdir(os.path.join(root, "build"))
+
+ builds = args.builds or os.listdir(
+ os.path.join("profile", args.profile))
+
+ artifacts = []
+
+ for build in builds:
+ log.info("\n*** Building %s/%s ***\n\n", args.profile, build)
+
+ build_dir = os.path.join("profile", args.profile, build)
+ if not os.path.exists(build_dir):
+ log.info("Build dir '%s' does not exist", build_dir)
+ break
+
+ env = None
+ if args.use_broker:
+ creds = IdentityBrokerClient().get_credentials(args.region)
+ env = {
+ "PATH": os.environ.get("PATH"),
+ "AWS_ACCESS_KEY_ID": creds["access_key"],
+ "AWS_SECRET_ACCESS_KEY": creds["secret_key"],
+ "AWS_SESSION_TOKEN": creds["session_token"],
+ "AWS_DEFAULT_REGION": args.region,
+ }
+
+ out = io.StringIO()
+
+ res = subprocess.Popen([
+ os.environ.get("PACKER", "packer"),
+ "build",
+ f"-var-file={build_dir}/vars.json",
+ "packer.json"
+ ], stdout=subprocess.PIPE, encoding="utf-8", env=env)
+
+ while res.poll() is None:
+ text = res.stdout.readline()
+ out.write(text)
+ print(text, end="") # input is already colorized
+
+ if res.returncode == 0:
+ artifacts.append(self.get_artifact_id(root, args.profile, build))
+ else:
+ if "is used by an existing AMI" in out.getvalue():
+ continue
+ else:
+ sys.exit(res.returncode)
+
+ return artifacts
+
+ def run(self, args, root, log):
+ log.info("Converting packer.conf to JSON...")
+ source = os.path.join(root, "packer.conf")
+ dest = os.path.join(root, "build", "packer.json")
+ pyhocon.converter.HOCONConverter.convert_from_file(
+ source, dest, "json", 2, False)
+
+ log.info("Resolving profile...")
builder = ConfigBuilder(
os.path.join(root, "profiles"),
os.path.join(root, "build", "profile"))
+ builder.build_profile(args.profile)
- if profiles:
- for profile in profiles:
- builder.build_profile(profile)
- else:
- builder.build_all()
+ log.info("Running packer...")
+ amis = self.make_amis(args, root, log)
+ log.info("\n=== DONE ===\n\nNew: " + ' '.join(amis) + "\n")
- def run(self, args, root, log):
- self.resolve_profiles(args.profile, root)
+
+# These are general-purpose methods
+
+# iterate over EC2 region clients, whether we're using the broker or not
+def iter_regions(use_broker, regions):
+ if use_broker:
+ for region in IdentityBrokerClient().iter_regions():
+ yield region.client('ec2')
+ else:
+ for region in regions:
+ yield boto3.session.Session(region_name=region).client('ec2')
+
+def get_image(client, image_id):
+ images = client.describe_images(ImageIds=[image_id], Owners=["self"])
+ perms = client.describe_image_attribute(
+ Attribute="launchPermission", ImageId=image_id)
+
+ ami = AMI.from_aws_model(images["Images"][0], region_from_client(client))
+ ami.aws_permissions = perms["LaunchPermissions"]
+
+ return ami
+
+def get_images_with_tags(client, **tags):
+ images = []
+
+ res = client.describe_images(Owners=["self"], Filters=[
+ {"Name": f"tag:{k}", "Values": [v]} for k, v in tags.items()])
+
+ for image in res["Images"]:
+ ami = AMI.from_aws_model(image, region_from_client(client))
+ perms = client.describe_image_attribute(
+ Attribute="launchPermission", ImageId=ami.image_id)
+ ami.aws_permissions = perms["LaunchPermissions"]
+ images.append(ami)
+
+ return images
+
+def get_image_with_tags(client, **tags):
+ images = get_images_with_tags(client, **tags)
+ if len(images) > 1:
+ raise Exception(f"Too many images for query {tags!r}")
+ elif len(images) == 0:
+ return None
+ else:
+ return images[0]
+
+def get_all_images(client):
+ return get_images_with_tags(client)
class ReleaseAMIs:
- """Copy AMIs to other regions and optionally make them public.
+ """Copy one or more AMIs to other regions and/or set AMI permissions.
- Copies an AMI from a source region to destination regions. If the AMI
- exists in some regions but not others it will copy only to the new regions.
- This copy will add tags to the destination AMIs to link them to the source
- AMI.
+ By default, source AMI permissions are applied to their copies, unless
+ --public, --private, or --allow-account options are specified.
- By default does not make the AMIs public. Running the command a second time
- with the --public flag will make the already copied AMIs public. If some
- AMIs are public and others are not, will make them all public.
-
- This command will fill in missing regions and synchronized public settings
- if it's re-run with the same AMI ID as new regions are added.
+ If the source AMI's permissions are different than the options provided,
+ its permissions will be updated to match.
"""
-
command_name = "release"
@staticmethod
def add_args(parser):
- parser.add_argument("--use-broker", action="store_true",
- help="use identity broker to obtain per-region credentials")
- parser.add_argument("--public", action="store_true",
- help="make all copied images public, even previously copied ones")
parser.add_argument("--source-region", default="us-west-2",
- help="source region hosting ami to copy")
- parser.add_argument("--region", "-r", action="append",
- help="destination regions for copy, may be specified multiple "
- "times")
- parser.add_argument("--allow-accounts", action="append",
- help="add permissions for other accounts to non-public images, "
- "may be specified multiple times")
- parser.add_argument("--out-file", "-o",
- help="output file for JSON AMI map, otherwise stdout")
- parser.add_argument("ami", help="ami id to copy")
-# TODO: for efficiency, the main release loop will need some work
-# parser.add_argument("amis", nargs="+", help="ami(s) to copy")
-
- @staticmethod
- def check_args(args):
- if not args.use_broker and not args.region:
- return ["Use broker or region must be specified"]
-
- if args.use_broker and args.region:
- return ["Broker and region flags are mutually exclusive."]
-
- if args.out_file and os.path.exists(args.out_file):
- return ["Output file already exists"]
+ metavar="REGION", help="region of source AMI(s)")
+ rgroup = parser.add_mutually_exclusive_group(required=True)
+ rgroup.add_argument("--use-broker", action="store_true",
+ help="identity broker provides destination regions and credentials")
+ rgroup.add_argument("--region", "-r", action="append", dest="regions",
+ metavar="REGION", help="destination region (multiple OK)")
+ pgroup = parser.add_mutually_exclusive_group()
+ pgroup.add_argument("--public", action="store_true", default=None,
+ help="make source and copied AMIs public")
+ pgroup.add_argument("--private", dest="public", action="store_false",
+ help="make source and copied AMIs private")
+ pgroup.add_argument("--allow-account", dest="allow_accounts",
+ action="append", metavar="ID", help="make source and copied AMIs "
+ "accessible by AWS account id (multiple OK)")
+ parser.add_argument("amis", metavar="AMI", nargs="+",
+ help="AMI id(s) to copy")
def get_source_region_client(self, use_broker, source_region):
if use_broker:
@@ -927,52 +696,8 @@ class ReleaseAMIs:
return boto3.session.Session(region_name=source_region).client(
"ec2")
- def iter_regions(self, use_broker, regions):
- if use_broker:
- for region in IdentityBrokerClient().iter_regions():
- yield region.client("ec2")
- return
-
- for region in regions:
- yield boto3.session.Session(region_name=region).client("ec2")
-
- def get_image(self, client, image_id):
- images = client.describe_images(ImageIds=[image_id], Owners=["self"])
- perms = client.describe_image_attribute(
- Attribute="launchPermission", ImageId=image_id)
-
- ami = AMI.from_aws_model(
- images["Images"][0], region_from_client(client))
- ami.aws_permissions = perms["LaunchPermissions"]
-
- return ami
-
- def get_image_with_tags(self, client, **tags):
- images = self.get_images_with_tags(client, **tags)
- if len(images) > 1:
- raise Exception(f"Too many images for query {tags!r}")
- elif len(images) == 0:
- return None
- else:
- return images[0]
-
- def get_images_with_tags(self, client, **tags):
- images = []
-
- res = client.describe_images(Owners=["self"], Filters=[
- {"Name": f"tag:{k}", "Values": [v]} for k, v in tags.items()])
-
- for image in res["Images"]:
- ami = AMI.from_aws_model(image, region_from_client(client))
- perms = client.describe_image_attribute(
- Attribute="launchPermission", ImageId=ami.image_id)
- ami.aws_permissions = perms["LaunchPermissions"]
- images.append(ami)
-
- return images
-
def copy_image(self, from_client, to_client, image_id):
- source = self.get_image(from_client, image_id)
+ source = get_image(from_client, image_id)
res = to_client.copy_image(
Name=source.name, Description=source.description,
@@ -986,213 +711,510 @@ class ReleaseAMIs:
to_client.create_tags(Resources=[res["ImageId"]], Tags=tags)
- return self.get_image(to_client, res["ImageId"])
+ return get_image(to_client, res["ImageId"])
- def has_incorrect_perms(self, ami, accounts, public):
- if accounts and set(ami.allowed_users) != set(accounts):
+ def has_incorrect_perms(self, image, perms):
+ if (set(image.allowed_groups) != set(perms['groups'])
+ or set(image.allowed_users) != set(perms['users'])):
return True
- if public and not ami.public:
- return True
-
- def update_image_permissions(self, client, ami):
+ def update_image_permissions(self, client, image):
+ client.reset_image_attribute(
+ Attribute="launchPermission", ImageId=image.image_id)
client.modify_image_attribute(
- Attribute="launchPermission", ImageId=ami.image_id,
- LaunchPermission={"Add": ami.aws_permissions})
+ Attribute="launchPermission", ImageId=image.image_id,
+ LaunchPermission={"Add": image.aws_permissions})
def run(self, args, root, log):
- released = {}
+ source_perms = {}
pending_copy = []
pending_perms = []
+ source_region = args.source_region
+ log.info(f"Source region {source_region}")
source_client = self.get_source_region_client(
- args.use_broker, args.source_region)
+ args.use_broker, source_region)
-# TODO: iterate over amis from the command line
+ # resolve source ami perms, queue for fixing if necessary
+ for ami in args.amis:
+ image = get_image(source_client, ami)
- # check source ami perms, queue for fixing if necessary
- source_ami = self.get_image(source_client, args.ami)
- if self.has_incorrect_perms(
- source_ami, args.allow_accounts, args.public):
- log.info(f"Incorrect permissions for ami {args.ami} in region "
- f"{source_ami.region}")
- pending_perms.append((source_client, source_ami.image_id))
+ if args.public is True:
+ source_perms[ami] = { 'groups': ['all'], 'users': [] }
+ elif args.public is False:
+ source_perms[ami] = { 'groups': [], 'users': [] }
+ elif args.allow_accounts:
+ source_perms[ami] = { 'groups': [], 'users': args.allow_accounts }
+ else:
+ log.warning(f"Will apply {source_region} {ami} permissions to its copies")
+ source_perms[ami] = {
+ 'groups': image.allowed_groups,
+ 'users': image.allowed_users
+ }
- # Copy image to regions where it is missing, catalog images that need
+ if self.has_incorrect_perms(image, source_perms[ami]):
+ log.warning(f"Will update source {source_region} {ami} permissions")
+ pending_perms.append((source_client, ami, source_perms[ami]))
+
+ # Copy image to regions where it's missing, queue images that need
# permission fixes
- for client in self.iter_regions(args.use_broker, args.region):
+ log.info('')
+ for client in iter_regions(args.use_broker, args.regions):
region_name = region_from_client(client) # For logging
- # Don't copy to source region
- if region_name == region_from_client(source_client):
+ # Don't bother copying to source region
+ if region_name == args.source_region:
continue
- log.info(f"Considering region {region_name}")
- image = self.get_image_with_tags(client, source_ami=args.ami)
- if not image:
- log.info(f"Copying ami {args.ami} from {args.source_region} "
- f"to {region_name}")
- ami = self.copy_image(source_client, client, args.ami)
- pending_copy.append((client, ami.image_id))
- elif self.has_incorrect_perms(
- image, args.allow_accounts, args.public):
- log.info(f"Incorrect permissions for ami {args.ami} in region "
- f"{region_name}")
- pending_perms.append((client, image.image_id))
+ log.info(f"Destination region {region_name}...")
+ for ami in args.amis:
+ src_log = f"* source {ami}"
+ image = get_image_with_tags(client,
+ source_ami=ami, source_region=args.source_region)
+ if not image:
+ log.info(f"{src_log} - copying to {region_name}")
+ ami_copy = self.copy_image(source_client, client, ami)
+ pending_copy.append(
+ (client, ami_copy.image_id, source_perms[ami]))
+ elif self.has_incorrect_perms(image, source_perms[ami]):
+ log.info(f"{src_log} - will update {image.image_id} perms")
+ pending_perms.append(
+ (client, image.image_id, source_perms[ami]))
+ else:
+ log.info(f"{src_log} - verified {image.image_id}")
+ log.info('')
+
+ if pending_copy:
+ # seems to take at least 3m
+ pending_copy.append(('sleep', 180, ''))
# Wait for images to copy
while pending_copy:
- client, id = pending_copy.pop(0) # emulate a FIFO queue
- region_name = region_from_client(client) # For logging
- image = self.get_image(client, id)
- if image.state != AMIState.AVAILABLE:
- log.info(f"Waiting for image copy for {id} to complete "
- f"in {region_name}")
- pending_copy.append((client, id))
- else:
- pending_perms.append((client, id))
- released[region_name] = id
+ client, id, perms = pending_copy.pop(0) # emulate a FIFO queue
+ if client == 'sleep':
+ if not pending_copy:
+ continue
+ log.info(f"Sleeping {id}s...")
+ time.sleep(id)
+ # recheck every 30s
+ pending_copy.append(('sleep', 30, ''))
+ continue
- time.sleep(30)
+ region_name = region_from_client(client) # For logging
+ image = get_image(client, id)
+ if image.state != AMIState.AVAILABLE:
+ log.info(f"- copying: {id} ({region_name})")
+ pending_copy.append((client, id, perms))
+ else:
+ done_log = f"+ completed: {id} ({region_name})"
+ if self.has_incorrect_perms(image, perms):
+ log.info(f"{done_log} - will update perms")
+ pending_perms.append((client, id, perms))
+ else:
+ log.info(f"{done_log} - verified perms")
# Update all permissions
- for client, id in pending_perms:
+ for client, id, perms in pending_perms:
region_name = region_from_client(client) # For logging
- log.info(f"Updating permissions on ami {id} in "
- f"{region_name}")
- image = self.get_image(client, id)
-
- if args.public:
- image.allowed_groups = ["all"]
- elif args.allow_accounts:
- image.allowed_users = args.allow_accounts
-
+ log.info(f"% updating perms: {id} ({region_name})")
+ image = get_image(client, id)
+ image.allowed_groups = perms['groups']
+ image.allowed_users = perms['users']
self.update_image_permissions(client, image)
- if args.out_file:
- with open(args.out_file, "w") as fp:
- json.dump(released, fp, indent=4)
+ if pending_perms:
+ log.info('')
+
+ log.info('Release Completed')
+
+
+class Releases:
+
+ RELEASE_FIELDS = [
+ 'description', 'profile', 'profile_build', 'version', 'release',
+ 'arch', 'revision', 'creation_date', 'end_of_life'
+ ]
+
+ def __init__(self, profile=None, use_broker=None, regions=None):
+ self.profile = profile
+ self.tags = { 'profile': profile }
+ self.use_broker = use_broker
+ self.regions = regions
+ self.clients = {}
+ self.reset_images()
+ self.reset_releases()
+
+ def reset_images(self):
+ self.images = defaultdict(list)
+
+ def reset_releases(self):
+ self.releases = dictfactory()
+
+ # TODO: separate Clients class?
+ def iter_clients(self):
+ if not self.clients:
+ for client in iter_regions(self.use_broker, self.regions):
+ region = region_from_client(client)
+ self.clients[region] = client
+ yield (region, client)
else:
- json.dump(released, sys.stdout, indent=4)
+ for region, client in self.clients.items():
+ yield (region, client)
-class UpdateReleases:
- """Update releases YAML with info about currently existing profile AMIs
+ # when we're just interested in the profile's images
+ def load_profile_images(self, log=None):
+ for region, client in self.iter_clients():
+ if log: log.info(f"Loading '{self.profile}' profile images from {region}...")
+ self.images[region] = get_images_with_tags(client, **self.tags)
+
+ # not belonging to any profile
+ def load_unknown_images(self, log=None):
+ for region, client in self.iter_clients():
+ if log: log.info(f"Loading unknown images from {region}...")
+ for image in get_all_images(client):
+ if 'profile' not in image.tags:
+ self.images[region].append(image)
+
+ # build profile releases object based on loaded self.images
+ def build_releases(self, log=None):
+ for region, amis in self.images.items():
+ if log: log.info(f"{region}")
+ for ami in amis:
+ if ami.profile != self.profile:
+ continue
+
+ if log: log.info(f" * {ami.image_id} {ami.name}")
+ release = ami.release
+ build = ami.profile_build
+ name = ami.name
+ id = ami.image_id
+ build_time = int(dateutil.parser.parse(ami.creation_date).strftime('%s'))
+ release_obj = self.releases[release][build][name]
+
+ for field in self.RELEASE_FIELDS:
+ if field not in release_obj:
+ release_obj[field] = getattr(ami, field)
+
+ # ensure earliest build_time is used
+ if ('build_time' not in release_obj or
+ build_time < release_obj['build_time']):
+ release_obj['build_time'] = build_time
+ release_obj['creation_date'] = ami.creation_date
+
+ release_obj['artifacts'][region] = id
+
+
+class ReleasesYAML:
+ """Update releases/.yaml with profile's currently existing AMIs
"""
-
- command_name = "update-releases"
+ command_name = "release-yaml"
@staticmethod
def add_args(parser):
- parser.add_argument("--use-broker", action="store_true",
- help="use identity broker to obtain per-region credentials")
- parser.add_argument("--region", "-r", action="append",
- help="regions for check, may be specified multiple times")
- parser.add_argument("profile", help="name of profile to refresh")
+ rgroup = parser.add_mutually_exclusive_group(required=True)
+ rgroup.add_argument("--use-broker", action="store_true",
+ help="identity broker provides destination regions and credentials")
+ rgroup.add_argument("--region", "-r", action="append", dest="regions",
+ metavar="REGION", help="destination region (multiple OK)")
+ parser.add_argument("profile", metavar="PROFILE", help="profile name")
+
+ def run(self, args, root, log):
+ release_dir = os.path.join(root, 'releases')
+ if not os.path.exists(release_dir):
+ os.makedirs(release_dir)
+ release_yaml = os.path.join(release_dir, f"{args.profile}.yaml")
+
+ r = Releases(
+ profile = args.profile,
+ use_broker = args.use_broker,
+ regions = args.regions)
+ r.load_profile_images(log)
+ r.build_releases()
+
+ log.info(f"Writing new {release_yaml}")
+ with open(release_yaml, 'w') as data:
+ yaml.dump(undictfactory(r.releases), data, sort_keys=False)
+
+
+class ReleasesReadme:
+ """Build releases/README_.md from releases/.yaml
+ """
+ command_name = "release-readme"
+
+ SECTION_TPL = textwrap.dedent("""
+ ### Alpine Linux {release} ({date})
+ click to show/hide
+
+ {rows}
+
+
+ """)
+
+ AMI_TPL = (
+ " [{id}](https://{r}.console.aws.amazon.com/ec2/home"
+ "#Images:visibility=public-images;imageId={id}) "
+ "([launch](https://{r}.console.aws.amazon.com/ec2/home"
+ "#launchAmi={id})) |"
+ )
@staticmethod
- def check_args(args):
- if not args.use_broker and not args.region:
- return ['Use broker or region must be specified']
+ def add_args(parser):
+ parser.add_argument("profile", metavar="PROFILE", help="profile name")
- if args.use_broker and args.region:
- return ['Broker and region flags are mutually exclusive']
+ @staticmethod
+ def extract_ver(x):
+ return StrictVersion("0.0" if x["release"] == "edge" else x["release"])
+
+ def resolve_sections(self, release_data, log):
+ sects = dictfactory()
+ for release, builds in sorted(release_data.items(), reverse=True):
+ version = '.'.join(release.split('.')[0:2])
+ if version in sects:
+ continue
+ for build, revisions in builds.items():
+ ver = sects[version]
+ ver['release'] = release
+ name, info = sorted(
+ revisions.items(),
+ key=lambda x: x[1]['build_time'],
+ reverse=True)[0]
+ if name in ver['builds']:
+ log.warning(
+ f"Duplicate AMI '{name}' in builds "
+ f"'{info['profile_build']} and "
+ f"'{ver['builds'][name]['build']}")
+ ver['builds'][name] = {
+ 'build': info['profile_build'],
+ 'built': int(info['build_time']),
+ 'amis': info['artifacts']
+ }
+ self.sections = sorted(
+ undictfactory(sects).values(),
+ key=self.extract_ver,
+ reverse=True)
+
+ def get_ami_markdown(self):
+ ami_list = "## AMIs\n"
+
+ for section in self.sections:
+ built = 0
+ regions = []
+ rows = ["| Region |", "| ------ |"]
+
+ for name, info in sorted(section['builds'].items()):
+ rows[0] += f" {name} |"
+ rows[1] += " --- |"
+ regions = set(regions) | set(info['amis'].keys())
+ built = max(built, info['built'])
+
+ for region in sorted(regions):
+ row = f"| {region} |"
+ for name, info in sorted(section['builds'].items()):
+ amis = info['amis']
+ if region in amis:
+ row += self.AMI_TPL.format(r=region, id=amis[region])
+ else:
+ row += ' |'
+ rows.append(row)
+
+ ami_list += self.SECTION_TPL.format(
+ release=section['release'].capitalize(),
+ date=datetime.utcfromtimestamp(built).date(),
+ rows="\n".join(rows))
+
+ return ami_list
def run(self, args, root, log):
profile = args.profile
- tags = { 'profile': args.profile }
-
release_dir = os.path.join(root, "releases")
- if not os.path.exists(release_dir):
- os.makedirs(release_dir)
- release_yaml = os.path.join(release_dir, f"{profile}.yaml")
+ profile_file = os.path.join(release_dir, f"{profile}.yaml")
+ with open(profile_file, "r") as data:
+ self.resolve_sections(yaml.safe_load(data), log)
- # TODO: break this off into its own piece for reuse for pruning too
- releases = {}
- for client in ReleaseAMIs().iter_regions(args.use_broker, args.region):
- region_name = region_from_client(client) # For logging
- log.info(f"Getting {profile} AMIs from {region_name}...")
- amis = ReleaseAMIs().get_images_with_tags(client, **tags)
+ ami_markdown = self.get_ami_markdown()
- for ami in amis:
- build = ami.profile_build
- release = ami.release
- name = ami.name
- ami_id = ami.image_id
+ readme = ""
+ readme_md = os.path.join(release_dir, f"README_{profile}.md")
+ action = "Updated"
+ if os.path.exists(readme_md):
+ with open(readme_md, "r") as file:
+ readme = file.read()
+ else:
+ action = "Created"
- log.info(f" * {ami_id} {name}")
+ re_images = re.compile(r"## AMIs.*\Z", flags=re.DOTALL)
+ if re_images.search(readme):
+ readme = re_images.sub(ami_markdown, readme)
+ else:
+ log.warning("appending")
+ readme += "\n" + ami_markdown
- if build not in releases:
- releases[build] = {}
+ with open(readme_md, "w") as file:
+ file.write(readme)
- if release not in releases[build]:
- releases[build][release] = {}
-
- if name not in releases[build][release]:
- releases[build][release][name] = {
- 'description': ami.description,
- 'profile': profile,
- 'profile_build': build,
- 'version': ami.version,
- 'release': ami.release,
- 'arch': ami.arch,
- 'revision': ami.revision,
- 'end_of_life': ami.end_of_life,
- 'build_time': dateutil.parser.parse(ami.creation_date).strftime('%s'),
- # TODO? source_ami, source_region
- 'artifacts': {}
- }
-
- releases[build][release][name]['artifacts'][region_name] = ami_id
-
- log.info(f"Writing new {release_yaml}")
- with open(release_yaml, "w") as data:
- yaml.dump(releases, data, sort_keys=False)
+ log.info(f"{action} {readme_md}")
-class ConvertPackerJSON:
- """Convert packer.conf to packer.json
+class PruneAMIs:
+ """Prune Released AMIs
"""
-
- command_name = "convert-packer-config"
+ command_name = "prune"
@staticmethod
def add_args(parser):
- pass
+ LEVEL_HELP = textwrap.dedent("""\
+ 'revision' - prune old AMI revisions (x.y.z-r#);
+ 'release' - prune old AMI releases (x.y.#);
+ 'end-of-life' - prune end-of-life AMI versions (#.#);
+ 'UNKNOWN' - prune unknown AMIs (no profile tag)
+ """)
- def run(self, args, root, log):
- source = os.path.join(root, "packer.conf")
- dest = os.path.join(root, "build", "packer.json")
-
- pyhocon.converter.HOCONConverter.convert_from_file(
- source, dest, "json", 2, False)
-
-
-class FullBuild:
- """Make all of the AMIs for a profile
- """
-
- command_name = "amis"
-
- @staticmethod
- def add_args(parser):
- parser.add_argument("--region", "-r", default="us-west-2",
- help="region to use for build")
- parser.add_argument("--use-broker", action="store_true",
+ parser.add_argument("level", metavar='LEVEL',
+ choices=["revision", "release", "end-of-life", "UNKNOWN"],
+ help=LEVEL_HELP)
+ rgroup = parser.add_mutually_exclusive_group(required=True)
+ rgroup.add_argument("--use-broker", action="store_true",
help="use identity broker to obtain per-region credentials")
- parser.add_argument("profile", help="name of profile to build")
- parser.add_argument("builds", nargs="*",
- help="name of builds within a profile to build")
+ rgroup.add_argument("--region", "-r", metavar='REGION', dest='regions',
+ action="append", help="regions to prune, may be specified multiple times")
+ parser.add_argument("profile", metavar='PROFILE',
+ help="profile to prune")
+ parser.add_argument("builds", metavar='BUILD',
+ nargs="*", help="build(s) within profile to prune")
+ agroup = parser.add_mutually_exclusive_group()
+ agroup.add_argument(
+ '--keep', metavar='NUM', type=int, default=0,
+ help='keep NUM most-recent additional otherwise-pruneable per LEVEL')
+ agroup.add_argument('--defer-eol', metavar='DAYS', type=int, default=0,
+ help='defer end-of-life pruning for additional days')
+ parser.add_argument(
+ '--no-pretend', action='store_true', help='actually prune images')
+
+ @staticmethod
+ def check_args(args):
+ if args.level != 'end-of-life' and args.defer_eol != 0:
+ return ["--defer-eol may only be used with 'end-of-life' pruning."]
+ if args.keep < 0:
+ return ["Only non-negative integers are valid for --keep."]
+
+ def __init__(self):
+ self.pruneable = dictfactory()
+
+ def find_pruneable(self, r, args, log):
+ level = args.level
+ builds = args.builds
+ keep = args.keep
+ defer_eol = args.defer_eol
+
+ now = datetime.utcnow() - timedelta(days=args.defer_eol)
+
+ # build releases from profile images
+ r.load_profile_images(log)
+ r.build_releases()
+
+ # scan for pruning criteria
+ criteria = dictfactory()
+ for release, rdata in r.releases.items():
+ for build, bdata in rdata.items():
+ if builds and build not in builds:
+ continue
+ for ami_name, info in bdata.items():
+ version = info['version']
+ built = info['build_time']
+ eol = datetime.fromisoformat(info['end_of_life'])
+ # default: level == 'release'
+ basis = version
+ if level == 'revision':
+ basis = release
+ elif level == 'end-of-life':
+ # not enough in common with revision/release
+ if build not in criteria[version]:
+ criteria[version][build] = [now]
+ if eol < now and eol not in criteria[version][build]:
+ criteria[version][build].append(eol)
+ criteria[version][build].sort(reverse=True)
+ continue
+ # revsion/release have enough commonality
+ if build not in criteria[basis]:
+ criteria[basis][build] = [built]
+ elif built not in criteria[basis][build]:
+ criteria[basis][build].append(built)
+ criteria[basis][build].sort(reverse=True)
+
+ # scan again to determine what doesn't make the cut
+ for release, rdata in r.releases.items():
+ for build, bdata in rdata.items():
+ if builds and build not in builds:
+ continue
+ for ami_name, info in bdata.items():
+ version = info['version']
+ built = info['build_time']
+ eol = datetime.fromisoformat(info['end_of_life'])
+ # default: level == 'release'
+ basis = version
+ value = built
+ if level == 'revision':
+ basis = release
+ elif level == 'end-of-life':
+ value = eol
+ c = criteria[basis][build]
+ if keep < len(c) and value < c[keep]:
+ for region, ami in info['artifacts'].items():
+ self.pruneable[region][ami] = {
+ 'name': ami_name,
+ }
+
+ # populate AMI creation_date and snapshot_id from Release().images
+ for region, images in r.images.items():
+ for image in images:
+ if image.image_id in self.pruneable[region]:
+ p = self.pruneable[region][image.image_id]
+ p['name'] = image.name
+ p['creation_date'] = dateutil.parser.parse(
+ image.creation_date).strftime('%Y-%m-%d')
+ p['snapshot_id'] = image.snapshot_id
+
+ def all_unknown_pruneable(self, r, log):
+ r.load_unknown_images(log)
+ for region, images in r.images.items():
+ for image in images:
+ self.pruneable[region][image.image_id] = {
+ 'name': image.name,
+ 'creation_date': dateutil.parser.parse(
+ image.creation_date).strftime('%Y-%m-%d'),
+ 'snapshot_id': image.snapshot_id
+ }
def run(self, args, root, log):
- log.info("Converting packer.conf to JSON...")
- ConvertPackerJSON().run(args, root, log)
+ # instantiate Releases object
+ r = Releases(
+ profile=args.profile,
+ use_broker=args.use_broker,
+ regions=args.regions)
- log.info("Resolving profiles...")
- ResolveProfiles().resolve_profiles([args.profile], root)
+ if args.level == 'UNKNOWN':
+ self.all_unknown_pruneable(r, log)
+ else:
+ self.find_pruneable(r, args, log)
- log.info("Running packer...")
- MakeAMIs().run(args, root, log)
+ for region, amis in sorted(self.pruneable.items()):
+ r_str = f"{args.level} AMIs in {region}"
+ if not amis:
+ log.info(f"No pruneable {r_str}.")
+ continue
+ if args.no_pretend:
+ log.error(f"REMOVING {r_str}:")
+ else:
+ log.warning(f"Removable {r_str}:")
+ for ami, info in sorted(amis.items(), key=lambda x: x[1]['creation_date']):
+ a_str = f" * {ami} ({info['creation_date']}) {info['name']}"
+ if args.no_pretend:
+ log.warning(a_str)
+ r.clients[region].deregister_image(ImageId=ami)
+ r.clients[region].delete_snapshot(SnapshotId=info['snapshot_id'])
+ else:
+ log.info(a_str)
def find_repo_root():