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():