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
|
@ -1,4 +1,5 @@
|
|||
**/*~
|
||||
**/*.bak
|
||||
**/*.swp
|
||||
/build/
|
||||
*~
|
||||
*.bak
|
||||
*.swp
|
||||
.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
|
||||
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
|
||||
[Alpine Website](https://alpinelinux.org/cloud/).
|
||||
_It is intended that this will eventually replace
|
||||
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
|
||||
https://alpinelinux.org/cloud, or the [README](releases/README.md) in the
|
||||
[releases](releases) subdirectory of this repo.***
|
||||
# Alpine Linux Cloud Image Builder
|
||||
|
||||
Alternately, with the right filters, you can query the EC2 API to programmatically
|
||||
find our most recent AMIs. For example, using the `aws` command line tool...
|
||||
```
|
||||
aws ec2 describe-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.
|
||||
This repository contains the code and and configs for the build system used to
|
||||
create official Alpine Linux images for various cloud providers, in various
|
||||
configurations. This build system is flexible, enabling others to build their
|
||||
own customized images.
|
||||
|
||||
## Custom AMIs
|
||||
----
|
||||
## Pre-Built Offical Cloud Images
|
||||
|
||||
Using the scripts and configuration in this project, you can build your own
|
||||
custom Alpine Linux AMIs. If you experience any problems building custom AMIs,
|
||||
please open an [issue](https://github.com/mcrute/alpine-ec2-ami/issues) and
|
||||
include as much detailed information as possible.
|
||||
To get started with offical pre-built Alpine Linux cloud images, visit
|
||||
https://alpinelinux.org/cloud. Currently, we build official images for the
|
||||
following providers:
|
||||
* 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
|
||||
* [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
|
||||
* [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
|
||||
### Cloud Credentials
|
||||
|
||||
### 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,
|
||||
where you will also find the [config](profiles/alpine.conf) we use for our
|
||||
pre-built AMIs. Refer to the [README](profiles/README.md) in that subdirectory
|
||||
for more details and information about how AMI profile configs work.
|
||||
It is expected that each cloud provider's user/role will have been set up with
|
||||
sufficient permission in order to accomplish the operations necessary to query,
|
||||
import, and publish images; _it is highly recommended that no permissions are
|
||||
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:
|
||||
```
|
||||
./scripts/builder.py amis <profile> <build1> <build2> ...
|
||||
```
|
||||
A `work/` directory will be created for its Python virtual environment, any
|
||||
necessary Python libraries will be `pip install`ed, and `build` will execute
|
||||
itself to ensure that it's running in the work environment.
|
||||
|
||||
Before each build, new Alpine Linux *releases* are detected and the version's
|
||||
core profile is updated.
|
||||
This directory also contains `configs/` and `scripts/` subdirs (with custom
|
||||
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
|
||||
will be skipped and the process moves on to build the other profile's build
|
||||
targets (if any).
|
||||
Use `--clean` if you want to re-overlay, re-download, re-generate, or rebuild
|
||||
anything in the `work/` directory. To redo the Python virtual environment,
|
||||
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's details, including (most importantly) the ids of the AMI artifacts that
|
||||
were built.
|
||||
### Build Steps
|
||||
|
||||
Additional information about using your custom AMIs can be found in the
|
||||
[README](releases/README.md) in the [releases](releases) subdirectory.
|
||||
When executing `build` you also provide the target step you wish to reach. For
|
||||
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
|
||||
your profile's `releases/<profile>.yaml`. There are three different levels of
|
||||
pruning:
|
||||
* `revision` - keep only the latest revision for each release
|
||||
* `release` - keep only the latest release for each version
|
||||
* `end-of-life` - remove any end-of-life versions
|
||||
If `build` is moving on past **configs** to other steps, it will determine which
|
||||
image variants to work on (based on `--skip` and `--only` values) and what
|
||||
actions will be taken, based on existence of local/imported/published images, and
|
||||
generate the `actions.yaml` file. Providing the `--revise` flag allows you to
|
||||
rebuild local images that were previously built, reimport unpublished images to
|
||||
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)...
|
||||
```
|
||||
./scripts/builder.py prune-amis <profile> [<build>]
|
||||
```
|
||||
At this point, `build` executes Packer, which is responsible for the remaining
|
||||
**local**, **import**, and **publish** steps -- and also for parallelization, if
|
||||
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
|
||||
for updating the list of our pre-built AMIs. This may-or-may-not be useful for
|
||||
other target profiles.
|
||||
```
|
||||
./scripts/builder.py gen-release-readme <profile>
|
||||
```
|
||||
Packer loads and merges `actions.yaml` and `configs.yaml`, and iterates the
|
||||
resulting object in order to determine what it should do with each image
|
||||
variant configuration.
|
||||
|
||||
### 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`
|
||||
subdirectory. Remove the temporary `build` subdirectory, which contains the
|
||||
resolved profile and Packer configs, the Python virtual environment, and other
|
||||
temporary build-related artifacts.
|
||||
The `qemu` builder spins up a QEMU virtual machine with a blank virtual disk
|
||||
attached, using the latest stable Alpine Linux Virtual ISO, brings up the VM's
|
||||
network, enables the SSH daemon, and sets a random password for root.
|
||||
|
||||
## 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
|
||||
core version profile; this process is, at the moment, still a manual task.
|
||||
The dynamic post-processor uses the `cloud_helper.py` script to **import** a
|
||||
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"
|
||||
}
|
||||
]
|
||||
```
|
|
@ -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)
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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],
|
||||
]
|
|
@ -0,0 +1,5 @@
|
|||
# vim: ts=2 et:
|
||||
name = [x86_64]
|
||||
|
||||
qemu.machine_type = null
|
||||
qemu.args = null
|
|
@ -0,0 +1,2 @@
|
|||
# vim: ts=2 et:
|
||||
name = [cloudinit]
|
|
@ -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 ]
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
# vim: ts=2 et:
|
||||
builder = qemu
|
|
@ -0,0 +1 @@
|
|||
alpine.conf
|
|
@ -0,0 +1,8 @@
|
|||
# vim: ts=2 et:
|
||||
name = [bios]
|
||||
|
||||
packages {
|
||||
syslinux = --no-scripts
|
||||
}
|
||||
|
||||
qemu.firmware = null
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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 ]
|
|
@ -0,0 +1,5 @@
|
|||
# vim: ts=2 et:
|
||||
|
||||
include required("base/1.conf")
|
||||
|
||||
end_of_life = "2022-05-01"
|
|
@ -0,0 +1,5 @@
|
|||
# vim: ts=2 et:
|
||||
|
||||
include required("base/2.conf")
|
||||
|
||||
end_of_life = "2022-11-01"
|
|
@ -0,0 +1,5 @@
|
|||
# vim: ts=2 et:
|
||||
|
||||
include required("base/2.conf")
|
||||
|
||||
end_of_life = "2023-05-01"
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
# vim: ts=2 et:
|
||||
|
||||
include required("2.conf")
|
||||
|
||||
packages {
|
||||
# doas replaces sudo
|
||||
sudo = null
|
||||
doas = true
|
||||
}
|
|
@ -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
|
@ -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!"
|
|
@ -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
|
|
@ -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"
|
|
@ -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 "$?"
|
||||
}
|
|
@ -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_DISABLE_SUBMENU=y
|
||||
GRUB_CMDLINE_LINUX_DEFAULT="modules=$KERNEL_MODULES $KERNEL_OPTIONS"
|
||||
GRUB_DISABLE_RECOVERY=true
|
||||
GRUB_DISABLE_SUBMENU=y
|
||||
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