Merge branch 'initial/part_one' into 'main'
alpine-cloud-images, part one See merge request tomalok/alpine-cloud-images!126
This commit is contained in:
commit
9d882bff7a
9
.gitignore
vendored
9
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
**/*~
|
*~
|
||||||
**/*.bak
|
*.bak
|
||||||
**/*.swp
|
*.swp
|
||||||
/build/
|
.vscode/
|
||||||
|
/work/
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2017-2019 Michael Crute, Jake Buchholz
|
Copyright (c) 2017-2021 Jake Buchholz Göktürk, Michael Crute
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
287
README.md
287
README.md
@ -1,117 +1,228 @@
|
|||||||
# Alpine Linux EC2 AMI Builder
|
## _**NOTE: This is a Work-in-Progress**_
|
||||||
|
|
||||||
These are the official Alpine AWS AMIs. For an index of images see the
|
_It is intended that this will eventually replace
|
||||||
[Alpine Website](https://alpinelinux.org/cloud/).
|
https://gitlab.alpinelinux.org/alpine/cloud/alpine-ec2-ami
|
||||||
|
as the offical multi-cloud image builder for Alpine Linux._
|
||||||
|
|
||||||
## Pre-Built AMIs
|
----
|
||||||
|
|
||||||
***To get started with a pre-built minimalist AMIs, visit
|
# Alpine Linux Cloud Image Builder
|
||||||
https://alpinelinux.org/cloud, or the [README](releases/README.md) in the
|
|
||||||
[releases](releases) subdirectory of this repo.***
|
|
||||||
|
|
||||||
Alternately, with the right filters, you can query the EC2 API to programmatically
|
This repository contains the code and and configs for the build system used to
|
||||||
find our most recent AMIs. For example, using the `aws` command line tool...
|
create official Alpine Linux images for various cloud providers, in various
|
||||||
```
|
configurations. This build system is flexible, enabling others to build their
|
||||||
aws ec2 describe-images \
|
own customized images.
|
||||||
--output text \
|
|
||||||
--filters \
|
|
||||||
Name=owner-id,Values=538276064493 \
|
|
||||||
Name=name,Values='alpine-ami-*' \
|
|
||||||
Name=state,Values=available \
|
|
||||||
Name=tag:profile_build,Values=v3_10-x86_64 \
|
|
||||||
--query 'max_by(Images[], &CreationDate).ImageId'
|
|
||||||
```
|
|
||||||
...will list the latest AMI id from our collection of 'v3_10-x86_64' builds.
|
|
||||||
Refer to the AWS CLI Command Reference for
|
|
||||||
[describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html)
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
## Custom AMIs
|
----
|
||||||
|
## Pre-Built Offical Cloud Images
|
||||||
|
|
||||||
Using the scripts and configuration in this project, you can build your own
|
To get started with offical pre-built Alpine Linux cloud images, visit
|
||||||
custom Alpine Linux AMIs. If you experience any problems building custom AMIs,
|
https://alpinelinux.org/cloud. Currently, we build official images for the
|
||||||
please open an [issue](https://github.com/mcrute/alpine-ec2-ami/issues) and
|
following providers:
|
||||||
include as much detailed information as possible.
|
* AWS
|
||||||
|
|
||||||
|
You should also be able to find the most recently published Alpine Linux
|
||||||
|
images via your cloud provider's web console, or programatically query their
|
||||||
|
API with a CLI tool or library.
|
||||||
|
|
||||||
|
_(TODO: examples)_
|
||||||
|
|
||||||
|
----
|
||||||
|
## Build System
|
||||||
|
|
||||||
|
The build system consists of a number of components:
|
||||||
|
|
||||||
|
* the primary `build` script and related cloud-specific helpers
|
||||||
|
* a directory of `configs/` defining the set of images to be built
|
||||||
|
* a Packer `alpine.pkr.hcl` orchestrating the images' local build, as well as
|
||||||
|
importing them to cloud providers and publishing them to desitnation regions
|
||||||
|
* a directory of `scripts/` which set up the images' contents during
|
||||||
|
provisioning
|
||||||
|
|
||||||
### Build Requirements
|
### Build Requirements
|
||||||
|
* [Python](https://python.org) (3.9.7 is known to work)
|
||||||
|
* [Packer](https://packer.io) (1.7.6 is known to work)
|
||||||
|
* [QEMU](https://www.qemu.org) (6.1.0 is known to work)
|
||||||
|
* cloud provider account(s)
|
||||||
|
|
||||||
* [Packer](https://packer.io) >= 1.4.1
|
### Cloud Credentials
|
||||||
* [Python 3.x](https://python.org) (3.7 is known to work)
|
|
||||||
* an AWS account with an existing subnet in an AWS Virtual Private Cloud
|
|
||||||
|
|
||||||
### Profile Configuration
|
This build system relies on the cloud providers' Python API libraries to find
|
||||||
|
and use the necessary credentials -- via configuration in the user's home
|
||||||
|
directory (i.e. `~/.aws/...`, `~/.oci/...`, etc.) or with special environment
|
||||||
|
variables (i.e. `AWS_...`, `OCI_...`, etc.)
|
||||||
|
|
||||||
Target profile config files reside in the [profiles](profiles) subdirectory,
|
It is expected that each cloud provider's user/role will have been set up with
|
||||||
where you will also find the [config](profiles/alpine.conf) we use for our
|
sufficient permission in order to accomplish the operations necessary to query,
|
||||||
pre-built AMIs. Refer to the [README](profiles/README.md) in that subdirectory
|
import, and publish images; _it is highly recommended that no permissions are
|
||||||
for more details and information about how AMI profile configs work.
|
granted beyond what is absolutely necessary_.
|
||||||
|
|
||||||
### AWS Credentials
|
### The `build` Script
|
||||||
|
|
||||||
These scripts use the `boto3` library to interact with AWS, enabling you to
|
|
||||||
provide your AWS account credentials in a number of different ways. see the
|
|
||||||
offical `boto3` documentation's section on
|
|
||||||
[configuring credentials](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#guide-credentials)
|
|
||||||
for more details. *Please note that these scripts do not implement the first
|
|
||||||
two methods on the list.*
|
|
||||||
|
|
||||||
### Building AMIs
|
|
||||||
|
|
||||||
To build all build targets in a target profile, simply...
|
|
||||||
```
|
```
|
||||||
./scripts/builder.py amis <profile>
|
usage: build [-h] [--debug] [--clean] [--revise] {configs,local,import,publish}
|
||||||
|
[--custom DIR [DIR ...]] [--skip KEY [KEY ...]] [--only KEY [KEY ...]]
|
||||||
|
[--no-color] [--parallel N] [--vars FILE [FILE ...]]
|
||||||
|
|
||||||
|
build steps:
|
||||||
|
configs resolve build configuration
|
||||||
|
local build local images
|
||||||
|
import import to cloud providers
|
||||||
|
publish set permissions and publish to cloud regions
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
--debug enable debug output (False)
|
||||||
|
--clean start with a clean work environment (False)
|
||||||
|
--revise bump revisions if images already published (False)
|
||||||
|
--custom DIR [DIR ...] overlay custom directory in work environment
|
||||||
|
--skip KEY [KEY ...] skip variants with dimension key(s)
|
||||||
|
--only KEY [KEY ...] only variants with dimension key(s)
|
||||||
|
--no-color turn off Packer color output (False)
|
||||||
|
--parallel N build N images in parallel (1)
|
||||||
|
--vars FILE [FILE ...] supply Packer with additional -vars-file(s)
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also build specfic build targets within a profile:
|
A `work/` directory will be created for its Python virtual environment, any
|
||||||
```
|
necessary Python libraries will be `pip install`ed, and `build` will execute
|
||||||
./scripts/builder.py amis <profile> <build1> <build2> ...
|
itself to ensure that it's running in the work environment.
|
||||||
```
|
|
||||||
|
|
||||||
Before each build, new Alpine Linux *releases* are detected and the version's
|
This directory also contains `configs/` and `scripts/` subdirs (with custom
|
||||||
core profile is updated.
|
overlays), UEFI firmware for QEMU, Packer cache, the generated `configs.yaml`
|
||||||
|
and `actions.yaml` configs, and the `images/` tree for local image builds.
|
||||||
|
|
||||||
If there's already an AMI with the same name as the profile build's, that build
|
Use `--clean` if you want to re-overlay, re-download, re-generate, or rebuild
|
||||||
will be skipped and the process moves on to build the other profile's build
|
anything in the `work/` directory. To redo the Python virtual environment,
|
||||||
targets (if any).
|
simply remove the `work/` directory and its contents, and it will be recreated
|
||||||
|
the next time `build` is run.
|
||||||
|
|
||||||
After each successful build, `releases/<profile>.yaml` is updated with the
|
### Build Steps
|
||||||
build's details, including (most importantly) the ids of the AMI artifacts that
|
|
||||||
were built.
|
|
||||||
|
|
||||||
Additional information about using your custom AMIs can be found in the
|
When executing `build` you also provide the target step you wish to reach. For
|
||||||
[README](releases/README.md) in the [releases](releases) subdirectory.
|
example, if you only want to build local images, use `build local`. Any
|
||||||
|
predecessor steps which haven't been done will also be executed -- that is,
|
||||||
|
`build local` also implies `build configs` if that step hasn't completed yet.
|
||||||
|
|
||||||
### Pruning AMIs
|
The **configs** step determines the latest stable Alpine Linux release, and
|
||||||
|
ensures that the `configs/` and `scripts/` overlays, UEFI firmware, and
|
||||||
|
`configs.yaml` exist. This allows you to validate the generated build variant
|
||||||
|
configuration before attempting to build any images locally.
|
||||||
|
|
||||||
Every now and then, you may want to clean up old AMIs from your EC2 account and
|
If `build` is moving on past **configs** to other steps, it will determine which
|
||||||
your profile's `releases/<profile>.yaml`. There are three different levels of
|
image variants to work on (based on `--skip` and `--only` values) and what
|
||||||
pruning:
|
actions will be taken, based on existence of local/imported/published images, and
|
||||||
* `revision` - keep only the latest revision for each release
|
generate the `actions.yaml` file. Providing the `--revise` flag allows you to
|
||||||
* `release` - keep only the latest release for each version
|
rebuild local images that were previously built, reimport unpublished images to
|
||||||
* `end-of-life` - remove any end-of-life versions
|
cloud providers, and bump the "revision" value of previously published images --
|
||||||
|
this is useful if published images require fixes but the Alpine release itself
|
||||||
|
isn't changing; published images are not removed (though they may be pruned once
|
||||||
|
their "end-of-life" date has passed).
|
||||||
|
|
||||||
To prune a profile (or optionally one build target of a profile)...
|
At this point, `build` executes Packer, which is responsible for the remaining
|
||||||
```
|
**local**, **import**, and **publish** steps -- and also for parallelization, if
|
||||||
./scripts/builder.py prune-amis <profile> [<build>]
|
the `--parallel` argument is given. Because build hardware varies, it is also
|
||||||
```
|
possible to tune a number of QEMU timeouts and memory requirements by providing
|
||||||
|
an HCL2 Packer Vars file and specifying `--vars <filename>` to override the
|
||||||
|
defaults in `alpine.pkr.hcl`.
|
||||||
|
|
||||||
### Updating the Release README
|
### Packer and `alpine.pkr.hcl`
|
||||||
|
|
||||||
This make target updates the [releases README](releases/README.md), primarily
|
Packer loads and merges `actions.yaml` and `configs.yaml`, and iterates the
|
||||||
for updating the list of our pre-built AMIs. This may-or-may-not be useful for
|
resulting object in order to determine what it should do with each image
|
||||||
other target profiles.
|
variant configuration.
|
||||||
```
|
|
||||||
./scripts/builder.py gen-release-readme <profile>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Cleaning up the Build Environment
|
`alpine.pkr.hcl` defines two base `source` blocks -- `null` is used when an
|
||||||
|
image variant is already built locally and/or already imported to the
|
||||||
|
destination cloud provider; otherwise, the `qemu` source is used.
|
||||||
|
|
||||||
The build process is careful to place all temporary files in the `build`
|
The `qemu` builder spins up a QEMU virtual machine with a blank virtual disk
|
||||||
subdirectory. Remove the temporary `build` subdirectory, which contains the
|
attached, using the latest stable Alpine Linux Virtual ISO, brings up the VM's
|
||||||
resolved profile and Packer configs, the Python virtual environment, and other
|
network, enables the SSH daemon, and sets a random password for root.
|
||||||
temporary build-related artifacts.
|
|
||||||
|
|
||||||
## Caveats
|
If an image variant is to be **built locally**, the two dynamic provisioners copy
|
||||||
|
the required data for the setup scripts to the VM's `/tmp/` directory, and then
|
||||||
|
run those setup scripts. It's these scripts that are ultimately responsible for
|
||||||
|
installing and configuring the desired image on the attached virtual disk.
|
||||||
|
When the setup scripts are complete, the virtual machine is shut down, and the
|
||||||
|
resulting local disk image can be found at
|
||||||
|
`work/images/<cloud>/<build-name>/image.qcow2`.
|
||||||
|
|
||||||
* New Alpine Linux *versions* are currently not auto-detected and added as a
|
The dynamic post-processor uses the `cloud_helper.py` script to **import** a
|
||||||
core version profile; this process is, at the moment, still a manual task.
|
local image to the cloud provider, and/or **publish** an imported image to the
|
||||||
|
cloud provider's destination regions, based on what actions are applicable for
|
||||||
|
that image variant. When the **publish** step is reapplied to an
|
||||||
|
already-published image, the script ensures that images have been copied to all
|
||||||
|
destination regions (for example, if the cloud provider recently added a new
|
||||||
|
region), and that all launch permissions are set as expected.
|
||||||
|
|
||||||
|
### The `cloud_helper.py` Script
|
||||||
|
|
||||||
|
This script is only meant to be imported by `build` and called from Packer, and
|
||||||
|
provides a normalized cloud-agnostic way of doing common cloud operations --
|
||||||
|
getting details about a variant's latest imported image, importing new local
|
||||||
|
image to the cloud, removing a previouly imported (but unpublished) image so it
|
||||||
|
can be replaced, or publishing an imported image to destination regions.
|
||||||
|
|
||||||
|
----
|
||||||
|
## Build Configuration
|
||||||
|
|
||||||
|
The `build` script generates `work/configs.yaml` based on the contents of the
|
||||||
|
top-level config file, `work/configs/configs.conf`; normally this is a symlink to
|
||||||
|
`alpine.conf`, but can be overridden for custom builds. All configs are
|
||||||
|
declared in [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md)
|
||||||
|
format, which allows importing from other files, simple variable interpolation,
|
||||||
|
and easy merging of objects. This flexibility helps keep configuration
|
||||||
|
[DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself).
|
||||||
|
|
||||||
|
The top-level `build.conf` has three main blocks, `Default` (default/starting
|
||||||
|
values), `Dimensions` (with configs that apply in different circumstances), and
|
||||||
|
`Mandatory` (required/final values). The configuration for these blocks are
|
||||||
|
merged in this exact order.
|
||||||
|
|
||||||
|
### Dimensions and Build Variants
|
||||||
|
|
||||||
|
Build variants _(I was watching Loki™ at the time...)_ are the sets of
|
||||||
|
dimensional "features" and related configuration details produced from a
|
||||||
|
Cartesian product across each of the dimensional keys. Dimensional configs are
|
||||||
|
merged together in the order they appear in `build.conf`.
|
||||||
|
|
||||||
|
If two dimensional keys are incompatible (for example, **version/3.11** did not
|
||||||
|
yet support **arch/aarch64**), an `EXCLUDE` directive indicates that such a
|
||||||
|
variant is non-viable, and will be skipped.
|
||||||
|
|
||||||
|
Likewise, if one dimension's configuration depends on the value of a different
|
||||||
|
dimensional key, the `WHEN` directive will supply the conditional config
|
||||||
|
details when that other dimensional key is part of the variant.
|
||||||
|
|
||||||
|
Currently the base set of dimensions (and dimension keys) are...
|
||||||
|
|
||||||
|
**version** - current "release" value for each is autodetected, and always a
|
||||||
|
component of an image's name
|
||||||
|
* **edge** ("release" value is the current UTC date)
|
||||||
|
* all *non-EOL* Alpine Linux versions
|
||||||
|
|
||||||
|
**arch** - machine architecture
|
||||||
|
* **x86_64** (aka "amd64")
|
||||||
|
* **aarch64** (aka "arm64")
|
||||||
|
|
||||||
|
**firmware** - machine boot firmware
|
||||||
|
* **bios** (legacy BIOS)
|
||||||
|
* **uefi**
|
||||||
|
|
||||||
|
**bootstrap** - image instantiation bootstrap is provided by...
|
||||||
|
* **tiny** (tiny-cloud-boostrap)
|
||||||
|
* **cloudinit** (cloud-init)
|
||||||
|
|
||||||
|
**cloud** - cloud provider or platform
|
||||||
|
* **aws** - Amazone Web Services / EC2
|
||||||
|
* **oci** - Oracle Cloud Infrastructure _(WiP)_
|
||||||
|
* **gcp** - Google Cloud Platform _(WiP)_
|
||||||
|
* **azure** - Microsoft Azure _(WiP)_
|
||||||
|
|
||||||
|
...each dimension may (or may not) contribute to the image name or description,
|
||||||
|
if the dimensional key's config contributes to the `name` or `description`
|
||||||
|
array values.
|
||||||
|
|
||||||
|
### Customized Builds
|
||||||
|
|
||||||
|
_(TODO)_
|
175
README_BROKER.md
175
README_BROKER.md
@ -1,175 +0,0 @@
|
|||||||
# AWS Identity Broker
|
|
||||||
|
|
||||||
The identity broker is used to obtain short-lived and per-region credentials
|
|
||||||
for an account. Opt-in regions require the use of a long-lived credential (e.g.
|
|
||||||
IAM user), enabling global STS tokens, or an STS token sourced in that region.
|
|
||||||
The identity broker holds long-term credentials and uses them to acquire
|
|
||||||
short-term credentials in a given region. The broker also provides a list of
|
|
||||||
opt-in regions and should be used to enumerate regions.
|
|
||||||
|
|
||||||
For human-interactive users the identity broker performs OAUTH against GitHub
|
|
||||||
to chain the user's GitHub identity to the tokens they are given from the
|
|
||||||
broker. The broker also provides the user an API key to use when interacting
|
|
||||||
with the broker programmatically.
|
|
||||||
|
|
||||||
As of May 2020 the identity broker is not open sourced. If you want to provide
|
|
||||||
your own identity broker, the rest of this document specifies the URLs
|
|
||||||
endpoints and response formats to do so.
|
|
||||||
|
|
||||||
# The API
|
|
||||||
|
|
||||||
The identity broker API is a REST-ful service with an entry-point of
|
|
||||||
`/api/account`. All further navigation through the API follows links within the
|
|
||||||
hypertext.
|
|
||||||
|
|
||||||
**Note:** Outside of the account entry-point, URI formats should be considered
|
|
||||||
implementation details of the broker API and should never be templated. Beyond
|
|
||||||
the account entry-point, nothing in this specification is normative with
|
|
||||||
respect to URI paths and locations.
|
|
||||||
|
|
||||||
## Authentication
|
|
||||||
|
|
||||||
All requests to the API must be authenticated with a broker-specific key. That
|
|
||||||
key is provided to the broker in the `X-API-Key` header. When the broker
|
|
||||||
determines that the key is either expired or invalid it must redirect the user
|
|
||||||
to `/logout` to indicate that the user is logged out and must log-in again.
|
|
||||||
|
|
||||||
API keys are bearer tokens and thus must only be exchanged over HTTPS.
|
|
||||||
|
|
||||||
## Status Codes
|
|
||||||
|
|
||||||
`200 OK`: indicates that the request to the broker was successful.
|
|
||||||
|
|
||||||
`302 Found`: indicates that the broker is providing a redirect. Users should
|
|
||||||
check the redirect, if it is to the location `/logout` the user should consider
|
|
||||||
themselves logged out and proceed to login. This condition should not be
|
|
||||||
followed. Otherwise the user should follow all redirects.
|
|
||||||
|
|
||||||
`400 Bad Request`: indicates that some part of the request is invalid as
|
|
||||||
submitted. The hypertext MAY provide a description of this error and how to
|
|
||||||
remedy it.
|
|
||||||
|
|
||||||
`429 Rate Limit Exceeded`: indicates that the broker has rate-limited the user.
|
|
||||||
A user should discontinue requests to the broker immediately and wait for at
|
|
||||||
least 30 seconds before continuing their requests. The rate limit parameters
|
|
||||||
are specific to the broker and not controlled by this spec.
|
|
||||||
|
|
||||||
`500 Server Error`: indicates a server error condition that is not under the
|
|
||||||
user's control.
|
|
||||||
|
|
||||||
## Account End-point
|
|
||||||
|
|
||||||
The account end-point acts as a index of the rest of the API. It presents a
|
|
||||||
list of accounts to which the user has access as well as links to navigate
|
|
||||||
further into the API. The format of this document is:
|
|
||||||
|
|
||||||
`short_name` (string): a url-safe name for the account, used as the primary
|
|
||||||
account identifier within the broker.
|
|
||||||
|
|
||||||
`account_number` (integer): the AWS account number
|
|
||||||
|
|
||||||
`name` (string): a user-friendly name for the account
|
|
||||||
|
|
||||||
`console_redirect_url` (uri): a URI that, when followed, leads to a resource
|
|
||||||
that redirects the user to an authenticated console session.
|
|
||||||
|
|
||||||
`get_console_url` (uri): a URI that, when followed, leads to a console URL
|
|
||||||
resource.
|
|
||||||
|
|
||||||
`credentials_url` (uri): a URI that, when followed, leads to a region list
|
|
||||||
resource.
|
|
||||||
|
|
||||||
`global_credential_url` (uri): a URI that, when followed, leads to a credential
|
|
||||||
resource which provides a credential usable by all non-opt-in regions. The
|
|
||||||
contents of this resource are a STS global credential which is not usable in
|
|
||||||
opt-in regions.
|
|
||||||
|
|
||||||
```
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"short_name": "primary-account",
|
|
||||||
"account_number": 123456789012,
|
|
||||||
"name": "Primary AWS Account",
|
|
||||||
"console_redirect_url": "https://broker/api/account/primary-account/console?redirect=1",
|
|
||||||
"get_console_url": "https://broker/api/account/primary-account/console",
|
|
||||||
"credentials_url": "https://broker/api/account/primary-account/credentials",
|
|
||||||
"global_credential_url": "https://broker/api/account/primary-account/credentials/global"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## Console URL Resource
|
|
||||||
|
|
||||||
**Note:** This resource is not used by the build scripts.
|
|
||||||
|
|
||||||
The console URL resource provides a URL to the AWS console. This resource is
|
|
||||||
designed for interactive use.
|
|
||||||
|
|
||||||
When provided the query parameter `redirect` with a value of `1` this resource
|
|
||||||
will not generate a body and will instead redirect to the URL that would have
|
|
||||||
been returned for `console_url`.
|
|
||||||
|
|
||||||
`console_url` (uri): a link to the AWS console with authentication credentials
|
|
||||||
embedded.
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
"console_url": "https://signin.aws.amazon.com/federation?..."
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Credential Resource
|
|
||||||
|
|
||||||
The credential resource provides a set of credentials that can be used to
|
|
||||||
configure AWS tools to access an account.
|
|
||||||
|
|
||||||
`access_key` (string): the AWS access key ID
|
|
||||||
|
|
||||||
`secret_key` (string): the AWS secret access key
|
|
||||||
|
|
||||||
`session_token` (string): the AWS session token
|
|
||||||
|
|
||||||
`expiration` (iso-formatted date): the date and time when the credential will
|
|
||||||
expire
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
"access_key": "ASIA123ABC456DEF567G",
|
|
||||||
"secret_key": "r7KcIuGdPwoUG2YOLISX2XDrVts55IFGTGaY5Tqa",
|
|
||||||
"session_token": "7C7FyvzyneaS/eRCVDcjHOSTTIHQyvhGqW...",
|
|
||||||
"expiration": "2020-01-01T00:00:00Z"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Region List Resource
|
|
||||||
|
|
||||||
The region list resource provides a list of regions associated with the account
|
|
||||||
both opted-in and not. For opted-in regions the resource includes a link to a
|
|
||||||
credential resource for that region.
|
|
||||||
|
|
||||||
`name` (string): AWS name for the region
|
|
||||||
|
|
||||||
`enabled` (boolean): indicates if the region is enabled and opted-in for this
|
|
||||||
account.
|
|
||||||
|
|
||||||
`credentials_url` (uri): a URI that, when followed, leads to a credential
|
|
||||||
resource containing a credential for access to that region. The credential
|
|
||||||
provided will be usable against the region-local STS endpoint for the specified
|
|
||||||
region. This also applies for classic regions, which typically use a global
|
|
||||||
endpoint and credential. The returned credential is scoped to the acquiring
|
|
||||||
region and may not be usable against the global endpoints or a different
|
|
||||||
regional endpoint.
|
|
||||||
|
|
||||||
```
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"name": "af-south-1",
|
|
||||||
"enabled": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "us-west-2",
|
|
||||||
"enabled": true,
|
|
||||||
"credentials_url": "https://broker/api/account/primary-account/credentials/us-west-2"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
191
alpine.pkr.hcl
Normal file
191
alpine.pkr.hcl
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
# Enable script debug output, set via 'packer build -var DEBUG=1'
|
||||||
|
variable "DEBUG" {
|
||||||
|
default = 0
|
||||||
|
}
|
||||||
|
variable "USE_BROKER" {
|
||||||
|
default = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Tuneable based on perfomance of whatever Packer's running on,
|
||||||
|
# override with './build --vars <pkrvars-file>'
|
||||||
|
variable "qemu" {
|
||||||
|
default = {
|
||||||
|
boot_wait = {
|
||||||
|
aarch64 = "1m"
|
||||||
|
x86_64 = "1m"
|
||||||
|
}
|
||||||
|
cmd_wait = "5s"
|
||||||
|
ssh_timeout = "1m"
|
||||||
|
memory = 1024 # MiB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
locals {
|
||||||
|
debug_arg = var.DEBUG == 0 ? "" : "--debug"
|
||||||
|
broker_arg = var.USE_BROKER == 0 ? "" : "--use-broker"
|
||||||
|
|
||||||
|
# randomly generated password
|
||||||
|
password = uuidv4()
|
||||||
|
|
||||||
|
# all build configs
|
||||||
|
all_configs = yamldecode(file("work/configs.yaml"))
|
||||||
|
|
||||||
|
# load the build actions to be taken
|
||||||
|
actions = yamldecode(file("work/actions.yaml"))
|
||||||
|
|
||||||
|
# resolve actionable build configs
|
||||||
|
configs = { for b, acfg in local.actions:
|
||||||
|
b => merge(local.all_configs[b], acfg) if length(acfg.actions) > 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
### Build Sources
|
||||||
|
|
||||||
|
# Don't build
|
||||||
|
source null alpine {
|
||||||
|
communicator = "none"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Common to all QEMU builds
|
||||||
|
source qemu alpine {
|
||||||
|
# qemu machine
|
||||||
|
headless = true
|
||||||
|
memory = var.qemu.memory
|
||||||
|
net_device = "virtio-net"
|
||||||
|
disk_interface = "virtio"
|
||||||
|
|
||||||
|
# build environment
|
||||||
|
boot_command = [
|
||||||
|
"root<enter>",
|
||||||
|
"setup-interfaces<enter><enter><enter><enter>",
|
||||||
|
"ifup eth0<enter><wait${var.qemu.cmd_wait}>",
|
||||||
|
"setup-sshd -c openssh<enter><wait${var.qemu.cmd_wait}>",
|
||||||
|
"echo PermitRootLogin yes >> /etc/ssh/sshd_config<enter>",
|
||||||
|
"service sshd restart<enter>",
|
||||||
|
"echo 'root:${local.password}' | chpasswd<enter>",
|
||||||
|
]
|
||||||
|
ssh_username = "root"
|
||||||
|
ssh_password = local.password
|
||||||
|
ssh_timeout = var.qemu.ssh_timeout
|
||||||
|
shutdown_command = "poweroff"
|
||||||
|
}
|
||||||
|
|
||||||
|
build {
|
||||||
|
name = "alpine"
|
||||||
|
|
||||||
|
## Builders
|
||||||
|
|
||||||
|
# QEMU builder
|
||||||
|
dynamic "source" {
|
||||||
|
for_each = { for b, c in local.configs:
|
||||||
|
b => c if contains(c.actions, "build") && c.builder == "qemu"
|
||||||
|
}
|
||||||
|
iterator = B
|
||||||
|
labels = ["qemu.alpine"] # links us to the base source
|
||||||
|
|
||||||
|
content {
|
||||||
|
name = B.key
|
||||||
|
|
||||||
|
# qemu machine
|
||||||
|
qemu_binary = "qemu-system-${B.value.arch}"
|
||||||
|
qemuargs = B.value.qemu.args
|
||||||
|
machine_type = B.value.qemu.machine_type
|
||||||
|
firmware = B.value.qemu.firmware
|
||||||
|
|
||||||
|
# build environment
|
||||||
|
iso_url = B.value.qemu.iso_url
|
||||||
|
iso_checksum = "file:${B.value.qemu.iso_url}.sha512"
|
||||||
|
boot_wait = var.qemu.boot_wait[B.value.arch]
|
||||||
|
|
||||||
|
# results
|
||||||
|
output_directory = B.value.image.dir
|
||||||
|
disk_size = B.value.image.size
|
||||||
|
format = B.value.image.format
|
||||||
|
vm_name = B.value.image.file
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Null builder (don't build, but we might import and/or publish)
|
||||||
|
dynamic "source" {
|
||||||
|
for_each = { for b, c in local.configs:
|
||||||
|
b => c if !contains(c.actions, "build")
|
||||||
|
}
|
||||||
|
iterator = B
|
||||||
|
labels = ["null.alpine"]
|
||||||
|
content {
|
||||||
|
name = B.key
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## build provisioners
|
||||||
|
|
||||||
|
# install setup files
|
||||||
|
dynamic "provisioner" {
|
||||||
|
for_each = { for b, c in local.configs:
|
||||||
|
b => c if contains(c.actions, "build")
|
||||||
|
}
|
||||||
|
iterator = B
|
||||||
|
labels = ["file"]
|
||||||
|
content {
|
||||||
|
only = [ "${B.value.builder}.${B.key}" ] # configs specific to one build
|
||||||
|
|
||||||
|
sources = [ for d in B.value.script_dirs: "work/scripts/${d}" ]
|
||||||
|
destination = "/tmp/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# run setup scripts
|
||||||
|
dynamic "provisioner" {
|
||||||
|
for_each = { for b, c in local.configs:
|
||||||
|
b => c if contains(c.actions, "build")
|
||||||
|
}
|
||||||
|
iterator = B
|
||||||
|
labels = ["shell"]
|
||||||
|
content {
|
||||||
|
only = [ "${B.value.builder}.${B.key}" ] # configs specific to one build
|
||||||
|
|
||||||
|
scripts = [ for s in B.value.scripts: "work/scripts/${s}" ]
|
||||||
|
use_env_var_file = true
|
||||||
|
environment_vars = [
|
||||||
|
"DEBUG=${var.DEBUG}",
|
||||||
|
"ARCH=${B.value.arch}",
|
||||||
|
"BOOTSTRAP=${B.value.bootstrap}",
|
||||||
|
"BUILD_NAME=${B.value.name}",
|
||||||
|
"BUILD_REVISION=${B.value.revision}",
|
||||||
|
"CLOUD=${B.value.cloud}",
|
||||||
|
"END_OF_LIFE=${B.value.end_of_life}",
|
||||||
|
"FIRMWARE=${B.value.firmware}",
|
||||||
|
"IMAGE_LOGIN=${B.value.image.login}",
|
||||||
|
"INITFS_FEATURES=${B.value.initfs_features}",
|
||||||
|
"KERNEL_MODULES=${B.value.kernel_modules}",
|
||||||
|
"KERNEL_OPTIONS=${B.value.kernel_options}",
|
||||||
|
"PACKAGES_ADD=${B.value.packages.add}",
|
||||||
|
"PACKAGES_DEL=${B.value.packages.del}",
|
||||||
|
"PACKAGES_NOSCRIPTS=${B.value.packages.noscripts}",
|
||||||
|
"RELEASE=${B.value.release}",
|
||||||
|
"REPOS=${B.value.repos}",
|
||||||
|
"SERVICES_ENABLE=${B.value.services.enable}",
|
||||||
|
"SERVICES_DISABLE=${B.value.services.disable}",
|
||||||
|
"VERSION=${B.value.version}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## build post-processor
|
||||||
|
|
||||||
|
# import and/or publish cloud images
|
||||||
|
dynamic "post-processor" {
|
||||||
|
for_each = { for b, c in local.configs:
|
||||||
|
b => c if contains(c.actions, "import") || contains(c.actions, "publish")
|
||||||
|
}
|
||||||
|
iterator = B
|
||||||
|
labels = ["shell-local"]
|
||||||
|
content {
|
||||||
|
only = [ "${B.value.builder}.${B.key}", "null.${B.key}" ]
|
||||||
|
inline = [ for action in ["import", "publish"]:
|
||||||
|
"./cloud_helper.py ${action} ${local.debug_arg} ${local.broker_arg} ${B.key}" if contains(B.value.actions, action)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
66
configs/alpine.conf
Normal file
66
configs/alpine.conf
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
# all build configs start with these
|
||||||
|
Default {
|
||||||
|
# image name/description components
|
||||||
|
name = [ alpine ]
|
||||||
|
description = [ "Alpine Linux {release}-r{revision}" ]
|
||||||
|
|
||||||
|
# initial provisioning script and data directory
|
||||||
|
scripts = [ setup ]
|
||||||
|
script_dirs = [ setup.d ]
|
||||||
|
|
||||||
|
# image settings
|
||||||
|
image.format = qcow2
|
||||||
|
image.size = 1G
|
||||||
|
image.login = alpine
|
||||||
|
}
|
||||||
|
|
||||||
|
# profile build matrix
|
||||||
|
Dimensions {
|
||||||
|
version {
|
||||||
|
"3.14" { include required("version/3.14.conf") }
|
||||||
|
"3.13" { include required("version/3.13.conf") }
|
||||||
|
"3.12" { include required("version/3.12.conf") }
|
||||||
|
"3.11" { include required("version/3.11.conf") }
|
||||||
|
edge { include required("version/edge.conf") }
|
||||||
|
}
|
||||||
|
arch {
|
||||||
|
x86_64 { include required("arch/x86_64.conf") }
|
||||||
|
aarch64 { include required("arch/aarch64.conf") }
|
||||||
|
}
|
||||||
|
firmware {
|
||||||
|
bios { include required("firmware/bios.conf") }
|
||||||
|
uefi { include required("firmware/uefi.conf") }
|
||||||
|
}
|
||||||
|
bootstrap {
|
||||||
|
tiny { include required("bootstrap/tiny.conf") }
|
||||||
|
# cloudinit { include required("bootstrap/cloudinit.conf") }
|
||||||
|
}
|
||||||
|
cloud {
|
||||||
|
aws { include required("cloud/aws.conf") }
|
||||||
|
# oci { include required("cloud/oci.conf") }
|
||||||
|
# gcp { include required("cloud/gcp.conf") }
|
||||||
|
# azure { include required("cloud/azure.conf") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# all build configs merge these at the very end
|
||||||
|
Mandatory {
|
||||||
|
description = [ - https://alpinelinux.org/cloud ]
|
||||||
|
|
||||||
|
# final provisioning script
|
||||||
|
scripts = [ cleanup ]
|
||||||
|
|
||||||
|
# override while developing/testing...
|
||||||
|
aws.publish {
|
||||||
|
access {
|
||||||
|
PUBLIC = false
|
||||||
|
}
|
||||||
|
regions {
|
||||||
|
ALL = false
|
||||||
|
us-west-2 = true # where i'm building
|
||||||
|
us-east-1 = true # test publishing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
configs/arch/aarch64.conf
Normal file
14
configs/arch/aarch64.conf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
name = [aarch64]
|
||||||
|
|
||||||
|
# aarch64 is UEFI only
|
||||||
|
EXCLUDE = [bios]
|
||||||
|
|
||||||
|
qemu.machine_type = virt
|
||||||
|
qemu.args = [
|
||||||
|
[-cpu, cortex-a57],
|
||||||
|
[-boot, d],
|
||||||
|
[-device, virtio-gpu-pci],
|
||||||
|
[-device, usb-ehci],
|
||||||
|
[-device, usb-kbd],
|
||||||
|
]
|
5
configs/arch/x86_64.conf
Normal file
5
configs/arch/x86_64.conf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
name = [x86_64]
|
||||||
|
|
||||||
|
qemu.machine_type = null
|
||||||
|
qemu.args = null
|
2
configs/bootstrap/cloudinit.conf
Normal file
2
configs/bootstrap/cloudinit.conf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
name = [cloudinit]
|
10
configs/bootstrap/tiny.conf
Normal file
10
configs/bootstrap/tiny.conf
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
name = [tiny]
|
||||||
|
WHEN {
|
||||||
|
aws {
|
||||||
|
packages.tiny-ec2-bootstrap = true
|
||||||
|
services.default.tiny-ec2-bootstrap = true
|
||||||
|
scripts = [ setup-tiny ]
|
||||||
|
script_dirs = [ setup-tiny.d ]
|
||||||
|
}
|
||||||
|
}
|
40
configs/cloud/aws.conf
Normal file
40
configs/cloud/aws.conf
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
builder = qemu
|
||||||
|
|
||||||
|
aws {
|
||||||
|
s3_bucket = alpine-cloud-images
|
||||||
|
publish {
|
||||||
|
access {
|
||||||
|
PUBLIC = true
|
||||||
|
# alternately...
|
||||||
|
#PUBLIC = false
|
||||||
|
# and/or
|
||||||
|
#<aws-userid> = true
|
||||||
|
# ...
|
||||||
|
}
|
||||||
|
regions {
|
||||||
|
ALL = true
|
||||||
|
# alternately...
|
||||||
|
#<region> = true
|
||||||
|
# ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WHEN {
|
||||||
|
# Arch
|
||||||
|
aarch64 {
|
||||||
|
aws.arch = arm64
|
||||||
|
}
|
||||||
|
x86_64 {
|
||||||
|
aws.arch = x86_64
|
||||||
|
}
|
||||||
|
|
||||||
|
# Firmware
|
||||||
|
bios {
|
||||||
|
aws.boot_mode = legacy-bios
|
||||||
|
}
|
||||||
|
uefi {
|
||||||
|
aws.boot_mode = uefi
|
||||||
|
}
|
||||||
|
}
|
2
configs/cloud/oci.conf
Normal file
2
configs/cloud/oci.conf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
builder = qemu
|
1
configs/configs.conf
Symbolic link
1
configs/configs.conf
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
alpine.conf
|
8
configs/firmware/bios.conf
Normal file
8
configs/firmware/bios.conf
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
name = [bios]
|
||||||
|
|
||||||
|
packages {
|
||||||
|
syslinux = --no-scripts
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu.firmware = null
|
15
configs/firmware/uefi.conf
Normal file
15
configs/firmware/uefi.conf
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
name = [uefi]
|
||||||
|
|
||||||
|
packages {
|
||||||
|
grub-efi = --no-scripts
|
||||||
|
}
|
||||||
|
|
||||||
|
WHEN {
|
||||||
|
aarch64 {
|
||||||
|
qemu.firmware = work/firmware/uefi-aarch64.bin
|
||||||
|
}
|
||||||
|
x86_64 {
|
||||||
|
qemu.firmware = work/firmware/uefi-x86_64.bin
|
||||||
|
}
|
||||||
|
}
|
8
configs/version/3.11.conf
Normal file
8
configs/version/3.11.conf
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
include required("base/1.conf")
|
||||||
|
|
||||||
|
end_of_life = "2021-11-01"
|
||||||
|
|
||||||
|
# Alpine 3.11 doesn't support aarch64
|
||||||
|
EXCLUDE = [ aarch64 ]
|
5
configs/version/3.12.conf
Normal file
5
configs/version/3.12.conf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
include required("base/1.conf")
|
||||||
|
|
||||||
|
end_of_life = "2022-05-01"
|
5
configs/version/3.13.conf
Normal file
5
configs/version/3.13.conf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
include required("base/2.conf")
|
||||||
|
|
||||||
|
end_of_life = "2022-11-01"
|
5
configs/version/3.14.conf
Normal file
5
configs/version/3.14.conf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
include required("base/2.conf")
|
||||||
|
|
||||||
|
end_of_life = "2023-05-01"
|
66
configs/version/base/1.conf
Normal file
66
configs/version/base/1.conf
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
repos {
|
||||||
|
"https://dl-cdn.alpinelinux.org/alpine/v{version}/main" = true
|
||||||
|
"https://dl-cdn.alpinelinux.org/alpine/v{version}/community" = true
|
||||||
|
"https://dl-cdn.alpinelinux.org/alpine/v{version}/testing" = false
|
||||||
|
}
|
||||||
|
|
||||||
|
packages {
|
||||||
|
alpine-base = true
|
||||||
|
linux-virt = true
|
||||||
|
alpine-mirrors = true
|
||||||
|
chrony = true
|
||||||
|
iproute2 = true
|
||||||
|
nvme-cli = true
|
||||||
|
openssh = true
|
||||||
|
sudo = true
|
||||||
|
tzdata = true
|
||||||
|
}
|
||||||
|
|
||||||
|
services {
|
||||||
|
sysinit {
|
||||||
|
devfs = true
|
||||||
|
dmesg = true
|
||||||
|
hwdrivers = true
|
||||||
|
mdev = true
|
||||||
|
}
|
||||||
|
boot {
|
||||||
|
acpid = true
|
||||||
|
bootmisc = true
|
||||||
|
hostname = true
|
||||||
|
hwclock = true
|
||||||
|
modules = true
|
||||||
|
swap = true
|
||||||
|
sysctl = true
|
||||||
|
syslog = true
|
||||||
|
}
|
||||||
|
default {
|
||||||
|
chronyd = true
|
||||||
|
networking = true
|
||||||
|
sshd = true
|
||||||
|
}
|
||||||
|
shutdown {
|
||||||
|
killprocs = true
|
||||||
|
mount-ro = true
|
||||||
|
savecache = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
kernel_modules {
|
||||||
|
sd-mod = true
|
||||||
|
usb-storage = true
|
||||||
|
ext4 = true
|
||||||
|
nvme = true
|
||||||
|
ena = true
|
||||||
|
}
|
||||||
|
|
||||||
|
kernel_options {
|
||||||
|
"console=ttyS0,115200n8" = true
|
||||||
|
"nvme_core.io_timeout=4294967295" = true
|
||||||
|
}
|
||||||
|
|
||||||
|
initfs_features {
|
||||||
|
nvme = true
|
||||||
|
ena = true
|
||||||
|
}
|
11
configs/version/base/2.conf
Normal file
11
configs/version/base/2.conf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
include required("1.conf")
|
||||||
|
|
||||||
|
packages {
|
||||||
|
# drop old alpine-mirrors
|
||||||
|
alpine-mirrors = null
|
||||||
|
# use iproute2-minimal instead of full iproute2
|
||||||
|
iproute2 = null
|
||||||
|
iproute2-minimal = true
|
||||||
|
}
|
9
configs/version/base/3.conf
Normal file
9
configs/version/base/3.conf
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
include required("2.conf")
|
||||||
|
|
||||||
|
packages {
|
||||||
|
# doas replaces sudo
|
||||||
|
sudo = null
|
||||||
|
doas = true
|
||||||
|
}
|
11
configs/version/edge.conf
Normal file
11
configs/version/edge.conf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# vim: ts=2 et:
|
||||||
|
|
||||||
|
include required("base/3.conf")
|
||||||
|
|
||||||
|
# clear out inherited repos
|
||||||
|
repos = null
|
||||||
|
repos {
|
||||||
|
"https://dl-cdn.alpinelinux.org/alpine/edge/main" = true
|
||||||
|
"https://dl-cdn.alpinelinux.org/alpine/edge/community" = true
|
||||||
|
"https://dl-cdn.alpinelinux.org/alpine/edge/testing" = true
|
||||||
|
}
|
114
packer.conf
114
packer.conf
@ -1,114 +0,0 @@
|
|||||||
# This Packer config file is in HOCON, and is converted to JSON at build time.
|
|
||||||
# https://github.com/lightbend/config/blob/master/HOCON.md
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
builders = [
|
|
||||||
{
|
|
||||||
type = "amazon-ebssurrogate"
|
|
||||||
profile = "{{user `aws_profile`}}"
|
|
||||||
|
|
||||||
### Builder Instance Details
|
|
||||||
|
|
||||||
region = "{{user `build_region`}}"
|
|
||||||
subnet_id = "{{user `build_subnet`}}"
|
|
||||||
instance_type = "{{user `build_instance_type`}}"
|
|
||||||
associate_public_ip_address = "{{user `build_public_ip`}}"
|
|
||||||
source_ami_filter {
|
|
||||||
# use the latest Amazon Linux AMI
|
|
||||||
owners = [ "{{user `build_ami_owner`}}" ]
|
|
||||||
most_recent = "{{user `build_ami_latest`}}"
|
|
||||||
filters {
|
|
||||||
virtualization-type = "hvm"
|
|
||||||
root-device-type = "ebs"
|
|
||||||
architecture = "{{user `build_arch`}}"
|
|
||||||
name = "{{user `build_ami_name`}}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
launch_block_device_mappings = [
|
|
||||||
{
|
|
||||||
volume_type = "gp2"
|
|
||||||
device_name = "/dev/xvdf"
|
|
||||||
encrypted = "{{user `ami_encrypt`}}"
|
|
||||||
delete_on_termination = "true"
|
|
||||||
volume_size = "{{user `ami_volume_size`}}"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
shutdown_behavior = "terminate"
|
|
||||||
ssh_username = "{{user `build_user`}}"
|
|
||||||
|
|
||||||
### AMI Build Details
|
|
||||||
|
|
||||||
ami_name = "{{user `ami_name`}}"
|
|
||||||
ami_description = "{{user `ami_desc`}}"
|
|
||||||
tags {
|
|
||||||
Name = "{{user `ami_name`}}"
|
|
||||||
profile = "{{user `profile`}}"
|
|
||||||
profile_build = "{{user `profile_build`}}"
|
|
||||||
version = "{{user `version`}}"
|
|
||||||
release = "{{user `release`}}"
|
|
||||||
arch = "{{user `arch`}}"
|
|
||||||
revision = "{{user `revision`}}"
|
|
||||||
end_of_life = "{{user `end_of_life`}}"
|
|
||||||
}
|
|
||||||
ami_virtualization_type = "hvm"
|
|
||||||
ami_architecture = "{{user `build_arch`}}" # need packer 1.4.1
|
|
||||||
ami_root_device {
|
|
||||||
volume_type = "gp2"
|
|
||||||
source_device_name = "/dev/xvdf"
|
|
||||||
device_name = "/dev/xvda"
|
|
||||||
delete_on_termination = "true"
|
|
||||||
volume_size = "{{user `ami_volume_size`}}"
|
|
||||||
}
|
|
||||||
ena_support = "true"
|
|
||||||
sriov_support = "true"
|
|
||||||
ami_users = "{{user `aws_users`}}"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
provisioners = [
|
|
||||||
{
|
|
||||||
type = "file"
|
|
||||||
source = "./profile/{{user `profile`}}/{{user `profile_build`}}/setup-ami.d"
|
|
||||||
destination = "/tmp/setup-ami.d"
|
|
||||||
}
|
|
||||||
{
|
|
||||||
type = "shell"
|
|
||||||
script = "../scripts/setup-ami"
|
|
||||||
environment_vars = [
|
|
||||||
"VERSION={{user `version`}}"
|
|
||||||
"RELEASE={{user `release`}}"
|
|
||||||
"REVISION={{user `revision`}}"
|
|
||||||
"ARCH={{user `arch`}}"
|
|
||||||
"BOOTLOADER={{user `bootloader`}}"
|
|
||||||
"REPOS={{user `repos`}}"
|
|
||||||
"PKGS={{user `pkgs`}}"
|
|
||||||
"SVCS={{user `svcs`}}"
|
|
||||||
"KERNEL_MODS={{user `kernel_modules`}}"
|
|
||||||
"KERNEL_OPTS={{user `kernel_options`}}"
|
|
||||||
"INITFS_FEATURES={{user `initfs_features`}}"
|
|
||||||
"EC2_USER={{user `ami_user`}}"
|
|
||||||
]
|
|
||||||
use_env_var_file = "true"
|
|
||||||
execute_command = "sudo sh -c '. {{.EnvVarFile}} && {{.Path}}'"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
post-processors = [
|
|
||||||
{
|
|
||||||
type = "manifest"
|
|
||||||
output = "profile/{{user `profile`}}/{{user `profile_build`}}/manifest.json"
|
|
||||||
custom_data {
|
|
||||||
ami_name = "{{user `ami_name`}}"
|
|
||||||
ami_desc = "{{user `ami_desc`}}"
|
|
||||||
profile = "{{user `profile`}}"
|
|
||||||
profile_build = "{{user `profile_build`}}"
|
|
||||||
version = "{{user `version`}}"
|
|
||||||
release = "{{user `release`}}"
|
|
||||||
arch = "{{user `arch`}}"
|
|
||||||
revision = "{{user `revision`}}"
|
|
||||||
end_of_life = "{{user `end_of_life`}}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
@ -1,174 +0,0 @@
|
|||||||
# Profiles
|
|
||||||
|
|
||||||
Profiles are collections of related build definitions, which are used to
|
|
||||||
generate the `vars.json` files that [Packer](https://packer.io) consumes
|
|
||||||
when building AMIs.
|
|
||||||
|
|
||||||
Profiles use [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md)
|
|
||||||
(Human-Optimized Config Object Notation) which allows importing common configs
|
|
||||||
from other files, simple variable interpolation, and easy merging of objects.
|
|
||||||
This flexibility helps keep configuration for related build targets
|
|
||||||
[DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself).
|
|
||||||
|
|
||||||
## Core Profiles
|
|
||||||
|
|
||||||
Core profile configurations are found in the `base`, `version`, and `arch`
|
|
||||||
subdirectories. Core profiles do not have a `.conf` suffix because they're not
|
|
||||||
meant to be directly used like target profiles with the `builder.py` script.
|
|
||||||
|
|
||||||
Base core profiles define all build vars with default values -- those left
|
|
||||||
empty or null are usually set in version, arch, or target profile configs.
|
|
||||||
Base profiles are included in version profiles, and do not need to be included
|
|
||||||
in target profiles.
|
|
||||||
|
|
||||||
Version core profiles expand on the base profile they include, and set the
|
|
||||||
`version`, `release`, `end_of_life` (if known), and the associated Alpine Linux
|
|
||||||
`repos`.
|
|
||||||
|
|
||||||
Arch core profiles further define architecture-specific variables, such as
|
|
||||||
which `apk-tools` and `alpine-keys` to use (and their SHA256 checksums).
|
|
||||||
|
|
||||||
## Target Profiles
|
|
||||||
|
|
||||||
Target profiles, defined in this directory, are the top-level configuration
|
|
||||||
used with `./scripts/builder.py`; they must have a `.conf` suffix. Several
|
|
||||||
configuration objects are defined and later merged within the `BUILDS` object,
|
|
||||||
ultimately defining each individual build.
|
|
||||||
|
|
||||||
Simple profiles have an object that loads a "version" core profile and
|
|
||||||
another that loads an "arch" core profile. A more complicated version-arch
|
|
||||||
matrix profile would have an object for each version and arch.
|
|
||||||
|
|
||||||
Additionally, there are one or more objects that define profile-specific
|
|
||||||
settings.
|
|
||||||
|
|
||||||
The `BUILDS` object's elements merge core and profile configs (with optional
|
|
||||||
inline build settings) into named build definitions; these build names can be
|
|
||||||
used to specify a subset of a profile's builds, for example:
|
|
||||||
`./scripts/builder.py amis <profile> <build1> <build2> ...`
|
|
||||||
|
|
||||||
**Please note that merge order matters!** The merge sequence is version -->
|
|
||||||
architecture --> profile --> build.
|
|
||||||
|
|
||||||
## Customization
|
|
||||||
|
|
||||||
If the AWS configuration you're using does not specify a default region, your
|
|
||||||
custom profile will need to specify `build_region`. If the build region does
|
|
||||||
not have a default VPC, you'll need to specify `build_subnet`.
|
|
||||||
|
|
||||||
`version` and `release` are meant to match Alpine; however, `revision` is used
|
|
||||||
used to track changes to the profile, additions of new
|
|
||||||
[alpine-ec2-ami](https://github.com/mcrute/alpine-ec2-ami) features,
|
|
||||||
or other situations where the AMIs needs to be rebuilt. The "edge" core
|
|
||||||
version profile sets `revision` to null, which translates into the current
|
|
||||||
datetime. Otherwise, the default set in the base profile is `r0`.
|
|
||||||
|
|
||||||
You will probably want to personalize the name and description of your AMI.
|
|
||||||
Set `ami_name_prefix` and `ami_name_suffix`; setting `ami_desc_suffix` and
|
|
||||||
`ami_desc_suffix` is optional.
|
|
||||||
|
|
||||||
Set `build_instance_type` if you want/need to use a different instance type to
|
|
||||||
build the image; the default is `t3.nano`.
|
|
||||||
|
|
||||||
If 1 GiB is not enough to install the packages in your base AMI, you can set
|
|
||||||
the `ami_volume_size` to the number of GiB you need. Note, however, that the
|
|
||||||
[tiny-ec2-bootstrap](https://github.com/mcrute/tiny-ec2-bootstrap) init script
|
|
||||||
will expand the root partition to use the instance's entire EBS root volume
|
|
||||||
during the first boot, so you shouldn't need to make space for anything other
|
|
||||||
than installed packages.
|
|
||||||
|
|
||||||
Set `ami_encrypt` to "true" to create an encrypted AMI image. Launching images
|
|
||||||
from an encrypted AMI results in an encrypted EBS root volume. Please note
|
|
||||||
that if your AMI is encrypted, only the owning account will be able to use it.
|
|
||||||
|
|
||||||
_*NOTE*: The following funcitonality that is currently not operational -- it
|
|
||||||
is pending completion and integration of a new release tool. In the meantime,
|
|
||||||
you will have to manually copy AMIs from the build region to other regions._
|
|
||||||
|
|
||||||
To copy newly built AMIs to regions other than the `build_region` region, set
|
|
||||||
`ami_regions`. This variable is a *hash*, which allows for finer control over
|
|
||||||
inherited values when merging configs. Region identifiers are the keys, a
|
|
||||||
value of `true` means the AMI should be copied to that region; `null` or
|
|
||||||
`false` indicate that it shouldn't be copied to that region. If you want to
|
|
||||||
ensure that the `ami_regions` hash does not inherit any values, set it to
|
|
||||||
`null` before configuring your regions. For example:
|
|
||||||
```
|
|
||||||
ami_regions = null # don't inherit any previous values
|
|
||||||
ami_regions {
|
|
||||||
us-west-2 = true
|
|
||||||
eu-north-1 = true
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
By default, the AMIs built are accessible only by the owning account. To
|
|
||||||
make your AMIs publicly available, set the `ami_access` hash variable:
|
|
||||||
```
|
|
||||||
ami_access {
|
|
||||||
all = true
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Controlling what packages are installed and enabled in the AMI is the number
|
|
||||||
one reason for creating custom profile. The `repos`, `pkgs`, and `svcs` hash
|
|
||||||
variables serve precisely that purpose. With some exceptions (noted below),
|
|
||||||
they work the same as the `ami_regions` hash: `true` values enable, `false`
|
|
||||||
and `null` values disable, and inherited values can be cleared by first setting
|
|
||||||
the variable itself to `null`.
|
|
||||||
|
|
||||||
With `repos`, the keys are double-quoted URLs to the `apk` repos that you want
|
|
||||||
set up; these are initially set in the "version" core profiles. In addition
|
|
||||||
to the `true`, `false`, and `null` values, you can also use a "repo alias"
|
|
||||||
string value, allowing you to pin packages to be sourced from that particular
|
|
||||||
repo. For example, with a profile based from a non-edge core profile, you may
|
|
||||||
want to be able to pull packages from the edge testing repo:
|
|
||||||
```
|
|
||||||
repos {
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/edge/testing" = "edge-testing"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The `pkgs` hash's default is set in the base core profile; its keys are
|
|
||||||
simply the Alpine package to install (or not install, if the value is `false`
|
|
||||||
or `null`). A `true` value installs the package from the default repos; if the
|
|
||||||
value is a repo alias string, the package will be pinned to explicitly install
|
|
||||||
from that repo. For example:
|
|
||||||
```
|
|
||||||
pkgs {
|
|
||||||
# install docker-compose from edge-testing repo
|
|
||||||
docker-compose = "edge-testing"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
To control when (or whether) a system service starts, use the `svcs` hash
|
|
||||||
variable. Its first-level keys are names of runlevels (`sysinit`, `boot`,
|
|
||||||
`default`, and `shutown`), and the second-level keys are the services, as they
|
|
||||||
appear in `/etc/init.d`. Like the other profile hash variables, setting
|
|
||||||
`false` or `null` disable the service in the runlevel, `true` will enable the
|
|
||||||
service.
|
|
||||||
|
|
||||||
Further customization can be done by specifying your own setup script with the
|
|
||||||
`setup_script` profile variable. This will be copied to the build instance at
|
|
||||||
`/tmp/setup-ami.d/setup_script`, and executed by the `setup-ami` script just
|
|
||||||
before the final cleanup phase.
|
|
||||||
|
|
||||||
If there are additional data or scripts that your setup script uses, use the
|
|
||||||
`setup_copy` hash variable -- the key is the destination path under the build
|
|
||||||
instance's `/tmp/setup-ami.d` directory, and the value is the local path to
|
|
||||||
the source file or directory. No data is automatically installed in the AMI,
|
|
||||||
and no additional scripts are executed -- you must explicitly install/execute
|
|
||||||
via the `setup_script` script.
|
|
||||||
|
|
||||||
The AMI's default login user is `alpine`. If you want to specify a alternate
|
|
||||||
login, set it with the `ami_user` profile variable. This setting is saved in
|
|
||||||
`/etc/conf.d/tiny-ec2-bootstrap` as `EC2_USER` and
|
|
||||||
[tiny-ec2-bootstrap](https://github.com/mcrute/tiny-ec2-bootstrap)
|
|
||||||
will use that valie instead of `alpine`.
|
|
||||||
|
|
||||||
## Limitations and Caveats
|
|
||||||
|
|
||||||
* Hash variables that are reset to clear inherited values *must* be
|
|
||||||
re-defined as a hash, even if it is to remain empty:
|
|
||||||
```
|
|
||||||
hash_var = null # drops inherited values
|
|
||||||
hash_var {} # re-defines as an empty hash
|
|
||||||
```
|
|
@ -1,33 +0,0 @@
|
|||||||
### Profile for Building the Publically-Available Alpine Linux AMIs
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
version-3_14 { include required("version/3.14") }
|
|
||||||
version-3_13 { include required("version/3.13") }
|
|
||||||
version-3_12 { include required("version/3.12") }
|
|
||||||
version-3_11 { include required("version/3.11") }
|
|
||||||
version-edge { include required("version/edge") }
|
|
||||||
arch-x86_64 { include required("arch/x86_64") }
|
|
||||||
arch-aarch64 { include required("arch/aarch64") }
|
|
||||||
|
|
||||||
# profile vars
|
|
||||||
community {
|
|
||||||
ami_desc_suffix = " - https://github.com/mcrute/alpine-ec2-ami"
|
|
||||||
}
|
|
||||||
official {
|
|
||||||
ami_desc_suffix = " - https://alpinelinux.org/cloud"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Build definitions
|
|
||||||
BUILDS {
|
|
||||||
# merge version, arch, profile; add per-build { revision = "r1" } if needed
|
|
||||||
edge-x86_64 = ${version-edge} ${arch-x86_64} ${official}
|
|
||||||
v3_14-x86_64 = ${version-3_14} ${arch-x86_64} ${official}
|
|
||||||
v3_13-x86_64 = ${version-3_13} ${arch-x86_64} ${official}
|
|
||||||
v3_12-x86_64 = ${version-3_12} ${arch-x86_64} ${community}
|
|
||||||
v3_11-x86_64 = ${version-3_11} ${arch-x86_64} ${community}
|
|
||||||
|
|
||||||
edge-aarch64 = ${version-edge} ${arch-aarch64} ${official}
|
|
||||||
v3_14-aarch64 = ${version-3_14} ${arch-aarch64} ${official}
|
|
||||||
v3_13-aarch64 = ${version-3_13} ${arch-aarch64} ${official} { revision = "r1" }
|
|
||||||
v3_12-aarch64 = ${version-3_12} ${arch-aarch64} ${community} { revision = "r1" }
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
aarch64-1
|
|
@ -1,7 +0,0 @@
|
|||||||
### aarch64 vars, revision 1
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
arch = "aarch64"
|
|
||||||
bootloader = "grub-efi"
|
|
||||||
build_arch = "arm64"
|
|
||||||
build_instance_type = "t4g.nano"
|
|
@ -1 +0,0 @@
|
|||||||
x86_64-1
|
|
@ -1,7 +0,0 @@
|
|||||||
### x86_64 vars, revision 1
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
arch = "x86_64"
|
|
||||||
bootloader = "syslinux"
|
|
||||||
build_arch = "x86_64"
|
|
||||||
build_instance_type = "t3a.nano"
|
|
103
profiles/base/1
103
profiles/base/1
@ -1,103 +0,0 @@
|
|||||||
### base vars, revision 1
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# Profile/Build
|
|
||||||
profile = null
|
|
||||||
profile_build = null
|
|
||||||
revision = "r0"
|
|
||||||
|
|
||||||
# Versioning
|
|
||||||
version = null
|
|
||||||
release = null # defaults to autodetect
|
|
||||||
end_of_life = null
|
|
||||||
|
|
||||||
# Architecture
|
|
||||||
arch = null
|
|
||||||
build_arch = null
|
|
||||||
build_instance_type = null
|
|
||||||
|
|
||||||
# Builder-instance
|
|
||||||
build_region = "us-west-2"
|
|
||||||
build_subnet = null
|
|
||||||
build_public_ip = null
|
|
||||||
build_user = "ec2-user"
|
|
||||||
build_ami_name = "amzn2-ami-hvm-2.0.*-gp2"
|
|
||||||
build_ami_owner = "137112412989"
|
|
||||||
build_ami_latest = "true"
|
|
||||||
|
|
||||||
# AMI build/deploy
|
|
||||||
aws_profile = null # AWS profile to build AMI
|
|
||||||
aws_accounts = null # comma-separated AWS accounts allowed to launch AMI
|
|
||||||
ami_name_prefix = "alpine-ami-"
|
|
||||||
ami_name_suffix = ""
|
|
||||||
ami_desc_prefix = "Alpine Linux "
|
|
||||||
ami_desc_suffix = ""
|
|
||||||
ami_volume_size = "1"
|
|
||||||
ami_encrypt = "false"
|
|
||||||
ami_user = "alpine"
|
|
||||||
|
|
||||||
# NOTE: the following are python format strings, resolved in builder.py
|
|
||||||
ami_name = "{var.ami_name_prefix}{var.release}-{var.arch}-{var.revision}{var.ami_name_suffix}"
|
|
||||||
ami_desc = "{var.ami_desc_prefix}{var.release} {var.arch} {var.revision}{var.ami_desc_suffix}"
|
|
||||||
|
|
||||||
# AMI configuration
|
|
||||||
bootloader = null
|
|
||||||
repos {}
|
|
||||||
pkgs {
|
|
||||||
linux-virt = true
|
|
||||||
alpine-mirrors = true
|
|
||||||
chrony = true
|
|
||||||
iproute2 = true
|
|
||||||
nvme-cli = true
|
|
||||||
openssh = true
|
|
||||||
sudo = true
|
|
||||||
tiny-ec2-bootstrap = true
|
|
||||||
tzdata = true
|
|
||||||
}
|
|
||||||
svcs {
|
|
||||||
sysinit {
|
|
||||||
devfs = true
|
|
||||||
dmesg = true
|
|
||||||
hwdrivers = true
|
|
||||||
mdev = true
|
|
||||||
}
|
|
||||||
boot {
|
|
||||||
acpid = true
|
|
||||||
bootmisc = true
|
|
||||||
hostname = true
|
|
||||||
hwclock = true
|
|
||||||
modules = true
|
|
||||||
swap = true
|
|
||||||
sysctl = true
|
|
||||||
syslog = true
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
chronyd = true
|
|
||||||
eth-eni-setup = true
|
|
||||||
networking = true
|
|
||||||
sshd = true
|
|
||||||
tiny-ec2-bootstrap = true
|
|
||||||
}
|
|
||||||
shutdown {
|
|
||||||
killprocs = true
|
|
||||||
mount-ro = true
|
|
||||||
savecache = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
kernel_modules {
|
|
||||||
sd-mod = true
|
|
||||||
usb-storage = true
|
|
||||||
ext4 = true
|
|
||||||
nvme = true
|
|
||||||
ena = true
|
|
||||||
}
|
|
||||||
kernel_options {
|
|
||||||
"console=ttyS0,115200n8" = true
|
|
||||||
"nvme_core.io_timeout=4294967295" = true
|
|
||||||
}
|
|
||||||
# NOTE: nvme and ena are critical for i3, a1, m6g, and anything in the 5 series
|
|
||||||
# forward. Without them these instances will not boot.
|
|
||||||
initfs_features {
|
|
||||||
nvme = true
|
|
||||||
ena = true
|
|
||||||
}
|
|
111
profiles/base/2
111
profiles/base/2
@ -1,111 +0,0 @@
|
|||||||
### base vars, revision 2
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# Profile/Build
|
|
||||||
profile = null
|
|
||||||
profile_build = null
|
|
||||||
revision = "r0"
|
|
||||||
|
|
||||||
# Versioning
|
|
||||||
version = null
|
|
||||||
release = null # defaults to autodetect
|
|
||||||
end_of_life = null
|
|
||||||
|
|
||||||
# Architecture
|
|
||||||
arch = null
|
|
||||||
build_arch = null
|
|
||||||
build_instance_type = null
|
|
||||||
|
|
||||||
# Builder-instance
|
|
||||||
build_region = "us-west-2"
|
|
||||||
build_subnet = null
|
|
||||||
build_public_ip = null
|
|
||||||
build_user = "ec2-user"
|
|
||||||
build_ami_name = "amzn2-ami-hvm-2.0.*-gp2"
|
|
||||||
build_ami_owner = "137112412989"
|
|
||||||
build_ami_latest = "true"
|
|
||||||
|
|
||||||
# AMI build/deploy
|
|
||||||
aws_profile = null # AWS profile to build AMI
|
|
||||||
aws_accounts = null # comma-separated AWS accounts allowed to launch AMI
|
|
||||||
ami_name_prefix = "alpine-ami-"
|
|
||||||
ami_name_suffix = ""
|
|
||||||
ami_desc_prefix = "Alpine Linux "
|
|
||||||
ami_desc_suffix = ""
|
|
||||||
ami_volume_size = "1"
|
|
||||||
ami_encrypt = "false"
|
|
||||||
ami_user = "alpine"
|
|
||||||
|
|
||||||
# NOTE: the following are python format strings, resolved in builder.py
|
|
||||||
ami_name = "{var.ami_name_prefix}{var.release}-{var.arch}-{var.revision}{var.ami_name_suffix}"
|
|
||||||
ami_desc = "{var.ami_desc_prefix}{var.release} {var.arch} {var.revision}{var.ami_desc_suffix}"
|
|
||||||
|
|
||||||
# AMI configuration
|
|
||||||
bootloader = null
|
|
||||||
repos {}
|
|
||||||
pkgs {
|
|
||||||
linux-virt = true
|
|
||||||
chrony = true
|
|
||||||
iproute2-minimal = true
|
|
||||||
nvme-cli = true
|
|
||||||
openssh = true
|
|
||||||
sudo = true
|
|
||||||
tiny-ec2-bootstrap = true
|
|
||||||
tzdata = true
|
|
||||||
}
|
|
||||||
svcs {
|
|
||||||
sysinit {
|
|
||||||
devfs = true
|
|
||||||
dmesg = true
|
|
||||||
hwdrivers = true
|
|
||||||
mdev = true
|
|
||||||
}
|
|
||||||
boot {
|
|
||||||
acpid = true
|
|
||||||
bootmisc = true
|
|
||||||
hostname = true
|
|
||||||
hwclock = true
|
|
||||||
modules = true
|
|
||||||
swap = true
|
|
||||||
sysctl = true
|
|
||||||
syslog = true
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
chronyd = true
|
|
||||||
eth-eni-setup = true
|
|
||||||
networking = true
|
|
||||||
sshd = true
|
|
||||||
tiny-ec2-bootstrap = true
|
|
||||||
}
|
|
||||||
shutdown {
|
|
||||||
killprocs = true
|
|
||||||
mount-ro = true
|
|
||||||
savecache = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
kernel_modules {
|
|
||||||
sd-mod = true
|
|
||||||
usb-storage = true
|
|
||||||
ext4 = true
|
|
||||||
nvme = true
|
|
||||||
ena = true
|
|
||||||
}
|
|
||||||
kernel_options {
|
|
||||||
"console=ttyS0,115200n8" = true
|
|
||||||
"nvme_core.io_timeout=4294967295" = true
|
|
||||||
}
|
|
||||||
# NOTE: nvme and ena are critical for i3, a1, m6g, and anything in the 5
|
|
||||||
# series forward. Without them these instances will not boot.
|
|
||||||
initfs_features {
|
|
||||||
nvme = true
|
|
||||||
ena = true
|
|
||||||
}
|
|
||||||
|
|
||||||
# Local path to additional setup script, runs before setup-ami cleanup.
|
|
||||||
setup_script = null
|
|
||||||
|
|
||||||
# Files/directories to copy to /tmp/setup-ami.d/ on build instance for
|
|
||||||
# setup-script to use. Map key is the copy target in the build instance
|
|
||||||
# /tmp/setup-ami.d/ directory, map value is local file/directory path.
|
|
||||||
# Nothing copied ends up in the AMI unless `setup_script` does it.
|
|
||||||
setup_copy = null
|
|
@ -1 +0,0 @@
|
|||||||
2
|
|
@ -1,38 +0,0 @@
|
|||||||
### Profile for Testing Builds
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
version-3_13 { include required("version/3.13") }
|
|
||||||
version-3_12 { include required("version/3.12") }
|
|
||||||
version-3_11 { include required("version/3.11") }
|
|
||||||
version-3_10 { include required("version/3.10") }
|
|
||||||
version-edge { include required("version/edge") }
|
|
||||||
|
|
||||||
arch-x86_64 { include required("arch/x86_64") }
|
|
||||||
arch-aarch64 { include required("arch/aarch64") }
|
|
||||||
|
|
||||||
# specific to this profile's builds
|
|
||||||
test {
|
|
||||||
#bootloader = "EFI_STUB" # currently does not work
|
|
||||||
ami_name_prefix = "test-"
|
|
||||||
ami_desc_prefix = "Alpine Test "
|
|
||||||
ami_user = "test"
|
|
||||||
setup_script = scripts/test-setup_script.sh
|
|
||||||
setup_copy {
|
|
||||||
base = profiles/base
|
|
||||||
aarch64 = profiles/arch/aarch64
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Build definitions
|
|
||||||
BUILDS {
|
|
||||||
# merge version, arch, profile, and build vars
|
|
||||||
v3_13-x86_64 = ${version-3_13} ${arch-x86_64} ${test}
|
|
||||||
v3_12-x86_64 = ${version-3_12} ${arch-x86_64} ${test}
|
|
||||||
v3_11-x86_64 = ${version-3_11} ${arch-x86_64} ${test} { revision = "r1" }
|
|
||||||
v3_10-x86_64 = ${version-3_10} ${arch-x86_64} ${test} { revision = "r2" }
|
|
||||||
edge-x86_64 = ${version-edge} ${arch-x86_64} ${test}
|
|
||||||
|
|
||||||
v3_13-aarch64 = ${version-3_13} ${arch-aarch64} ${test}
|
|
||||||
v3_12-aarch64 = ${version-3_12} ${arch-aarch64} ${test}
|
|
||||||
edge-aarch64 = ${version-edge} ${arch-aarch64} ${test}
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
### version 3.10 vars
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# start with base vars
|
|
||||||
include required("../base/1")
|
|
||||||
|
|
||||||
# set version-specific vars
|
|
||||||
version = "3.10"
|
|
||||||
end_of_life = "2021-05-01"
|
|
||||||
repos {
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.10/main" = true
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.10/community" = true
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
### version 3.11 vars
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# start with base vars
|
|
||||||
include required("../base/1")
|
|
||||||
|
|
||||||
# set version-specific vars
|
|
||||||
version = "3.11"
|
|
||||||
end_of_life = "2021-11-01"
|
|
||||||
repos {
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.11/main" = true
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.11/community" = true
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
### version 3.12 vars
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# start with base vars
|
|
||||||
include required("../base/1")
|
|
||||||
|
|
||||||
# set version-specific vars
|
|
||||||
version = "3.12"
|
|
||||||
end_of_life = "2022-05-01"
|
|
||||||
repos {
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.12/main" = true
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.12/community" = true
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
### version 3.13 vars
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# based on current
|
|
||||||
include required("../base/current")
|
|
||||||
|
|
||||||
# set version-specific vars
|
|
||||||
version = "3.13"
|
|
||||||
end_of_life = "2022-11-01"
|
|
||||||
repos {
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.13/main" = true
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.13/community" = true
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
### version 3.14 vars
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# based on current
|
|
||||||
include required("../base/current")
|
|
||||||
|
|
||||||
# set version-specific vars
|
|
||||||
version = "3.14"
|
|
||||||
end_of_life = "2023-05-01"
|
|
||||||
repos {
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.14/main" = true
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.14/community" = true
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
### version 3.9 vars
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# start with base vars
|
|
||||||
include required("../base/1")
|
|
||||||
|
|
||||||
# set version-specific vars
|
|
||||||
version = "3.9"
|
|
||||||
end_of_life = "2021-01-01"
|
|
||||||
repos {
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.9/main" = true
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/v3.9/community" = true
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
3.13
|
|
@ -1,16 +0,0 @@
|
|||||||
### edge vars
|
|
||||||
# vim: ts=2 et:
|
|
||||||
|
|
||||||
# based on current
|
|
||||||
include required("../base/current")
|
|
||||||
|
|
||||||
# add edge-specific tweaks...
|
|
||||||
version = "edge"
|
|
||||||
end_of_life = null # defaults to tomorrow
|
|
||||||
revision = null # defaults to datetime
|
|
||||||
|
|
||||||
repos {
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/edge/main" = true
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/edge/community" = true
|
|
||||||
"http://dl-cdn.alpinelinux.org/alpine/edge/testing" = true
|
|
||||||
}
|
|
@ -1,184 +0,0 @@
|
|||||||
# Alpine Linux EC2 AMIs
|
|
||||||
|
|
||||||
These are the official Alpine AWS AMIs. For an index of images see the
|
|
||||||
[Alpine Website](https://alpinelinux.org/cloud/).
|
|
||||||
|
|
||||||
These AMIs should work with most EC2 features -- such as ENIs (Elastic Network
|
|
||||||
Interfaces) and NVMe EBS (Elastic Block Storage) volumes. If you find any
|
|
||||||
problems launching these AMIs on current generation instances, please open an
|
|
||||||
[issue](https://github.com/mcrute/alpine-ec2-ami/issues) and include as much
|
|
||||||
detailed information as possible.
|
|
||||||
|
|
||||||
All AMIs built after 2020-09-15 include support for hot-pluggable ENIs, and will
|
|
||||||
sync all associated IPv6 and secondary IPv4 addresses during `udhcpc` post-bound
|
|
||||||
and post-renew events.
|
|
||||||
|
|
||||||
Starting with Alpine release 3.12.1, IMDSv2 (Instance MetaData Service v2) is
|
|
||||||
fully supported, and `aarch64` AMIs are provided for EC2 ARM-based instances.
|
|
||||||
|
|
||||||
During the *first boot* of instances created with these AMIs, the lightweight
|
|
||||||
[tiny-ec2-bootstrap](https://github.com/mcrute/tiny-ec2-bootstrap) init
|
|
||||||
script...
|
|
||||||
- sets the instance's hostname,
|
|
||||||
- installs the SSH authorized_keys for the AMI user (default 'alpine'),
|
|
||||||
- disables 'root' and AMI user (default 'alpine') passwords,
|
|
||||||
- expands the root partition to use all available EBS volume space,
|
|
||||||
- and executes a "user data" script (must be a shell script that starts with `#!`)
|
|
||||||
|
|
||||||
If you launch these AMIs to build other images (via [Packer](https://packer.io),
|
|
||||||
etc.), don't forget to remove `/var/lib/cloud/.bootstrap-complete` -- otherwise
|
|
||||||
instances launched from those second-generation AMIs will not run
|
|
||||||
`tiny-ec2-bootstrap` on their first boot.
|
|
||||||
|
|
||||||
The more popular [cloud-init](https://cloudinit.readthedocs.io/en/latest/) is
|
|
||||||
currently not supported on Alpine Linux. If `cloud-init` support is important
|
|
||||||
to you, please open an [issue](https://github.com/mcrute/alpine-ec2-ami/issues).
|
|
||||||
|
|
||||||
***These AMIs are also available by visiting https://alpinelinux.org/cloud***
|
|
||||||
|
|
||||||
## AMIs
|
|
||||||
|
|
||||||
### Alpine Linux 3.14.1 (2021-08-07)
|
|
||||||
<details><summary><i>click to show/hide</i></summary><p>
|
|
||||||
|
|
||||||
| Region | alpine-ami-3.14.1-aarch64-r0 | alpine-ami-3.14.1-x86_64-r0 |
|
|
||||||
| ------ | --- | --- |
|
|
||||||
| af-south-1 | [ami-0bcf48f55b9949a84](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0bcf48f55b9949a84) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0bcf48f55b9949a84)) | [ami-08aea7443b5d08f79](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08aea7443b5d08f79) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-08aea7443b5d08f79)) |
|
|
||||||
| ap-east-1 | [ami-092aa3a38d204b2b5](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-092aa3a38d204b2b5) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-092aa3a38d204b2b5)) | [ami-0d4ba085b9c1557b8](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d4ba085b9c1557b8) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d4ba085b9c1557b8)) |
|
|
||||||
| ap-northeast-1 | [ami-0b559d40e76da2119](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b559d40e76da2119) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0b559d40e76da2119)) | [ami-033c6bceffad8df75](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-033c6bceffad8df75) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-033c6bceffad8df75)) |
|
|
||||||
| ap-northeast-2 | [ami-07667213840caca26](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07667213840caca26) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-07667213840caca26)) | [ami-0d7a7fdf22367713c](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d7a7fdf22367713c) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0d7a7fdf22367713c)) |
|
|
||||||
| ap-northeast-3 | [ami-0956b7bafd7a6720d](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0956b7bafd7a6720d) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0956b7bafd7a6720d)) | [ami-08b52d5efd9abef56](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08b52d5efd9abef56) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-08b52d5efd9abef56)) |
|
|
||||||
| ap-south-1 | [ami-07ed5174d6da65d84](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07ed5174d6da65d84) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-07ed5174d6da65d84)) | [ami-012f6469429d4ad42](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-012f6469429d4ad42) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-012f6469429d4ad42)) |
|
|
||||||
| ap-southeast-1 | [ami-0aa966cf6ca931b11](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0aa966cf6ca931b11) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0aa966cf6ca931b11)) | [ami-01a542451033fd940](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01a542451033fd940) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-01a542451033fd940)) |
|
|
||||||
| ap-southeast-2 | [ami-069d767cedbd4d7a5](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-069d767cedbd4d7a5) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-069d767cedbd4d7a5)) | [ami-014e86c5062e164af](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-014e86c5062e164af) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-014e86c5062e164af)) |
|
|
||||||
| ca-central-1 | [ami-08bc6f39436e47c30](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08bc6f39436e47c30) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-08bc6f39436e47c30)) | [ami-0bd936dc3de6b791d](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0bd936dc3de6b791d) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0bd936dc3de6b791d)) |
|
|
||||||
| eu-central-1 | [ami-06f364adb4a297706](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06f364adb4a297706) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06f364adb4a297706)) | [ami-0bb1a41a1c0eafc95](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0bb1a41a1c0eafc95) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0bb1a41a1c0eafc95)) |
|
|
||||||
| eu-north-1 | [ami-05f1271ab15bf4557](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-05f1271ab15bf4557) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-05f1271ab15bf4557)) | [ami-0e2b6818c61b0b113](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e2b6818c61b0b113) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e2b6818c61b0b113)) |
|
|
||||||
| eu-south-1 | [ami-06fb368b1c23356ca](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06fb368b1c23356ca) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06fb368b1c23356ca)) | [ami-0e69ca71abc28babe](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e69ca71abc28babe) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e69ca71abc28babe)) |
|
|
||||||
| eu-west-1 | [ami-0887b1a806a73417a](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0887b1a806a73417a) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0887b1a806a73417a)) | [ami-0274c314a1272d2fd](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0274c314a1272d2fd) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0274c314a1272d2fd)) |
|
|
||||||
| eu-west-2 | [ami-0d0ae9eb51f79e338](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d0ae9eb51f79e338) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0d0ae9eb51f79e338)) | [ami-0e4e3a358f49875dc](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e4e3a358f49875dc) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0e4e3a358f49875dc)) |
|
|
||||||
| eu-west-3 | [ami-08af7eab2ea99f7e5](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08af7eab2ea99f7e5) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-08af7eab2ea99f7e5)) | [ami-031817718bbaf781d](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-031817718bbaf781d) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-031817718bbaf781d)) |
|
|
||||||
| me-south-1 | [ami-02b98efa2cd0b2ab0](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02b98efa2cd0b2ab0) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02b98efa2cd0b2ab0)) | [ami-0a665daaaf042257a](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a665daaaf042257a) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a665daaaf042257a)) |
|
|
||||||
| sa-east-1 | [ami-07f46bbd5674b79a6](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07f46bbd5674b79a6) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-07f46bbd5674b79a6)) | [ami-0101f8d6e37b57173](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0101f8d6e37b57173) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0101f8d6e37b57173)) |
|
|
||||||
| us-east-1 | [ami-03175ec34a7192e70](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03175ec34a7192e70) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03175ec34a7192e70)) | [ami-0f1919ed094505be3](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f1919ed094505be3) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0f1919ed094505be3)) |
|
|
||||||
| us-east-2 | [ami-082d34382e0289102](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-082d34382e0289102) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-082d34382e0289102)) | [ami-01f0c5ccdeab2a3d8](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01f0c5ccdeab2a3d8) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-01f0c5ccdeab2a3d8)) |
|
|
||||||
| us-west-1 | [ami-0081057f803624455](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0081057f803624455) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0081057f803624455)) | [ami-0000605ad5571b4c0](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0000605ad5571b4c0) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0000605ad5571b4c0)) |
|
|
||||||
| us-west-2 | [ami-03e685d5fddaf46e7](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03e685d5fddaf46e7) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-03e685d5fddaf46e7)) | [ami-05e856cad09314ed0](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-05e856cad09314ed0) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-05e856cad09314ed0)) |
|
|
||||||
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
### Alpine Linux 3.13.5 (2021-06-15)
|
|
||||||
<details><summary><i>click to show/hide</i></summary><p>
|
|
||||||
|
|
||||||
| Region | alpine-ami-3.13.5-aarch64-r1 | alpine-ami-3.13.5-x86_64-r0 |
|
|
||||||
| ------ | --- | --- |
|
|
||||||
| af-south-1 | [ami-077c41d657f21a319](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-077c41d657f21a319) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-077c41d657f21a319)) | [ami-0441b82fd3fb48433](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0441b82fd3fb48433) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0441b82fd3fb48433)) |
|
|
||||||
| ap-east-1 | [ami-0650eebfb386ffb89](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0650eebfb386ffb89) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0650eebfb386ffb89)) | [ami-0e2d8dfaf125a7631](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e2d8dfaf125a7631) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e2d8dfaf125a7631)) |
|
|
||||||
| ap-northeast-1 | [ami-034682c4a51e88cf7](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-034682c4a51e88cf7) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-034682c4a51e88cf7)) | [ami-02fb62943caac3c71](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02fb62943caac3c71) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02fb62943caac3c71)) |
|
|
||||||
| ap-northeast-2 | [ami-070b973637320a52c](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-070b973637320a52c) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-070b973637320a52c)) | [ami-038fc3b2d886b83ce](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-038fc3b2d886b83ce) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-038fc3b2d886b83ce)) |
|
|
||||||
| ap-northeast-3 | [ami-0df1727e6d714cc2d](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0df1727e6d714cc2d) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0df1727e6d714cc2d)) | [ami-0678e9272dbb276a1](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0678e9272dbb276a1) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0678e9272dbb276a1)) |
|
|
||||||
| ap-south-1 | [ami-073046a717b1930dc](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-073046a717b1930dc) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-073046a717b1930dc)) | [ami-0c0073e10ee3a5b66](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0c0073e10ee3a5b66) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0c0073e10ee3a5b66)) |
|
|
||||||
| ap-southeast-1 | [ami-03ac48af40b667111](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03ac48af40b667111) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03ac48af40b667111)) | [ami-07c71c29e8cfef967](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07c71c29e8cfef967) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-07c71c29e8cfef967)) |
|
|
||||||
| ap-southeast-2 | [ami-04d61dc48ced711e3](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-04d61dc48ced711e3) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-04d61dc48ced711e3)) | [ami-039c2e2595e9da7fc](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-039c2e2595e9da7fc) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-039c2e2595e9da7fc)) |
|
|
||||||
| ca-central-1 | [ami-0f40fb960a6bac29a](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f40fb960a6bac29a) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0f40fb960a6bac29a)) | [ami-0a464816128999904](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a464816128999904) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a464816128999904)) |
|
|
||||||
| eu-central-1 | [ami-0dcacb8c85ee2349e](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0dcacb8c85ee2349e) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0dcacb8c85ee2349e)) | [ami-0d6ad9b3597da40c4](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d6ad9b3597da40c4) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d6ad9b3597da40c4)) |
|
|
||||||
| eu-north-1 | [ami-0469d8b4b0f1b6493](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0469d8b4b0f1b6493) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0469d8b4b0f1b6493)) | [ami-03cb5b21303291be4](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03cb5b21303291be4) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03cb5b21303291be4)) |
|
|
||||||
| eu-south-1 | [ami-0417a5f0b9249cb6e](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0417a5f0b9249cb6e) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0417a5f0b9249cb6e)) | [ami-02bd65e399a33d2c0](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02bd65e399a33d2c0) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02bd65e399a33d2c0)) |
|
|
||||||
| eu-west-1 | [ami-0ff5ce856793c0471](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ff5ce856793c0471) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0ff5ce856793c0471)) | [ami-097ec49079a5d612f](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-097ec49079a5d612f) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-097ec49079a5d612f)) |
|
|
||||||
| eu-west-2 | [ami-07cd282c1d6887959](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07cd282c1d6887959) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-07cd282c1d6887959)) | [ami-0360a9a8fec665753](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0360a9a8fec665753) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0360a9a8fec665753)) |
|
|
||||||
| eu-west-3 | [ami-0b5cffef9ef83241c](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b5cffef9ef83241c) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0b5cffef9ef83241c)) | [ami-0adda5d20f341ae82](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0adda5d20f341ae82) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0adda5d20f341ae82)) |
|
|
||||||
| me-south-1 | [ami-00cd03fd11106a4cf](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00cd03fd11106a4cf) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00cd03fd11106a4cf)) | [ami-0cd56b96bf4e83dcf](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0cd56b96bf4e83dcf) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0cd56b96bf4e83dcf)) |
|
|
||||||
| sa-east-1 | [ami-0b92ae87d6e141bbb](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b92ae87d6e141bbb) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0b92ae87d6e141bbb)) | [ami-08370ac3635a06147](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08370ac3635a06147) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-08370ac3635a06147)) |
|
|
||||||
| us-east-1 | [ami-08500c947a8870478](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08500c947a8870478) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-08500c947a8870478)) | [ami-068216a0f0800db09](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-068216a0f0800db09) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-068216a0f0800db09)) |
|
|
||||||
| us-east-2 | [ami-0acde1f635f6811c4](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0acde1f635f6811c4) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0acde1f635f6811c4)) | [ami-06c24203121c5baa9](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06c24203121c5baa9) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-06c24203121c5baa9)) |
|
|
||||||
| us-west-1 | [ami-09e1594112290a416](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09e1594112290a416) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-09e1594112290a416)) | [ami-03815baf7396cc308](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03815baf7396cc308) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03815baf7396cc308)) |
|
|
||||||
| us-west-2 | [ami-034dc333a09683077](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-034dc333a09683077) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-034dc333a09683077)) | [ami-0ccbd58d6e42a3f64](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ccbd58d6e42a3f64) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0ccbd58d6e42a3f64)) |
|
|
||||||
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
### Alpine Linux 3.12.7 (2021-06-15)
|
|
||||||
<details><summary><i>click to show/hide</i></summary><p>
|
|
||||||
|
|
||||||
| Region | alpine-ami-3.12.7-aarch64-r1 | alpine-ami-3.12.7-x86_64-r0 |
|
|
||||||
| ------ | --- | --- |
|
|
||||||
| af-south-1 | [ami-02a463c487f299306](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02a463c487f299306) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02a463c487f299306)) | [ami-0ef71998139e39742](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ef71998139e39742) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0ef71998139e39742)) |
|
|
||||||
| ap-east-1 | [ami-07ef9272fba7965e3](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07ef9272fba7965e3) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-07ef9272fba7965e3)) | [ami-0628f9a686336d658](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0628f9a686336d658) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0628f9a686336d658)) |
|
|
||||||
| ap-northeast-1 | [ami-035fb63f9b293417d](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-035fb63f9b293417d) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-035fb63f9b293417d)) | [ami-0b34d9cbb63106e61](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b34d9cbb63106e61) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0b34d9cbb63106e61)) |
|
|
||||||
| ap-northeast-2 | [ami-07b5a03e1bb389253](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07b5a03e1bb389253) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-07b5a03e1bb389253)) | [ami-080b50f812df717ea](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-080b50f812df717ea) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-080b50f812df717ea)) |
|
|
||||||
| ap-northeast-3 | [ami-0181e54576075b5cc](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0181e54576075b5cc) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0181e54576075b5cc)) | [ami-01ddf8610921c1f5b](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01ddf8610921c1f5b) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-01ddf8610921c1f5b)) |
|
|
||||||
| ap-south-1 | [ami-01044c4b5478c4d1d](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01044c4b5478c4d1d) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-01044c4b5478c4d1d)) | [ami-0f8f786ca89d0968c](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f8f786ca89d0968c) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0f8f786ca89d0968c)) |
|
|
||||||
| ap-southeast-1 | [ami-01b96ea14b3a15a77](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01b96ea14b3a15a77) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-01b96ea14b3a15a77)) | [ami-079d7c6b97cac3237](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-079d7c6b97cac3237) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-079d7c6b97cac3237)) |
|
|
||||||
| ap-southeast-2 | [ami-06855d79571a6e4ac](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06855d79571a6e4ac) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-06855d79571a6e4ac)) | [ami-0d2e1217ececc880d](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d2e1217ececc880d) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0d2e1217ececc880d)) |
|
|
||||||
| ca-central-1 | [ami-042c2cb60c794554c](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-042c2cb60c794554c) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-042c2cb60c794554c)) | [ami-094e7437e91419deb](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-094e7437e91419deb) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-094e7437e91419deb)) |
|
|
||||||
| eu-central-1 | [ami-00eda68b21e026a70](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00eda68b21e026a70) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00eda68b21e026a70)) | [ami-09eec438ca839ca58](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09eec438ca839ca58) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-09eec438ca839ca58)) |
|
|
||||||
| eu-north-1 | [ami-005856c2c0649fd53](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-005856c2c0649fd53) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-005856c2c0649fd53)) | [ami-09447e487e10b7655](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09447e487e10b7655) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-09447e487e10b7655)) |
|
|
||||||
| eu-south-1 | [ami-0a4b952da5d2e6d51](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a4b952da5d2e6d51) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a4b952da5d2e6d51)) | [ami-04d393060a61a1eca](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-04d393060a61a1eca) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-04d393060a61a1eca)) |
|
|
||||||
| eu-west-1 | [ami-0463f3ec0e6f3ae1c](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0463f3ec0e6f3ae1c) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0463f3ec0e6f3ae1c)) | [ami-095c3d5967fd9c885](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-095c3d5967fd9c885) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-095c3d5967fd9c885)) |
|
|
||||||
| eu-west-2 | [ami-0fb6524693687cca0](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0fb6524693687cca0) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0fb6524693687cca0)) | [ami-005a2f89daaf77547](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-005a2f89daaf77547) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-005a2f89daaf77547)) |
|
|
||||||
| eu-west-3 | [ami-0d53043aa280e8b70](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d53043aa280e8b70) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0d53043aa280e8b70)) | [ami-0700c55763af6a1bb](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0700c55763af6a1bb) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0700c55763af6a1bb)) |
|
|
||||||
| me-south-1 | [ami-0a1d69b39aea74ece](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a1d69b39aea74ece) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a1d69b39aea74ece)) | [ami-039b1ff0cfd4c9e1c](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-039b1ff0cfd4c9e1c) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-039b1ff0cfd4c9e1c)) |
|
|
||||||
| sa-east-1 | [ami-0274fe1f8294b34fb](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0274fe1f8294b34fb) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0274fe1f8294b34fb)) | [ami-0d364d95ef0e3ed08](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d364d95ef0e3ed08) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d364d95ef0e3ed08)) |
|
|
||||||
| us-east-1 | [ami-0f2f4e0001bf5b275](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f2f4e0001bf5b275) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0f2f4e0001bf5b275)) | [ami-08a8e1cd5cfe6fc40](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08a8e1cd5cfe6fc40) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-08a8e1cd5cfe6fc40)) |
|
|
||||||
| us-east-2 | [ami-01dd480af3ec8e7b5](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01dd480af3ec8e7b5) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-01dd480af3ec8e7b5)) | [ami-0f213093a04cde948](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f213093a04cde948) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f213093a04cde948)) |
|
|
||||||
| us-west-1 | [ami-006f02a62ee4c57a0](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-006f02a62ee4c57a0) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-006f02a62ee4c57a0)) | [ami-0a5fc9a6a5351641e](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a5fc9a6a5351641e) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a5fc9a6a5351641e)) |
|
|
||||||
| us-west-2 | [ami-04485971d90cee562](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-04485971d90cee562) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-04485971d90cee562)) | [ami-06b1887a7bc6eb122](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06b1887a7bc6eb122) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-06b1887a7bc6eb122)) |
|
|
||||||
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
### Alpine Linux 3.11.11 (2021-04-15)
|
|
||||||
<details><summary><i>click to show/hide</i></summary><p>
|
|
||||||
|
|
||||||
| Region | alpine-ami-3.11.11-x86_64-r0 |
|
|
||||||
| ------ | --- |
|
|
||||||
| af-south-1 | [ami-0a5bccfa2bc184bb1](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a5bccfa2bc184bb1) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a5bccfa2bc184bb1)) |
|
|
||||||
| ap-east-1 | [ami-057fe5fb6dbaeaabe](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-057fe5fb6dbaeaabe) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-057fe5fb6dbaeaabe)) |
|
|
||||||
| ap-northeast-1 | [ami-0ce72c30606d58e2a](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ce72c30606d58e2a) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0ce72c30606d58e2a)) |
|
|
||||||
| ap-northeast-2 | [ami-075d81ae6bd805c9a](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-075d81ae6bd805c9a) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-075d81ae6bd805c9a)) |
|
|
||||||
| ap-northeast-3 | [ami-048b8b812a37a6e9d](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-048b8b812a37a6e9d) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-048b8b812a37a6e9d)) |
|
|
||||||
| ap-south-1 | [ami-0a09ced4a0968561a](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a09ced4a0968561a) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a09ced4a0968561a)) |
|
|
||||||
| ap-southeast-1 | [ami-0c3268d224a7be79f](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0c3268d224a7be79f) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0c3268d224a7be79f)) |
|
|
||||||
| ap-southeast-2 | [ami-0fe81386105b2c320](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0fe81386105b2c320) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0fe81386105b2c320)) |
|
|
||||||
| ca-central-1 | [ami-02351d48ae19b5153](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02351d48ae19b5153) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02351d48ae19b5153)) |
|
|
||||||
| eu-central-1 | [ami-082d5ae92b013cf0c](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-082d5ae92b013cf0c) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-082d5ae92b013cf0c)) |
|
|
||||||
| eu-north-1 | [ami-0a67df0ddb737bca0](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a67df0ddb737bca0) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a67df0ddb737bca0)) |
|
|
||||||
| eu-south-1 | [ami-0b9e1df4e1ea3f09a](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b9e1df4e1ea3f09a) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0b9e1df4e1ea3f09a)) |
|
|
||||||
| eu-west-1 | [ami-06318efc075e9c192](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06318efc075e9c192) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06318efc075e9c192)) |
|
|
||||||
| eu-west-2 | [ami-0a68f325601d8968f](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a68f325601d8968f) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0a68f325601d8968f)) |
|
|
||||||
| eu-west-3 | [ami-06d6b6f3eb35b4988](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06d6b6f3eb35b4988) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-06d6b6f3eb35b4988)) |
|
|
||||||
| me-south-1 | [ami-0fee76fd32b0acb09](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0fee76fd32b0acb09) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0fee76fd32b0acb09)) |
|
|
||||||
| sa-east-1 | [ami-0e3921332d634a1bc](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e3921332d634a1bc) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e3921332d634a1bc)) |
|
|
||||||
| us-east-1 | [ami-09a785c1dd12aa464](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09a785c1dd12aa464) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-09a785c1dd12aa464)) |
|
|
||||||
| us-east-2 | [ami-0f27d5f504d774c42](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f27d5f504d774c42) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f27d5f504d774c42)) |
|
|
||||||
| us-west-1 | [ami-0e1759b0e8c3b8fde](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e1759b0e8c3b8fde) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e1759b0e8c3b8fde)) |
|
|
||||||
| us-west-2 | [ami-038d4cc13841ec79f](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-038d4cc13841ec79f) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-038d4cc13841ec79f)) |
|
|
||||||
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
### Alpine Linux Edge (2021-08-07)
|
|
||||||
<details><summary><i>click to show/hide</i></summary><p>
|
|
||||||
|
|
||||||
| Region | alpine-ami-edge-aarch64-20210807035653 | alpine-ami-edge-x86_64-20210807035653 |
|
|
||||||
| ------ | --- | --- |
|
|
||||||
| af-south-1 | [ami-0d119db2dbae0d1f2](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d119db2dbae0d1f2) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0d119db2dbae0d1f2)) | [ami-043fabf28ec27dd48](https://af-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-043fabf28ec27dd48) ([launch](https://af-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-043fabf28ec27dd48)) |
|
|
||||||
| ap-east-1 | [ami-06720fd442e84af52](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06720fd442e84af52) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-06720fd442e84af52)) | [ami-0cc5ca3f207d56fe4](https://ap-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0cc5ca3f207d56fe4) ([launch](https://ap-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0cc5ca3f207d56fe4)) |
|
|
||||||
| ap-northeast-1 | [ami-03bb3e6b43c7e5b3a](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03bb3e6b43c7e5b3a) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03bb3e6b43c7e5b3a)) | [ami-03c77a5b6ef2ce5cf](https://ap-northeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03c77a5b6ef2ce5cf) ([launch](https://ap-northeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03c77a5b6ef2ce5cf)) |
|
|
||||||
| ap-northeast-2 | [ami-05f6a1444b2dba1be](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-05f6a1444b2dba1be) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-05f6a1444b2dba1be)) | [ami-04efc6ef9b126d1b7](https://ap-northeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-04efc6ef9b126d1b7) ([launch](https://ap-northeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-04efc6ef9b126d1b7)) |
|
|
||||||
| ap-northeast-3 | [ami-06553907a3296d356](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06553907a3296d356) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-06553907a3296d356)) | [ami-09de309f09de8634d](https://ap-northeast-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09de309f09de8634d) ([launch](https://ap-northeast-3.console.aws.amazon.com/ec2/home#launchAmi=ami-09de309f09de8634d)) |
|
|
||||||
| ap-south-1 | [ami-02276ceadfba3d8dc](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-02276ceadfba3d8dc) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-02276ceadfba3d8dc)) | [ami-04e3beb414e5c63a0](https://ap-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-04e3beb414e5c63a0) ([launch](https://ap-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-04e3beb414e5c63a0)) |
|
|
||||||
| ap-southeast-1 | [ami-009e681f7123d7507](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-009e681f7123d7507) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-009e681f7123d7507)) | [ami-091c8e0712eb73cfc](https://ap-southeast-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-091c8e0712eb73cfc) ([launch](https://ap-southeast-1.console.aws.amazon.com/ec2/home#launchAmi=ami-091c8e0712eb73cfc)) |
|
|
||||||
| ap-southeast-2 | [ami-0f609e1d8e752a7d5](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f609e1d8e752a7d5) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f609e1d8e752a7d5)) | [ami-0e0e696ef294e3c54](https://ap-southeast-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e0e696ef294e3c54) ([launch](https://ap-southeast-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0e0e696ef294e3c54)) |
|
|
||||||
| ca-central-1 | [ami-0e79a284afab67660](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e79a284afab67660) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e79a284afab67660)) | [ami-0ddc8f4f4adfb9432](https://ca-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ddc8f4f4adfb9432) ([launch](https://ca-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0ddc8f4f4adfb9432)) |
|
|
||||||
| eu-central-1 | [ami-00d213f492389362f](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-00d213f492389362f) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-00d213f492389362f)) | [ami-0b8f1eb4317be682b](https://eu-central-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b8f1eb4317be682b) ([launch](https://eu-central-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0b8f1eb4317be682b)) |
|
|
||||||
| eu-north-1 | [ami-09efda8acd6cd23a3](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-09efda8acd6cd23a3) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-09efda8acd6cd23a3)) | [ami-013ec2fcd6a337f5c](https://eu-north-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-013ec2fcd6a337f5c) ([launch](https://eu-north-1.console.aws.amazon.com/ec2/home#launchAmi=ami-013ec2fcd6a337f5c)) |
|
|
||||||
| eu-south-1 | [ami-08b0d59e27d5834cd](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-08b0d59e27d5834cd) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-08b0d59e27d5834cd)) | [ami-04d0311c3a559280e](https://eu-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-04d0311c3a559280e) ([launch](https://eu-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-04d0311c3a559280e)) |
|
|
||||||
| eu-west-1 | [ami-083fce6ab0babc52b](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-083fce6ab0babc52b) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-083fce6ab0babc52b)) | [ami-092803064e707b52d](https://eu-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-092803064e707b52d) ([launch](https://eu-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-092803064e707b52d)) |
|
|
||||||
| eu-west-2 | [ami-0d5e165b15b45d294](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0d5e165b15b45d294) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0d5e165b15b45d294)) | [ami-06a1e1353977132a1](https://eu-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-06a1e1353977132a1) ([launch](https://eu-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-06a1e1353977132a1)) |
|
|
||||||
| eu-west-3 | [ami-0b9e58d8fb5a5851d](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b9e58d8fb5a5851d) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0b9e58d8fb5a5851d)) | [ami-0403f988d8f677db2](https://eu-west-3.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0403f988d8f677db2) ([launch](https://eu-west-3.console.aws.amazon.com/ec2/home#launchAmi=ami-0403f988d8f677db2)) |
|
|
||||||
| me-south-1 | [ami-0a6ce44e9cae12563](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0a6ce44e9cae12563) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0a6ce44e9cae12563)) | [ami-0759c23186662c037](https://me-south-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0759c23186662c037) ([launch](https://me-south-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0759c23186662c037)) |
|
|
||||||
| sa-east-1 | [ami-0ed048bcd64ffdac7](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0ed048bcd64ffdac7) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0ed048bcd64ffdac7)) | [ami-03502f7175066565d](https://sa-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-03502f7175066565d) ([launch](https://sa-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-03502f7175066565d)) |
|
|
||||||
| us-east-1 | [ami-0e71191f5db7e9a53](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0e71191f5db7e9a53) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0e71191f5db7e9a53)) | [ami-0320caad46860385f](https://us-east-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0320caad46860385f) ([launch](https://us-east-1.console.aws.amazon.com/ec2/home#launchAmi=ami-0320caad46860385f)) |
|
|
||||||
| us-east-2 | [ami-01ae9b5526a5530b9](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-01ae9b5526a5530b9) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-01ae9b5526a5530b9)) | [ami-0b6d988e51817d6cb](https://us-east-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0b6d988e51817d6cb) ([launch](https://us-east-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0b6d988e51817d6cb)) |
|
|
||||||
| us-west-1 | [ami-07236d99bffc73676](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-07236d99bffc73676) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-07236d99bffc73676)) | [ami-05516c86a2533df33](https://us-west-1.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-05516c86a2533df33) ([launch](https://us-west-1.console.aws.amazon.com/ec2/home#launchAmi=ami-05516c86a2533df33)) |
|
|
||||||
| us-west-2 | [ami-0361c483837e42be5](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0361c483837e42be5) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0361c483837e42be5)) | [ami-0f9252184eaaf469b](https://us-west-2.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId=ami-0f9252184eaaf469b) ([launch](https://us-west-2.console.aws.amazon.com/ec2/home#launchAmi=ami-0f9252184eaaf469b)) |
|
|
||||||
|
|
||||||
</p></details>
|
|
@ -1 +0,0 @@
|
|||||||
README.md
|
|
@ -1,311 +0,0 @@
|
|||||||
3.13.5:
|
|
||||||
v3_13-aarch64:
|
|
||||||
alpine-ami-3.13.5-aarch64-r1:
|
|
||||||
description: Alpine Linux 3.13.5 aarch64 r1 - https://alpinelinux.org/cloud
|
|
||||||
profile: alpine
|
|
||||||
profile_build: v3_13-aarch64
|
|
||||||
version: '3.13'
|
|
||||||
release: 3.13.5
|
|
||||||
arch: aarch64
|
|
||||||
revision: r1
|
|
||||||
creation_date: '2021-06-15T15:13:26.000Z'
|
|
||||||
end_of_life: '2022-11-01T00:00:00'
|
|
||||||
build_time: 1623798806
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-077c41d657f21a319
|
|
||||||
eu-north-1: ami-0469d8b4b0f1b6493
|
|
||||||
ap-south-1: ami-073046a717b1930dc
|
|
||||||
eu-west-3: ami-0b5cffef9ef83241c
|
|
||||||
eu-west-2: ami-07cd282c1d6887959
|
|
||||||
eu-south-1: ami-0417a5f0b9249cb6e
|
|
||||||
eu-west-1: ami-0ff5ce856793c0471
|
|
||||||
ap-northeast-3: ami-0df1727e6d714cc2d
|
|
||||||
ap-northeast-2: ami-070b973637320a52c
|
|
||||||
me-south-1: ami-00cd03fd11106a4cf
|
|
||||||
ap-northeast-1: ami-034682c4a51e88cf7
|
|
||||||
sa-east-1: ami-0b92ae87d6e141bbb
|
|
||||||
ca-central-1: ami-0f40fb960a6bac29a
|
|
||||||
ap-east-1: ami-0650eebfb386ffb89
|
|
||||||
ap-southeast-1: ami-03ac48af40b667111
|
|
||||||
ap-southeast-2: ami-04d61dc48ced711e3
|
|
||||||
eu-central-1: ami-0dcacb8c85ee2349e
|
|
||||||
us-east-1: ami-08500c947a8870478
|
|
||||||
us-east-2: ami-0acde1f635f6811c4
|
|
||||||
us-west-1: ami-09e1594112290a416
|
|
||||||
us-west-2: ami-034dc333a09683077
|
|
||||||
v3_13-x86_64:
|
|
||||||
alpine-ami-3.13.5-x86_64-r0:
|
|
||||||
description: Alpine Linux 3.13.5 x86_64 r0 - https://alpinelinux.org/cloud
|
|
||||||
profile: alpine
|
|
||||||
profile_build: v3_13-x86_64
|
|
||||||
version: '3.13'
|
|
||||||
release: 3.13.5
|
|
||||||
arch: x86_64
|
|
||||||
revision: r0
|
|
||||||
creation_date: '2021-04-15T01:03:30.000Z'
|
|
||||||
end_of_life: '2022-11-01T00:00:00'
|
|
||||||
build_time: 1618477410
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-0441b82fd3fb48433
|
|
||||||
eu-north-1: ami-03cb5b21303291be4
|
|
||||||
ap-south-1: ami-0c0073e10ee3a5b66
|
|
||||||
eu-west-3: ami-0adda5d20f341ae82
|
|
||||||
eu-west-2: ami-0360a9a8fec665753
|
|
||||||
eu-south-1: ami-02bd65e399a33d2c0
|
|
||||||
eu-west-1: ami-097ec49079a5d612f
|
|
||||||
ap-northeast-3: ami-0678e9272dbb276a1
|
|
||||||
ap-northeast-2: ami-038fc3b2d886b83ce
|
|
||||||
me-south-1: ami-0cd56b96bf4e83dcf
|
|
||||||
ap-northeast-1: ami-02fb62943caac3c71
|
|
||||||
sa-east-1: ami-08370ac3635a06147
|
|
||||||
ca-central-1: ami-0a464816128999904
|
|
||||||
ap-east-1: ami-0e2d8dfaf125a7631
|
|
||||||
ap-southeast-1: ami-07c71c29e8cfef967
|
|
||||||
ap-southeast-2: ami-039c2e2595e9da7fc
|
|
||||||
eu-central-1: ami-0d6ad9b3597da40c4
|
|
||||||
us-east-1: ami-068216a0f0800db09
|
|
||||||
us-east-2: ami-06c24203121c5baa9
|
|
||||||
us-west-1: ami-03815baf7396cc308
|
|
||||||
us-west-2: ami-0ccbd58d6e42a3f64
|
|
||||||
3.12.7:
|
|
||||||
v3_12-aarch64:
|
|
||||||
alpine-ami-3.12.7-aarch64-r1:
|
|
||||||
description: Alpine Linux 3.12.7 aarch64 r1 - https://github.com/mcrute/alpine-ec2-ami
|
|
||||||
profile: alpine
|
|
||||||
profile_build: v3_12-aarch64
|
|
||||||
version: '3.12'
|
|
||||||
release: 3.12.7
|
|
||||||
arch: aarch64
|
|
||||||
revision: r1
|
|
||||||
creation_date: '2021-06-15T15:16:00.000Z'
|
|
||||||
end_of_life: '2022-05-01T00:00:00'
|
|
||||||
build_time: 1623798960
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-02a463c487f299306
|
|
||||||
eu-north-1: ami-005856c2c0649fd53
|
|
||||||
ap-south-1: ami-01044c4b5478c4d1d
|
|
||||||
eu-west-3: ami-0d53043aa280e8b70
|
|
||||||
eu-west-2: ami-0fb6524693687cca0
|
|
||||||
eu-south-1: ami-0a4b952da5d2e6d51
|
|
||||||
eu-west-1: ami-0463f3ec0e6f3ae1c
|
|
||||||
ap-northeast-3: ami-0181e54576075b5cc
|
|
||||||
ap-northeast-2: ami-07b5a03e1bb389253
|
|
||||||
me-south-1: ami-0a1d69b39aea74ece
|
|
||||||
ap-northeast-1: ami-035fb63f9b293417d
|
|
||||||
sa-east-1: ami-0274fe1f8294b34fb
|
|
||||||
ca-central-1: ami-042c2cb60c794554c
|
|
||||||
ap-east-1: ami-07ef9272fba7965e3
|
|
||||||
ap-southeast-1: ami-01b96ea14b3a15a77
|
|
||||||
ap-southeast-2: ami-06855d79571a6e4ac
|
|
||||||
eu-central-1: ami-00eda68b21e026a70
|
|
||||||
us-east-1: ami-0f2f4e0001bf5b275
|
|
||||||
us-east-2: ami-01dd480af3ec8e7b5
|
|
||||||
us-west-1: ami-006f02a62ee4c57a0
|
|
||||||
us-west-2: ami-04485971d90cee562
|
|
||||||
v3_12-x86_64:
|
|
||||||
alpine-ami-3.12.7-x86_64-r0:
|
|
||||||
description: Alpine Linux 3.12.7 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
|
|
||||||
profile: alpine
|
|
||||||
profile_build: v3_12-x86_64
|
|
||||||
version: '3.12'
|
|
||||||
release: 3.12.7
|
|
||||||
arch: x86_64
|
|
||||||
revision: r0
|
|
||||||
creation_date: '2021-04-15T00:51:54.000Z'
|
|
||||||
end_of_life: '2022-05-01T00:00:00'
|
|
||||||
build_time: 1618476714
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-0ef71998139e39742
|
|
||||||
eu-north-1: ami-09447e487e10b7655
|
|
||||||
ap-south-1: ami-0f8f786ca89d0968c
|
|
||||||
eu-west-3: ami-0700c55763af6a1bb
|
|
||||||
eu-west-2: ami-005a2f89daaf77547
|
|
||||||
eu-south-1: ami-04d393060a61a1eca
|
|
||||||
eu-west-1: ami-095c3d5967fd9c885
|
|
||||||
ap-northeast-3: ami-01ddf8610921c1f5b
|
|
||||||
ap-northeast-2: ami-080b50f812df717ea
|
|
||||||
me-south-1: ami-039b1ff0cfd4c9e1c
|
|
||||||
ap-northeast-1: ami-0b34d9cbb63106e61
|
|
||||||
sa-east-1: ami-0d364d95ef0e3ed08
|
|
||||||
ca-central-1: ami-094e7437e91419deb
|
|
||||||
ap-east-1: ami-0628f9a686336d658
|
|
||||||
ap-southeast-1: ami-079d7c6b97cac3237
|
|
||||||
ap-southeast-2: ami-0d2e1217ececc880d
|
|
||||||
eu-central-1: ami-09eec438ca839ca58
|
|
||||||
us-east-1: ami-08a8e1cd5cfe6fc40
|
|
||||||
us-east-2: ami-0f213093a04cde948
|
|
||||||
us-west-1: ami-0a5fc9a6a5351641e
|
|
||||||
us-west-2: ami-06b1887a7bc6eb122
|
|
||||||
edge:
|
|
||||||
edge-x86_64:
|
|
||||||
alpine-ami-edge-x86_64-20210807035653:
|
|
||||||
description: Alpine Linux edge x86_64 20210807035653 - https://alpinelinux.org/cloud
|
|
||||||
profile: alpine
|
|
||||||
profile_build: edge-x86_64
|
|
||||||
version: edge
|
|
||||||
release: edge
|
|
||||||
arch: x86_64
|
|
||||||
revision: '20210807035653'
|
|
||||||
creation_date: '2021-08-07T04:07:41.000Z'
|
|
||||||
end_of_life: '2021-08-08T03:56:53'
|
|
||||||
build_time: 1628338061
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-043fabf28ec27dd48
|
|
||||||
eu-north-1: ami-013ec2fcd6a337f5c
|
|
||||||
ap-south-1: ami-04e3beb414e5c63a0
|
|
||||||
eu-west-3: ami-0403f988d8f677db2
|
|
||||||
eu-west-2: ami-06a1e1353977132a1
|
|
||||||
eu-south-1: ami-04d0311c3a559280e
|
|
||||||
eu-west-1: ami-092803064e707b52d
|
|
||||||
ap-northeast-3: ami-09de309f09de8634d
|
|
||||||
ap-northeast-2: ami-04efc6ef9b126d1b7
|
|
||||||
me-south-1: ami-0759c23186662c037
|
|
||||||
ap-northeast-1: ami-03c77a5b6ef2ce5cf
|
|
||||||
sa-east-1: ami-03502f7175066565d
|
|
||||||
ca-central-1: ami-0ddc8f4f4adfb9432
|
|
||||||
ap-east-1: ami-0cc5ca3f207d56fe4
|
|
||||||
ap-southeast-1: ami-091c8e0712eb73cfc
|
|
||||||
ap-southeast-2: ami-0e0e696ef294e3c54
|
|
||||||
eu-central-1: ami-0b8f1eb4317be682b
|
|
||||||
us-east-1: ami-0320caad46860385f
|
|
||||||
us-east-2: ami-0b6d988e51817d6cb
|
|
||||||
us-west-1: ami-05516c86a2533df33
|
|
||||||
us-west-2: ami-0f9252184eaaf469b
|
|
||||||
edge-aarch64:
|
|
||||||
alpine-ami-edge-aarch64-20210807035653:
|
|
||||||
description: Alpine Linux edge aarch64 20210807035653 - https://alpinelinux.org/cloud
|
|
||||||
profile: alpine
|
|
||||||
profile_build: edge-aarch64
|
|
||||||
version: edge
|
|
||||||
release: edge
|
|
||||||
arch: aarch64
|
|
||||||
revision: '20210807035653'
|
|
||||||
creation_date: '2021-08-07T04:02:09.000Z'
|
|
||||||
end_of_life: '2021-08-08T03:56:53'
|
|
||||||
build_time: 1628337729
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-0d119db2dbae0d1f2
|
|
||||||
eu-north-1: ami-09efda8acd6cd23a3
|
|
||||||
ap-south-1: ami-02276ceadfba3d8dc
|
|
||||||
eu-west-3: ami-0b9e58d8fb5a5851d
|
|
||||||
eu-west-2: ami-0d5e165b15b45d294
|
|
||||||
eu-south-1: ami-08b0d59e27d5834cd
|
|
||||||
eu-west-1: ami-083fce6ab0babc52b
|
|
||||||
ap-northeast-3: ami-06553907a3296d356
|
|
||||||
ap-northeast-2: ami-05f6a1444b2dba1be
|
|
||||||
me-south-1: ami-0a6ce44e9cae12563
|
|
||||||
ap-northeast-1: ami-03bb3e6b43c7e5b3a
|
|
||||||
sa-east-1: ami-0ed048bcd64ffdac7
|
|
||||||
ca-central-1: ami-0e79a284afab67660
|
|
||||||
ap-east-1: ami-06720fd442e84af52
|
|
||||||
ap-southeast-1: ami-009e681f7123d7507
|
|
||||||
ap-southeast-2: ami-0f609e1d8e752a7d5
|
|
||||||
eu-central-1: ami-00d213f492389362f
|
|
||||||
us-east-1: ami-0e71191f5db7e9a53
|
|
||||||
us-east-2: ami-01ae9b5526a5530b9
|
|
||||||
us-west-1: ami-07236d99bffc73676
|
|
||||||
us-west-2: ami-0361c483837e42be5
|
|
||||||
3.11.11:
|
|
||||||
v3_11-x86_64:
|
|
||||||
alpine-ami-3.11.11-x86_64-r0:
|
|
||||||
description: Alpine Linux 3.11.11 x86_64 r0 - https://github.com/mcrute/alpine-ec2-ami
|
|
||||||
profile: alpine
|
|
||||||
profile_build: v3_11-x86_64
|
|
||||||
version: '3.11'
|
|
||||||
release: 3.11.11
|
|
||||||
arch: x86_64
|
|
||||||
revision: r0
|
|
||||||
creation_date: '2021-04-15T01:12:43.000Z'
|
|
||||||
end_of_life: '2021-11-01T00:00:00'
|
|
||||||
build_time: 1618477963
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-0a5bccfa2bc184bb1
|
|
||||||
eu-north-1: ami-0a67df0ddb737bca0
|
|
||||||
ap-south-1: ami-0a09ced4a0968561a
|
|
||||||
eu-west-3: ami-06d6b6f3eb35b4988
|
|
||||||
eu-west-2: ami-0a68f325601d8968f
|
|
||||||
eu-south-1: ami-0b9e1df4e1ea3f09a
|
|
||||||
eu-west-1: ami-06318efc075e9c192
|
|
||||||
ap-northeast-3: ami-048b8b812a37a6e9d
|
|
||||||
ap-northeast-2: ami-075d81ae6bd805c9a
|
|
||||||
me-south-1: ami-0fee76fd32b0acb09
|
|
||||||
ap-northeast-1: ami-0ce72c30606d58e2a
|
|
||||||
sa-east-1: ami-0e3921332d634a1bc
|
|
||||||
ca-central-1: ami-02351d48ae19b5153
|
|
||||||
ap-east-1: ami-057fe5fb6dbaeaabe
|
|
||||||
ap-southeast-1: ami-0c3268d224a7be79f
|
|
||||||
ap-southeast-2: ami-0fe81386105b2c320
|
|
||||||
eu-central-1: ami-082d5ae92b013cf0c
|
|
||||||
us-east-1: ami-09a785c1dd12aa464
|
|
||||||
us-east-2: ami-0f27d5f504d774c42
|
|
||||||
us-west-1: ami-0e1759b0e8c3b8fde
|
|
||||||
us-west-2: ami-038d4cc13841ec79f
|
|
||||||
3.14.1:
|
|
||||||
v3_14-x86_64:
|
|
||||||
alpine-ami-3.14.1-x86_64-r0:
|
|
||||||
description: Alpine Linux 3.14.1 x86_64 r0 - https://alpinelinux.org/cloud
|
|
||||||
profile: alpine
|
|
||||||
profile_build: v3_14-x86_64
|
|
||||||
version: '3.14'
|
|
||||||
release: 3.14.1
|
|
||||||
arch: x86_64
|
|
||||||
revision: r0
|
|
||||||
creation_date: '2021-08-07T04:04:47.000Z'
|
|
||||||
end_of_life: '2023-05-01T00:00:00'
|
|
||||||
build_time: 1628337887
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-08aea7443b5d08f79
|
|
||||||
eu-north-1: ami-0e2b6818c61b0b113
|
|
||||||
ap-south-1: ami-012f6469429d4ad42
|
|
||||||
eu-west-3: ami-031817718bbaf781d
|
|
||||||
eu-west-2: ami-0e4e3a358f49875dc
|
|
||||||
eu-south-1: ami-0e69ca71abc28babe
|
|
||||||
eu-west-1: ami-0274c314a1272d2fd
|
|
||||||
ap-northeast-3: ami-08b52d5efd9abef56
|
|
||||||
ap-northeast-2: ami-0d7a7fdf22367713c
|
|
||||||
me-south-1: ami-0a665daaaf042257a
|
|
||||||
ap-northeast-1: ami-033c6bceffad8df75
|
|
||||||
sa-east-1: ami-0101f8d6e37b57173
|
|
||||||
ca-central-1: ami-0bd936dc3de6b791d
|
|
||||||
ap-east-1: ami-0d4ba085b9c1557b8
|
|
||||||
ap-southeast-1: ami-01a542451033fd940
|
|
||||||
ap-southeast-2: ami-014e86c5062e164af
|
|
||||||
eu-central-1: ami-0bb1a41a1c0eafc95
|
|
||||||
us-east-1: ami-0f1919ed094505be3
|
|
||||||
us-east-2: ami-01f0c5ccdeab2a3d8
|
|
||||||
us-west-1: ami-0000605ad5571b4c0
|
|
||||||
us-west-2: ami-05e856cad09314ed0
|
|
||||||
v3_14-aarch64:
|
|
||||||
alpine-ami-3.14.1-aarch64-r0:
|
|
||||||
description: Alpine Linux 3.14.1 aarch64 r0 - https://alpinelinux.org/cloud
|
|
||||||
profile: alpine
|
|
||||||
profile_build: v3_14-aarch64
|
|
||||||
version: '3.14'
|
|
||||||
release: 3.14.1
|
|
||||||
arch: aarch64
|
|
||||||
revision: r0
|
|
||||||
creation_date: '2021-08-07T03:59:14.000Z'
|
|
||||||
end_of_life: '2023-05-01T00:00:00'
|
|
||||||
build_time: 1628337554
|
|
||||||
artifacts:
|
|
||||||
af-south-1: ami-0bcf48f55b9949a84
|
|
||||||
eu-north-1: ami-05f1271ab15bf4557
|
|
||||||
ap-south-1: ami-07ed5174d6da65d84
|
|
||||||
eu-west-3: ami-08af7eab2ea99f7e5
|
|
||||||
eu-west-2: ami-0d0ae9eb51f79e338
|
|
||||||
eu-south-1: ami-06fb368b1c23356ca
|
|
||||||
eu-west-1: ami-0887b1a806a73417a
|
|
||||||
ap-northeast-3: ami-0956b7bafd7a6720d
|
|
||||||
ap-northeast-2: ami-07667213840caca26
|
|
||||||
me-south-1: ami-02b98efa2cd0b2ab0
|
|
||||||
ap-northeast-1: ami-0b559d40e76da2119
|
|
||||||
sa-east-1: ami-07f46bbd5674b79a6
|
|
||||||
ca-central-1: ami-08bc6f39436e47c30
|
|
||||||
ap-east-1: ami-092aa3a38d204b2b5
|
|
||||||
ap-southeast-1: ami-0aa966cf6ca931b11
|
|
||||||
ap-southeast-2: ami-069d767cedbd4d7a5
|
|
||||||
eu-central-1: ami-06f364adb4a297706
|
|
||||||
us-east-1: ami-03175ec34a7192e70
|
|
||||||
us-east-2: ami-082d34382e0289102
|
|
||||||
us-west-1: ami-0081057f803624455
|
|
||||||
us-west-2: ami-03e685d5fddaf46e7
|
|
1366
scripts/builder.py
1366
scripts/builder.py
File diff suppressed because it is too large
Load Diff
42
scripts/cleanup
Normal file
42
scripts/cleanup
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/sh -eu
|
||||||
|
# vim: ts=4 et:
|
||||||
|
|
||||||
|
[ -z "$DEBUG" ] || set +x
|
||||||
|
|
||||||
|
export \
|
||||||
|
TARGET=/mnt
|
||||||
|
|
||||||
|
|
||||||
|
die() {
|
||||||
|
printf '\033[1;7;31m FATAL: %s \033[0m\n' "$@" >&2 # bold reversed red
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
einfo() {
|
||||||
|
printf '\n\033[1;7;36m> %s <\033[0m\n' "$@" >&2 # bold reversed cyan
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
# Sweep cruft out of the image that doesn't need to ship or will be
|
||||||
|
# re-generated when the image boots
|
||||||
|
rm -f \
|
||||||
|
"$TARGET/var/cache/apk/"* \
|
||||||
|
"$TARGET/etc/resolv.conf" \
|
||||||
|
"$TARGET/root/.ash_history" \
|
||||||
|
"$TARGET/etc/"*-
|
||||||
|
|
||||||
|
# unmount extra EFI mount
|
||||||
|
if [ "$FIRMWARE" = uefi ]; then
|
||||||
|
umount "$TARGET/boot/efi"
|
||||||
|
fi
|
||||||
|
|
||||||
|
umount \
|
||||||
|
"$TARGET/dev" \
|
||||||
|
"$TARGET/proc" \
|
||||||
|
"$TARGET/sys"
|
||||||
|
|
||||||
|
umount "$TARGET"
|
||||||
|
}
|
||||||
|
|
||||||
|
einfo "Cleaning up and unmounting image volume..."
|
||||||
|
cleanup
|
||||||
|
einfo "Done!"
|
222
scripts/setup
Executable file
222
scripts/setup
Executable file
@ -0,0 +1,222 @@
|
|||||||
|
#!/bin/sh -eu
|
||||||
|
# vim: ts=4 et:
|
||||||
|
|
||||||
|
[ -z "$DEBUG" -o "$DEBUG" = 0 ] || set -x
|
||||||
|
|
||||||
|
export \
|
||||||
|
DEVICE=/dev/vda \
|
||||||
|
TARGET=/mnt \
|
||||||
|
SETUP=/tmp/setup.d
|
||||||
|
|
||||||
|
|
||||||
|
die() {
|
||||||
|
printf '\033[1;7;31m FATAL: %s \033[0m\n' "$@" >&2 # bold reversed red
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
einfo() {
|
||||||
|
printf '\n\033[1;7;36m> %s <\033[0m\n' "$@" >&2 # bold reversed cyan
|
||||||
|
}
|
||||||
|
|
||||||
|
# set up the builder's environment
|
||||||
|
setup_builder() {
|
||||||
|
einfo "Setting up Builder Instance"
|
||||||
|
setup-apkrepos -1 # main repo via dl-cdn
|
||||||
|
# ODO? also uncomment community repo?
|
||||||
|
apk --no-cache add \
|
||||||
|
e2fsprogs \
|
||||||
|
dosfstools \
|
||||||
|
gettext \
|
||||||
|
lsblk \
|
||||||
|
parted
|
||||||
|
}
|
||||||
|
|
||||||
|
make_filesystem() {
|
||||||
|
einfo "Making the Filesystem"
|
||||||
|
root_dev=$DEVICE
|
||||||
|
|
||||||
|
# make sure we're using a blank block device
|
||||||
|
lsblk -P --fs "$DEVICE" >/dev/null 2>&1 || \
|
||||||
|
die "'$DEVICE' is not a valid block device"
|
||||||
|
if lsblk -P --fs "$DEVICE" | grep -vq 'FSTYPE=""'; then
|
||||||
|
die "Block device '$DEVICE' is not blank"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$FIRMWARE" = uefi ]; then
|
||||||
|
# EFI partition isn't optimally aligned, but is rarely used after boot
|
||||||
|
parted "$DEVICE" -- \
|
||||||
|
mklabel gpt \
|
||||||
|
mkpart EFI fat32 512KiB 1MiB \
|
||||||
|
mkpart / ext4 1MiB 100% \
|
||||||
|
set 1 esp on \
|
||||||
|
unit MiB print
|
||||||
|
|
||||||
|
root_dev="${DEVICE}2"
|
||||||
|
/usr/sbin/mkfs.fat -n EFI "${DEVICE}1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkfs.ext4 -O ^64bit -L / "$root_dev"
|
||||||
|
mkdir -p "$TARGET"
|
||||||
|
mount -t ext4 "$root_dev" "$TARGET"
|
||||||
|
|
||||||
|
if [ "$FIRMWARE" = uefi ]; then
|
||||||
|
mkdir -p "$TARGET/boot/efi"
|
||||||
|
mount -t vfat "${DEVICE}1" "$TARGET/boot/efi"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_base() {
|
||||||
|
einfo "Installing Alpine Base"
|
||||||
|
mkdir -p "$TARGET/etc/apk"
|
||||||
|
echo "$REPOS" > "$TARGET/etc/apk/repositories"
|
||||||
|
cp -a /etc/apk/keys "$TARGET/etc/apk"
|
||||||
|
apk --root "$TARGET" --initdb --no-cache add $PACKAGES_ADD
|
||||||
|
[ -z "$PACKAGES_NOSCRIPTS" ] || \
|
||||||
|
apk --root "$TARGET" --no-cache --no-scripts add $PACKAGES_NOSCRIPTS
|
||||||
|
[ -z "$PACKAGES_DEL" ] || \
|
||||||
|
apk --root "$TARGET" --no-cache del $PACKAGES_DEL
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_chroot() {
|
||||||
|
mount -t proc none "$TARGET/proc"
|
||||||
|
mount --bind /dev "$TARGET/dev"
|
||||||
|
mount --bind /sys "$TARGET/sys"
|
||||||
|
|
||||||
|
# Needed for bootstrap, will be removed in the cleanup stage.
|
||||||
|
install -Dm644 /etc/resolv.conf "$TARGET/etc/resolv.conf"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_bootloader() {
|
||||||
|
einfo "Installing Bootloader"
|
||||||
|
|
||||||
|
# create initfs
|
||||||
|
sed -Ei "s/^features=\"([^\"]+)\"/features=\"\1 $INITFS_FEATURES\"/" \
|
||||||
|
"$TARGET/etc/mkinitfs/mkinitfs.conf"
|
||||||
|
# shellcheck disable=SC2046
|
||||||
|
chroot "$TARGET" /sbin/mkinitfs $(basename $(find "$TARGET/lib/modules/"* -maxdepth 0))
|
||||||
|
|
||||||
|
if [ "$FIRMWARE" = uefi ]; then
|
||||||
|
install_grub_efi
|
||||||
|
else
|
||||||
|
install_extlinux
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_extlinux() {
|
||||||
|
# Use disk labels instead of UUID or devices paths so that this works across
|
||||||
|
# instance familes. UUID works for many instances but breaks on the NVME
|
||||||
|
# ones because EBS volumes are hidden behind NVME devices.
|
||||||
|
#
|
||||||
|
# Shorten timeout (1/10s), eliminating delays for instance launches.
|
||||||
|
#
|
||||||
|
# ttyS0 is for EC2 Console "Get system log" and "EC2 Serial Console"
|
||||||
|
# features, whereas tty0 is for "Get Instance screenshot" feature. Enabling
|
||||||
|
# the port early in extlinux gives the most complete output in the log.
|
||||||
|
#
|
||||||
|
# TODO: review for other clouds -- this may need to be cloud-specific.
|
||||||
|
sed -Ei -e "s|^[# ]*(root)=.*|\1=LABEL=/|" \
|
||||||
|
-e "s|^[# ]*(default_kernel_opts)=.*|\1=\"$KERNEL_OPTIONS\"|" \
|
||||||
|
-e "s|^[# ]*(serial_port)=.*|\1=ttyS0|" \
|
||||||
|
-e "s|^[# ]*(modules)=.*|\1=$KERNEL_MODULES|" \
|
||||||
|
-e "s|^[# ]*(default)=.*|\1=virt|" \
|
||||||
|
-e "s|^[# ]*(timeout)=.*|\1=1|" \
|
||||||
|
"$TARGET/etc/update-extlinux.conf"
|
||||||
|
|
||||||
|
chroot "$TARGET" /sbin/extlinux --install /boot
|
||||||
|
# TODO: is this really necessary? can we set all this stuff during --install?
|
||||||
|
chroot "$TARGET" /sbin/update-extlinux --warn-only
|
||||||
|
}
|
||||||
|
|
||||||
|
install_grub_efi() {
|
||||||
|
[ -d "/sys/firmware/efi" ] || die "/sys/firmware/efi does not exist"
|
||||||
|
|
||||||
|
case "$ARCH" in
|
||||||
|
x86_64) grub_target=x86_64-efi ; fwa=x64 ;;
|
||||||
|
aarch64) grub_target=arm64-efi ; fwa=aa64 ;;
|
||||||
|
*) die "ARCH=$ARCH is currently unsupported" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# disable nvram so grub doesn't call efibootmgr
|
||||||
|
chroot "$TARGET" /usr/sbin/grub-install --target="$grub_target" --efi-directory=/boot/efi \
|
||||||
|
--bootloader-id=alpine --boot-directory=/boot --no-nvram
|
||||||
|
|
||||||
|
# fallback mode
|
||||||
|
install -D "$TARGET/boot/efi/EFI/alpine/grub$fwa.efi" "$TARGET/boot/efi/EFI/boot/boot$fwa.efi"
|
||||||
|
|
||||||
|
# install default grub config
|
||||||
|
envsubst < "$SETUP/grub.template" > "$SETUP/grub"
|
||||||
|
install -o root -g root -Dm644 -t "$TARGET/etc/default" \
|
||||||
|
"$SETUP/grub"
|
||||||
|
|
||||||
|
# generate/install new config
|
||||||
|
chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_system() {
|
||||||
|
einfo "Configuring System"
|
||||||
|
|
||||||
|
# setup fstab
|
||||||
|
install -o root -g root -Dm644 -t "$TARGET/etc" \
|
||||||
|
"$SETUP/fstab"
|
||||||
|
# if we're using an EFI bootloader, add extra line for EFI partition
|
||||||
|
if [ "$FIRMWARE" = uefi ]; then
|
||||||
|
cat "$SETUP/fstab.grub-efi" >> "$TARGET/etc/fstab"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Disable getty for physical ttys, enable getty for serial ttyS0.
|
||||||
|
sed -Ei -e '/^tty[0-9]/s/^/#/' -e '/^#ttyS0:/s/^#//' "$TARGET/etc/inittab"
|
||||||
|
|
||||||
|
# setup sudo and/or doas
|
||||||
|
if grep -q '^sudo$' "$TARGET/etc/apk/world"; then
|
||||||
|
echo '%wheel ALL=(ALL) NOPASSWD: ALL' > "$TARGET/etc/sudoers.d/wheel"
|
||||||
|
fi
|
||||||
|
if grep -q '^doas$' "$TARGET/etc/apk/world"; then
|
||||||
|
echo 'permit nopass :wheel' > "$TARGET/etc/doas.d/wheel.conf"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# explicitly lock the root account
|
||||||
|
chroot "$TARGET" /usr/bin/passwd -l root
|
||||||
|
|
||||||
|
# set up image user
|
||||||
|
user="${IMAGE_LOGIN:-alpine}"
|
||||||
|
chroot "$TARGET" /usr/sbin/addgroup "$user"
|
||||||
|
chroot "$TARGET" /usr/sbin/adduser -h "/home/$user" -s /bin/sh -G "$user" -D "$user"
|
||||||
|
chroot "$TARGET" /usr/sbin/addgroup "$user" wheel
|
||||||
|
chroot "$TARGET" /usr/bin/passwd -u "$user"
|
||||||
|
|
||||||
|
# modify PS1s in /etc/profile to add user
|
||||||
|
sed -Ei \
|
||||||
|
-e "s/(^PS1=')(\\$\\{HOSTNAME%)/\\1\\$\\USER@\\2/" \
|
||||||
|
-e "s/( PS1=')(\\\\h:)/\\1\\\\u@\\2/" \
|
||||||
|
-e "s/( PS1=')(%m:)/\\1%n@\\2/" \
|
||||||
|
"$TARGET"/etc/profile
|
||||||
|
|
||||||
|
setup_services
|
||||||
|
}
|
||||||
|
|
||||||
|
# shellcheck disable=SC2046
|
||||||
|
setup_services() {
|
||||||
|
for lvl_svcs in $SERVICES_ENABLE; do
|
||||||
|
rc add $(echo "$lvl_svcs" | tr '=,' ' ')
|
||||||
|
done
|
||||||
|
for lvl_svcs in $SERVICES_DISABLE; do
|
||||||
|
rc del $(echo "$lvl_svcs" | tr '=,' ' ')
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
rc() {
|
||||||
|
op="$1" # add or del
|
||||||
|
runlevel="$2" # runlevel name
|
||||||
|
shift 2
|
||||||
|
services="$*" # names of services
|
||||||
|
|
||||||
|
for svc in $services; do
|
||||||
|
chroot "$TARGET" rc-update "$op" "$svc" "$runlevel"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_builder
|
||||||
|
make_filesystem
|
||||||
|
install_base
|
||||||
|
setup_chroot
|
||||||
|
install_bootloader
|
||||||
|
configure_system
|
@ -1,414 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# vim: set ts=4 et:
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
DEVICE=/dev/xvdf
|
|
||||||
TARGET=/mnt/target
|
|
||||||
SETUP=/tmp/setup-ami.d
|
|
||||||
|
|
||||||
[ "$VERSION" = 'edge' ] && V= || V=v
|
|
||||||
MAIN_REPO="https://dl-cdn.alpinelinux.org/alpine/$V$VERSION/main/$ARCH"
|
|
||||||
|
|
||||||
die() {
|
|
||||||
printf '\033[1;31mERROR:\033[0m %s\n' "$@" >&2 # bold red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
einfo() {
|
|
||||||
printf '\n\033[1;36m> %s\033[0m\n' "$@" >&2 # bold cyan
|
|
||||||
}
|
|
||||||
|
|
||||||
rc_add() {
|
|
||||||
runlevel="$1"; shift # runlevel name
|
|
||||||
services="$*" # names of services
|
|
||||||
|
|
||||||
for svc in $services; do
|
|
||||||
mkdir -p "$TARGET/etc/runlevels/$runlevel"
|
|
||||||
ln -s "/etc/init.d/$svc" "$TARGET/etc/runlevels/$runlevel/$svc"
|
|
||||||
echo " * service $svc added to runlevel $runlevel"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
validate_block_device() {
|
|
||||||
lsblk -P --fs "$DEVICE" >/dev/null 2>&1 || \
|
|
||||||
die "'$DEVICE' is not a valid block device"
|
|
||||||
|
|
||||||
if lsblk -P --fs "$DEVICE" | grep -vq 'FSTYPE=""'; then
|
|
||||||
die "Block device '$DEVICE' is not blank"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
main_repo_pkgs() {
|
|
||||||
wget -T 10 -q -O - "$MAIN_REPO/" | grep '^<a href=' | cut -d\" -f2
|
|
||||||
}
|
|
||||||
|
|
||||||
fetch_apk_tools() {
|
|
||||||
store="$(mktemp -d)"
|
|
||||||
tarball="$(main_repo_pkgs | grep ^apk-tools-static- | sort -V | tail -n 1)"
|
|
||||||
|
|
||||||
wget -T 10 -q -O "$store/$tarball" "$MAIN_REPO/$tarball"
|
|
||||||
tar -C "$store" --warning=no-unknown-keyword -xf "$store/$tarball"
|
|
||||||
|
|
||||||
find "$store" -name apk.static
|
|
||||||
}
|
|
||||||
|
|
||||||
# mostly from Alpine's /sbin/setup-disk
|
|
||||||
setup_partitions() {
|
|
||||||
start=2M # Needed to align EBS partitions
|
|
||||||
line=
|
|
||||||
|
|
||||||
# create new partitions
|
|
||||||
(
|
|
||||||
for line in "$@"; do
|
|
||||||
case "$line" in
|
|
||||||
0M*) ;;
|
|
||||||
*) echo "$start,$line"; start= ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
) | sfdisk --quiet --label gpt "$DEVICE"
|
|
||||||
|
|
||||||
# we assume that the build host will create the new devices within 5s
|
|
||||||
tries=5
|
|
||||||
while [ ! -e "${DEVICE}1" ]; do
|
|
||||||
[ $tries -eq 0 ] && break
|
|
||||||
sleep 1
|
|
||||||
tries=$(( tries - 1 ))
|
|
||||||
done
|
|
||||||
[ -e "${DEVICE}1" ] || die "Expected new device ${DEVICE}1 not created"
|
|
||||||
}
|
|
||||||
|
|
||||||
make_filesystem() {
|
|
||||||
root_dev="$DEVICE"
|
|
||||||
|
|
||||||
if [ "$BOOTLOADER" = grub-efi ] || [ "$BOOTLOADER" = EFI_STUB ]; then
|
|
||||||
# create a small EFI partition (remainder for root)
|
|
||||||
if [ "$BOOTLOADER" = EFI_STUB ]; then
|
|
||||||
setup_partitions '11M,U,*' ',L' # kernel + initfs
|
|
||||||
else
|
|
||||||
setup_partitions '512K,U,*' ',L' # currently 278K used
|
|
||||||
fi
|
|
||||||
root_dev="${DEVICE}2"
|
|
||||||
mkfs.vfat -n EFI "${DEVICE}1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkfs.ext4 -O ^64bit -L / "$root_dev"
|
|
||||||
mount "$root_dev" "$TARGET"
|
|
||||||
|
|
||||||
if [ "$BOOTLOADER" = grub-efi ] || [ "$BOOTLOADER" = EFI_STUB ]; then
|
|
||||||
# mount small EFI partition
|
|
||||||
mkdir -p "$TARGET/boot/efi"
|
|
||||||
mount -t vfat "${DEVICE}1" "$TARGET/boot/efi"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_repositories() {
|
|
||||||
mkdir -p "$TARGET/etc/apk/keys"
|
|
||||||
echo "$REPOS" > "$TARGET/etc/apk/repositories"
|
|
||||||
}
|
|
||||||
|
|
||||||
fetch_keys() {
|
|
||||||
tmp="$(mktemp -d)"
|
|
||||||
tarball="$(main_repo_pkgs | grep ^alpine-keys- | sort -V | tail -n 1)"
|
|
||||||
|
|
||||||
wget -T 10 -q -O "$tmp/$tarball" "$MAIN_REPO/$tarball"
|
|
||||||
tar -C "$TARGET" --warning=no-unknown-keyword -xvf "$tmp/$tarball" etc/apk/keys
|
|
||||||
rm -rf "$tmp"
|
|
||||||
}
|
|
||||||
|
|
||||||
install_base() {
|
|
||||||
$apk add --root "$TARGET" --no-cache --initdb alpine-base
|
|
||||||
# verify release matches
|
|
||||||
if [ "$VERSION" != edge ]; then
|
|
||||||
ALPINE_RELEASE=$(cat "$TARGET/etc/alpine-release")
|
|
||||||
[ "$RELEASE" = "$ALPINE_RELEASE" ] || \
|
|
||||||
die "Release '$RELEASE' does not match /etc/alpine-release: $ALPINE_RELEASE"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_chroot() {
|
|
||||||
mount -t proc none "$TARGET/proc"
|
|
||||||
mount --bind /dev "$TARGET/dev"
|
|
||||||
mount --bind /sys "$TARGET/sys"
|
|
||||||
|
|
||||||
# Needed for bootstrap, will be removed in the cleanup stage.
|
|
||||||
install -Dm644 /etc/resolv.conf "$TARGET/etc/resolv.conf"
|
|
||||||
}
|
|
||||||
|
|
||||||
install_core_packages() {
|
|
||||||
chroot "$TARGET" apk --no-cache add $PKGS
|
|
||||||
|
|
||||||
# EFI_STUB requires no bootloader
|
|
||||||
[ "$BOOTLOADER" = EFI_STUB ] || \
|
|
||||||
chroot "$TARGET" apk --no-cache add --no-scripts "$BOOTLOADER"
|
|
||||||
|
|
||||||
# Disable starting getty for physical ttys because they're all inaccessible
|
|
||||||
# anyhow. With this configuration boot messages will still display in the
|
|
||||||
# EC2 console.
|
|
||||||
sed -Ei '/^tty[0-9]/s/^/#/' "$TARGET/etc/inittab"
|
|
||||||
|
|
||||||
# Enable the getty for the serial terminal. This will show the login prompt
|
|
||||||
# in the get-console-output API that's accessible by the CLI and the web
|
|
||||||
# console.
|
|
||||||
sed -Ei '/^#ttyS0:/s/^#//' "$TARGET/etc/inittab"
|
|
||||||
|
|
||||||
# Make it a little more obvious who is logged in by adding username to the
|
|
||||||
# prompt
|
|
||||||
sed -i "s/^export PS1='/&\\\\u@/" "$TARGET/etc/profile"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_mdev() {
|
|
||||||
install -o root -g root -Dm755 -t "$TARGET/lib/mdev" \
|
|
||||||
"$SETUP/nvme-ebs-links" \
|
|
||||||
"$SETUP/eth-eni-hotplug"
|
|
||||||
|
|
||||||
# insert nvme ebs mdev configs just above "# fallback" comment
|
|
||||||
sed -n -i \
|
|
||||||
-e "/# fallback/r $SETUP/etc/mdev-ec2.conf" \
|
|
||||||
-e 1x -e '2,${x;p}' -e '${x;p}' \
|
|
||||||
"$TARGET/etc/mdev.conf"
|
|
||||||
}
|
|
||||||
|
|
||||||
create_initfs() {
|
|
||||||
sed -Ei "s/^features=\"([^\"]+)\"/features=\"\1 $INITFS_FEATURES\"/" \
|
|
||||||
"$TARGET/etc/mkinitfs/mkinitfs.conf"
|
|
||||||
|
|
||||||
chroot "$TARGET" /sbin/mkinitfs $(basename $(find "$TARGET/lib/modules/"* -maxdepth 0))
|
|
||||||
}
|
|
||||||
|
|
||||||
install_bootloader() {
|
|
||||||
case "$BOOTLOADER" in
|
|
||||||
syslinux) install_extlinux ;;
|
|
||||||
grub-efi) install_grub_efi ;;
|
|
||||||
EFI_STUB) install_EFI_STUB ;;
|
|
||||||
*) die "unknown bootloader '$BOOTLOADER'" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
install_extlinux() {
|
|
||||||
# Must use disk labels instead of UUID or devices paths so that this works
|
|
||||||
# across instance familes. UUID works for many instances but breaks on the
|
|
||||||
# NVME ones because EBS volumes are hidden behind NVME devices.
|
|
||||||
#
|
|
||||||
# Enable ext4 because the root device is formatted ext4
|
|
||||||
#
|
|
||||||
# Shorten timeout (1/10s) as EC2 has no way to interact with instance console
|
|
||||||
#
|
|
||||||
# ttyS0 is the target for EC2s "Get System Log" feature whereas tty0 is the
|
|
||||||
# target for EC2s "Get Instance Screenshot" feature. Enabling the serial
|
|
||||||
# port early in extlinux gives the most complete output in the system log.
|
|
||||||
sed -Ei -e "s|^[# ]*(root)=.*|\1=LABEL=/|" \
|
|
||||||
-e "s|^[# ]*(default_kernel_opts)=.*|\1=\"$KERNEL_OPTS\"|" \
|
|
||||||
-e "s|^[# ]*(serial_port)=.*|\1=ttyS0|" \
|
|
||||||
-e "s|^[# ]*(modules)=.*|\1=$KERNEL_MODS|" \
|
|
||||||
-e "s|^[# ]*(default)=.*|\1=virt|" \
|
|
||||||
-e "s|^[# ]*(timeout)=.*|\1=1|" \
|
|
||||||
"$TARGET/etc/update-extlinux.conf"
|
|
||||||
|
|
||||||
chroot "$TARGET" /sbin/extlinux --install /boot
|
|
||||||
chroot "$TARGET" /sbin/update-extlinux --warn-only
|
|
||||||
}
|
|
||||||
|
|
||||||
install_grub_efi() {
|
|
||||||
[ -d "/sys/firmware/efi" ] || die "/sys/firmware/efi does not exist"
|
|
||||||
|
|
||||||
case "$ARCH" in
|
|
||||||
x86_64) grub_target=x86_64-efi ; fwa=x64 ;;
|
|
||||||
aarch64) grub_target=arm64-efi ; fwa=aa64 ;;
|
|
||||||
*) die "ARCH=$ARCH is currently unsupported" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# disable nvram so grub doesn't call efibootmgr
|
|
||||||
chroot "$TARGET" /usr/sbin/grub-install --target="$grub_target" --efi-directory=/boot/efi \
|
|
||||||
--bootloader-id=alpine --boot-directory=/boot --no-nvram
|
|
||||||
|
|
||||||
# fallback mode
|
|
||||||
install -D "$TARGET/boot/efi/EFI/alpine/grub$fwa.efi" "$TARGET/boot/efi/EFI/boot/boot$fwa.efi"
|
|
||||||
|
|
||||||
# install default grub config
|
|
||||||
envsubst < "$SETUP/etc/grub.template" > "$SETUP/etc/grub"
|
|
||||||
install -o root -g root -Dm644 -t "$TARGET/etc/default" \
|
|
||||||
"$SETUP/etc/grub"
|
|
||||||
|
|
||||||
# generate/install new config
|
|
||||||
chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg
|
|
||||||
}
|
|
||||||
|
|
||||||
install_EFI_STUB() {
|
|
||||||
[ -d "/sys/firmware/efi" ] || die "/sys/firmware/efi does not exist"
|
|
||||||
|
|
||||||
case "$ARCH" in
|
|
||||||
x86_64) fwa=x64 ;;
|
|
||||||
aarch64) fwa=aa64 ;;
|
|
||||||
*) die "ARCH=$ARCH is currently unsupported" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# TODO: kernel modules/options?
|
|
||||||
# TODO: will also need initfs in here too
|
|
||||||
# TODO: make it work
|
|
||||||
|
|
||||||
# install kernel as UEFI fallback
|
|
||||||
install -o root -g root -Dm644 "$TARGET/boot/vmlinuz-virt" \
|
|
||||||
"$TARGET/boot/efi/EFI/boot/boot$fwa.efi"
|
|
||||||
# replace original with a symlink
|
|
||||||
rm "$TARGET/boot/vmlinuz-virt"
|
|
||||||
ln -s "efi/EFI/boot/boot$fwa.efi" "$TARGET/boot/vmlinuz-virt"
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_fstab() {
|
|
||||||
install -o root -g root -Dm644 -t "$TARGET/etc" \
|
|
||||||
"$SETUP/etc/fstab"
|
|
||||||
|
|
||||||
# if we're using an EFI bootloader, add extra line for EFI partition
|
|
||||||
if [ "$BOOTLOADER" = grub-efi ] || [ "$BOOTLOADER" = EFI_STUB ]; then
|
|
||||||
cat "$SETUP/etc/fstab.grub-efi" >> "$TARGET/etc/fstab"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_networking() {
|
|
||||||
# configure standard interfaces
|
|
||||||
IFACE_CFG="$TARGET/etc/network/interfaces"
|
|
||||||
install -o root -g root -Dm755 -d "$SETUP/etc/interfaces.d" "$IFACE_CFG.d"
|
|
||||||
install -o root -g root -Dm644 -t "$IFACE_CFG.d" \
|
|
||||||
"$SETUP/etc/interfaces.d/"*
|
|
||||||
cat "$IFACE_CFG.d/lo" "$IFACE_CFG.d/eth0" > "$IFACE_CFG"
|
|
||||||
|
|
||||||
install -o root -g root -Dm755 -t "$TARGET/etc/network" \
|
|
||||||
"$SETUP/assemble-interfaces"
|
|
||||||
|
|
||||||
# install ucdhcp hooks for EC2 ENI IPv6 and secondary IPv4
|
|
||||||
install -o root -g root -Dm755 -t "$TARGET/usr/share/udhcpc" \
|
|
||||||
"$SETUP/eth-eni-hook"
|
|
||||||
for i in post-bound post-renew; do
|
|
||||||
mkdir -p "$TARGET/etc/udhcpc/$i"
|
|
||||||
ln -sf /usr/share/udhcpc/eth-eni-hook \
|
|
||||||
"$TARGET/etc/udhcpc/$i"
|
|
||||||
done
|
|
||||||
|
|
||||||
# install ENI interface setup init script
|
|
||||||
install -o root -g root -Dm755 -t "$TARGET/etc/init.d" \
|
|
||||||
"$SETUP/eth-eni-setup"
|
|
||||||
}
|
|
||||||
|
|
||||||
enable_services() {
|
|
||||||
for lvl_svcs in $SVCS; do
|
|
||||||
rc_add $(echo "$lvl_svcs" | tr '=,' ' ')
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
create_alpine_user() {
|
|
||||||
# Allow members of the wheel group to sudo without a password. By default
|
|
||||||
# this will only be the alpine user. This allows us to ship an AMI that is
|
|
||||||
# accessible via SSH using the user's configured SSH keys (thanks to
|
|
||||||
# tiny-ec2-bootstrap) but does not allow remote root access which is the
|
|
||||||
# best-practice.
|
|
||||||
sed -i '/%wheel .* NOPASSWD: .*/s/^# //' "$TARGET/etc/sudoers"
|
|
||||||
|
|
||||||
# explicitly lock the root account
|
|
||||||
chroot "$TARGET" /usr/bin/passwd -l root
|
|
||||||
|
|
||||||
# There is no real standard ec2 username across AMIs, Amazon uses ec2-user
|
|
||||||
# for their Amazon Linux AMIs but Ubuntu uses ubuntu, Fedora uses fedora,
|
|
||||||
# etc... (see: https://alestic.com/2014/01/ec2-ssh-username/). So our user
|
|
||||||
# and group, by default, are alpine because this is Alpine Linux.
|
|
||||||
user="${EC2_USER:-alpine}"
|
|
||||||
chroot "$TARGET" /usr/sbin/addgroup "$user"
|
|
||||||
chroot "$TARGET" /usr/sbin/adduser -h "/home/$user" -s /bin/sh -G "$user" -D "$user"
|
|
||||||
chroot "$TARGET" /usr/sbin/addgroup "$user" wheel
|
|
||||||
chroot "$TARGET" /usr/bin/passwd -u "$user"
|
|
||||||
|
|
||||||
# Let tiny-ec2-bootstrap know what the EC2 user of the AMI is
|
|
||||||
echo "EC2_USER=$user" > "$TARGET/etc/conf.d/tiny-ec2-bootstrap"
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_ntp() {
|
|
||||||
# EC2 provides an instance-local NTP service syncronized with GPS and
|
|
||||||
# atomic clocks in-region. Prefer this over external NTP hosts when running
|
|
||||||
# in EC2.
|
|
||||||
#
|
|
||||||
# See: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html
|
|
||||||
sed -e 's/^pool /server /' \
|
|
||||||
-e 's/pool.ntp.org/169.254.169.123/g' \
|
|
||||||
-i "$TARGET/etc/chrony/chrony.conf"
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_script() {
|
|
||||||
if [ -f "$SETUP/setup_script" ]; then
|
|
||||||
einfo "Executing additional setup script"
|
|
||||||
(
|
|
||||||
cd "$SETUP"
|
|
||||||
chmod u+x ./setup_script
|
|
||||||
TARGET="$TARGET" ./setup_script
|
|
||||||
)
|
|
||||||
else
|
|
||||||
einfo "No additional setup script"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup() {
|
|
||||||
# Sweep cruft out of the image that doesn't need to ship or will be
|
|
||||||
# re-generated when the image boots
|
|
||||||
rm -f \
|
|
||||||
"$TARGET/var/cache/apk/"* \
|
|
||||||
"$TARGET/etc/resolv.conf" \
|
|
||||||
"$TARGET/root/.ash_history" \
|
|
||||||
"$TARGET/etc/"*-
|
|
||||||
|
|
||||||
# unmount extra EFI mount
|
|
||||||
if [ "$BOOTLOADER" = grub-efi ] || [ "$BOOTLOADER" = EFI_STUB ]; then
|
|
||||||
umount "$TARGET/boot/efi"
|
|
||||||
fi
|
|
||||||
|
|
||||||
umount \
|
|
||||||
"$TARGET/dev" \
|
|
||||||
"$TARGET/proc" \
|
|
||||||
"$TARGET/sys"
|
|
||||||
|
|
||||||
umount "$TARGET"
|
|
||||||
}
|
|
||||||
|
|
||||||
main() {
|
|
||||||
validate_block_device
|
|
||||||
|
|
||||||
[ -d "$TARGET" ] || mkdir "$TARGET"
|
|
||||||
|
|
||||||
einfo "Fetching static APK tools"
|
|
||||||
apk="$(fetch_apk_tools)"
|
|
||||||
|
|
||||||
einfo "Creating root filesystem"
|
|
||||||
make_filesystem
|
|
||||||
|
|
||||||
einfo "Configuring Alpine repositories"
|
|
||||||
setup_repositories
|
|
||||||
|
|
||||||
einfo "Fetching Alpine signing keys"
|
|
||||||
fetch_keys
|
|
||||||
|
|
||||||
einfo "Installing base system"
|
|
||||||
install_base
|
|
||||||
|
|
||||||
setup_chroot
|
|
||||||
|
|
||||||
einfo "Installing core packages"
|
|
||||||
install_core_packages
|
|
||||||
|
|
||||||
einfo "Configuring and enabling '$BOOTLOADER' boot loader"
|
|
||||||
create_initfs
|
|
||||||
install_bootloader
|
|
||||||
|
|
||||||
einfo "Configuring system"
|
|
||||||
setup_mdev
|
|
||||||
setup_fstab
|
|
||||||
setup_networking
|
|
||||||
enable_services
|
|
||||||
create_alpine_user
|
|
||||||
configure_ntp
|
|
||||||
|
|
||||||
setup_script
|
|
||||||
|
|
||||||
einfo "All done, cleaning up"
|
|
||||||
cleanup
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
@ -1,16 +0,0 @@
|
|||||||
#!/sbin/openrc-run
|
|
||||||
|
|
||||||
description="Sets up interfaces for attached Elastic Network Interfaces"
|
|
||||||
|
|
||||||
depend() {
|
|
||||||
before net
|
|
||||||
need sysfs
|
|
||||||
}
|
|
||||||
|
|
||||||
start() {
|
|
||||||
local iface
|
|
||||||
|
|
||||||
ebegin "Setting up interfaces for attached ENIs"
|
|
||||||
/etc/network/assemble-interfaces
|
|
||||||
eend "$?"
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
[ -x /usr/sbin/nvme ] || exit
|
|
||||||
|
|
||||||
PROC="$(basename "$0")[$$]"
|
|
||||||
|
|
||||||
log() {
|
|
||||||
FACILITY="kern.$1"
|
|
||||||
shift
|
|
||||||
logger -s -p "$FACILITY" -t "$PROC" "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
raw_ebs_alias() {
|
|
||||||
/usr/sbin/nvme id-ctrl "/dev/$BASE" -b 2>/dev/null | dd bs=32 skip=96 count=1 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
case $ACTION in
|
|
||||||
add|"")
|
|
||||||
BASE=$(echo "$MDEV" | sed -re 's/^(nvme[0-9]+n[0-9]+).*/\1/')
|
|
||||||
PART=$(echo "$MDEV" | sed -re 's/nvme[0-9]+n[0-9]+p?//g')
|
|
||||||
MAXTRY=50
|
|
||||||
TRY=0
|
|
||||||
until [ -n "$EBS" ]; do
|
|
||||||
EBS=$(raw_ebs_alias | sed -nre '/^(\/dev\/)?(s|xv)d[a-z]{1,2} /p' | tr -d ' ')
|
|
||||||
[ -n "$EBS" ] && break
|
|
||||||
TRY=$((TRY + 1))
|
|
||||||
if [ $TRY -eq $MAXTRY ]; then
|
|
||||||
log err "Failed to get EBS volume alias for $MDEV after $MAXTRY attempts ($(raw_ebs_alias))"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
sleep 0.1
|
|
||||||
done
|
|
||||||
# remove any leading '/dev/', 'sd', or 'xvd', and append partition
|
|
||||||
EBS=${EBS#/dev/}
|
|
||||||
EBS=${EBS#sd}
|
|
||||||
EBS=${EBS#xvd}$PART
|
|
||||||
ln -sf "$MDEV" "sd$EBS" && log notice "Added sd$EBS symlink for $MDEV"
|
|
||||||
ln -sf "$MDEV" "xvd$EBS" && log notice "Added xvd$EBS symlink for $MDEV"
|
|
||||||
;;
|
|
||||||
remove)
|
|
||||||
for TARGET in sd* xvd*
|
|
||||||
do
|
|
||||||
[ "$(readlink "$TARGET" 2>/dev/null)" = "$MDEV" ] && rm -f "$TARGET" && log notice "Removed $TARGET symlink for $MDEV"
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
esac
|
|
67
scripts/setup-tiny
Executable file
67
scripts/setup-tiny
Executable file
@ -0,0 +1,67 @@
|
|||||||
|
#!/bin/sh -eu
|
||||||
|
# vim: ts=4 et:
|
||||||
|
|
||||||
|
# NOTE: This is lifted almost verbatim from alpine-ec2-ami's setup-ami script
|
||||||
|
# While refactoring that, it became apparent that these bits really belonged
|
||||||
|
# to the tiny-ec2-bootstrap package, and in order to also provide a
|
||||||
|
# "cloud-init" image flavor, we needed separate these parts out.
|
||||||
|
#
|
||||||
|
# It is our intention to eventually incorporate this in a tiny-cloud-bootstrap
|
||||||
|
# package (and per-cloud subpackages).
|
||||||
|
|
||||||
|
[ -z "$DEBUG" -o "$DEBUG" = 0 ] || set -x
|
||||||
|
|
||||||
|
TARGET=/mnt
|
||||||
|
SETUP=/tmp/setup-tiny.d
|
||||||
|
|
||||||
|
die() {
|
||||||
|
printf '\033[1;7;31m FATAL: %s \033[0m\n' "$@" >&2 # bold reversed red
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
einfo() {
|
||||||
|
printf '\n\033[1;7;36m> %s <\033[0m\n' "$@" >&2 # bold reversed cyan
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_mdev() {
|
||||||
|
echo " * Setting up mdev"
|
||||||
|
install -o root -g root -Dm755 -t "$TARGET/lib/mdev" \
|
||||||
|
"$SETUP/nvme-ebs-links" \
|
||||||
|
"$SETUP/eth-eni-hotplug"
|
||||||
|
|
||||||
|
# insert nvme ebs mdev configs just above "# fallback" comment
|
||||||
|
sed -n -i \
|
||||||
|
-e "/# fallback/r $SETUP/mdev-ec2.conf" \
|
||||||
|
-e 1x -e '2,${x;p}' -e '${x;p}' \
|
||||||
|
"$TARGET/etc/mdev.conf"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_networking() {
|
||||||
|
echo " * Setting up networking"
|
||||||
|
# configure standard interfaces
|
||||||
|
IFACE_CFG="$TARGET/etc/network/interfaces"
|
||||||
|
install -o root -g root -Dm755 -d "$SETUP/interfaces.d" "$IFACE_CFG.d"
|
||||||
|
install -o root -g root -Dm644 -t "$IFACE_CFG.d" \
|
||||||
|
"$SETUP/interfaces.d/"*
|
||||||
|
cat "$IFACE_CFG.d/lo" "$IFACE_CFG.d/eth0" > "$IFACE_CFG"
|
||||||
|
|
||||||
|
install -o root -g root -Dm755 -t "$TARGET/etc/network" \
|
||||||
|
"$SETUP/assemble-interfaces"
|
||||||
|
|
||||||
|
# install ucdhcp hooks for EC2 ENI IPv6 and secondary IPv4
|
||||||
|
install -o root -g root -Dm755 -t "$TARGET/usr/share/udhcpc" \
|
||||||
|
"$SETUP/eth-eni-hook"
|
||||||
|
for i in post-bound post-renew; do
|
||||||
|
mkdir -p "$TARGET/etc/udhcpc/$i"
|
||||||
|
ln -sf /usr/share/udhcpc/eth-eni-hook \
|
||||||
|
"$TARGET/etc/udhcpc/$i"
|
||||||
|
done
|
||||||
|
|
||||||
|
# install ENI interface setup init script
|
||||||
|
install -o root -g root -Dm755 -t "$TARGET/etc/init.d" \
|
||||||
|
"$SETUP/eth-eni-setup"
|
||||||
|
}
|
||||||
|
|
||||||
|
einfo "Installing up tiny bootstrap components..."
|
||||||
|
setup_mdev
|
||||||
|
setup_networking
|
||||||
|
echo "EC2_USER=$IMAGE_LOGIN" > "$TARGET/etc/conf.d/tiny-ec2-bootstrap"
|
19
scripts/setup-tiny.d/eth-eni-setup
Executable file
19
scripts/setup-tiny.d/eth-eni-setup
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/sbin/openrc-run
|
||||||
|
|
||||||
|
# vim: set ts=4 et:
|
||||||
|
# shellcheck shell=sh
|
||||||
|
|
||||||
|
description="Sets up interfaces for attached Elastic Network Interfaces"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
before net
|
||||||
|
need sysfs
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
local iface
|
||||||
|
|
||||||
|
ebegin "Setting up interfaces for attached ENIs"
|
||||||
|
/etc/network/assemble-interfaces
|
||||||
|
eend "$?"
|
||||||
|
}
|
47
scripts/setup-tiny.d/nvme-ebs-links
Executable file
47
scripts/setup-tiny.d/nvme-ebs-links
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# vim: set ts=4 et:
|
||||||
|
|
||||||
|
[ -x /usr/sbin/nvme ] || exit
|
||||||
|
|
||||||
|
PROC="$(basename "$0")[$$]"
|
||||||
|
|
||||||
|
log() {
|
||||||
|
FACILITY="kern.$1"
|
||||||
|
shift
|
||||||
|
logger -s -p "$FACILITY" -t "$PROC" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
raw_ebs_alias() {
|
||||||
|
/usr/sbin/nvme id-ctrl "/dev/$BASE" -b 2>/dev/null | dd bs=32 skip=96 count=1 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
case $ACTION in
|
||||||
|
add|"")
|
||||||
|
BASE=$(echo "$MDEV" | sed -re 's/^(nvme[0-9]+n[0-9]+).*/\1/')
|
||||||
|
PART=$(echo "$MDEV" | sed -re 's/nvme[0-9]+n[0-9]+p?//g')
|
||||||
|
MAXTRY=50
|
||||||
|
TRY=0
|
||||||
|
until [ -n "$EBS" ]; do
|
||||||
|
EBS=$(raw_ebs_alias | sed -nre '/^(\/dev\/)?(s|xv)d[a-z]{1,2} /p' | tr -d ' ')
|
||||||
|
[ -n "$EBS" ] && break
|
||||||
|
TRY=$((TRY + 1))
|
||||||
|
if [ $TRY -eq $MAXTRY ]; then
|
||||||
|
log err "Failed to get EBS volume alias for $MDEV after $MAXTRY attempts ($(raw_ebs_alias))"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
# remove any leading '/dev/', 'sd', or 'xvd', and append partition
|
||||||
|
EBS=${EBS#/dev/}
|
||||||
|
EBS=${EBS#sd}
|
||||||
|
EBS=${EBS#xvd}$PART
|
||||||
|
ln -sf "$MDEV" "sd$EBS" && log notice "Added sd$EBS symlink for $MDEV"
|
||||||
|
ln -sf "$MDEV" "xvd$EBS" && log notice "Added xvd$EBS symlink for $MDEV"
|
||||||
|
;;
|
||||||
|
remove)
|
||||||
|
for TARGET in sd* xvd*
|
||||||
|
do
|
||||||
|
[ "$(readlink "$TARGET" 2>/dev/null)" = "$MDEV" ] && rm -f "$TARGET" && log notice "Removed $TARGET symlink for $MDEV"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
@ -1,5 +1,5 @@
|
|||||||
GRUB_TIMEOUT=0
|
GRUB_CMDLINE_LINUX_DEFAULT="modules=$KERNEL_MODULES $KERNEL_OPTIONS"
|
||||||
GRUB_DISABLE_SUBMENU=y
|
|
||||||
GRUB_DISABLE_RECOVERY=true
|
GRUB_DISABLE_RECOVERY=true
|
||||||
|
GRUB_DISABLE_SUBMENU=y
|
||||||
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
|
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
|
||||||
GRUB_CMDLINE_LINUX_DEFAULT="modules=$KERNEL_MODS $KERNEL_OPTS"
|
GRUB_TIMEOUT=0
|
@ -1,12 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
# copy a directory into place
|
|
||||||
cp -a ./base "$TARGET/home/$EC2_USER/test"
|
|
||||||
|
|
||||||
# process a file and put it into place
|
|
||||||
tac ./aarch64 | rev > "$TARGET/home/$EC2_USER/test/46hcraa"
|
|
||||||
|
|
||||||
# set ownership of installed things
|
|
||||||
chroot "$TARGET" chown -R "$EC2_USER:$EC2_USER" "/home/$EC2_USER/test"
|
|
Loading…
Reference in New Issue
Block a user