Provisionando Fedora CoreOS no Amazon Web Services

Este guia mostra como provisionar novas instâncias do Fedora CoreOS (FCOS) na plataforma de nuvem Amazon Web Services (AWS).

Pré-requisitos

Antes de provisionar uma máquina FCOS, você deve ter um arquivo de configuração do Ignition contendo suas personalizações. Se você não tiver um, consulte Produzindo um arquivo de Ignition.

Fedora CoreOS tem um usuário padrão core que pode ser usado para explorar o sistema operacional. Se você quiser usá-lo, finalize sua configuração fornecendo, por exemplo, uma chave SSH.

Se você não quiser usar o Ignition para começar, você pode usar o suporte ao Afterburn.

Você também precisa ter acesso a uma conta AWS. Os exemplos abaixo usam a ferramenta de linha de comando aws, que deve ser instalada separadamente e configurada de antemão.

Iniciando uma instância de VM

Exemplo mínimo

Novas instâncias da AWS podem ser criadas diretamente a partir de imagens públicas do FCOS. Você pode encontrar a AMI mais recente para cada região na página de download.

Se você estiver interessado apenas em explorar FCOS sem personalização adicional, pode usar um par de chaves SSH registrado para o usuário padrão core.

Para testar o FCOS dessa forma, você precisará executar o comando aws ec2 run-instances e fornecer algumas informações para colocar a instância em funcionamento. A seguir está um exemplo de comando que você pode usar:

Iniciando uma nova instância
NAME='instance1'
SSHKEY='my-key'     # o nome da sua chave SSH: `aws ec2 describe-key-pairs`
IMAGE='ami-xxx'     # o ID da AMI encontrada na página de download
DISK='20'           # o tamanho do disco
REGION='us-east-1'  # a região alvo
TYPE='m5.large'     # o tipo da instância
SUBNET='subnet-xxx' # a sub-rede: `aws ec2 describe-subnets`
SECURITY_GROUPS='sg-xx' # o grupo de segurança `aws ec2 describe-security-groups`
aws ec2 run-instances                     \
    --region $REGION                      \
    --image-id $IMAGE                     \
    --instance-type $TYPE                 \
    --key-name $SSHKEY                    \
    --subnet-id $SUBNET                   \
    --security-group-ids $SECURITY_GROUPS \
    --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=${NAME}}]" \
    --block-device-mappings "VirtualName=/dev/xvda,DeviceName=/dev/xvda,Ebs={VolumeSize=${DISK}}"
Você pode descobrir o IP atribuído à instância executando aws ec2 describe-instances

Agora você deve conseguir fazer SSH na instância usando o endereço IP associado.

Exemplo de conexão
ssh core@<endereço ip>

Exemplo personalizado

Para iniciar uma instância FCOS personalizada, uma configuração válida do Ignition deve ser passada como https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-add-user- data[dados do usuário] no momento da criação. Você pode usar o mesmo comando de [_minimal_example], mas adicionar o argumento --user-data file://caminho/para/config.ign:

A chave SSH para o usuário core também é fornecida via Afterburn neste exemplo.
Iniciando e personalizando uma nova instância
NAME='instância1'
SSHKEY='minha-chave' # o nome de sua chave SSH: `aws ec2 describe-key-pairs`
IMAGE='ami-xxx'      # O ID da AMI encontrado na página de downloads
DISK='20'            # o tamanho do disco rígido
REGION='us-east-1'   # a região alvo
TYPE='m5.large'      # o tipo da instância
SUBNET='subnet-xxx'  # a sub-rede: `aws ec2 describe-subnets`
SECURITY_GROUPS='sg-xx' # o grupo de segurança `aws ec2 describe-security-groups`
USERDATA='/path/to/config.ign' # caminho para sua configuração do Ignition
aws ec2 run-instances                     \
    --region $REGION                      \
    --image-id $IMAGE                     \
    --instance-type $TYPE                 \
    --key-name $SSHKEY                    \
    --subnet-id $SUBNET                   \
    --security-group-ids $SECURITY_GROUPS \
    --user-data "file://${USERDATA}"      \
    --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=${NAME}}]" \
    --block-device-mappings "VirtualName=/dev/xvda,DeviceName=/dev/xvda,Ebs={VolumeSize=${DISK}}"
Por design, a configuração de inicialização em nuvem e os scripts de inicialização não são suportados no FCOS. Em vez disso, é recomendável codificar qualquer lógica de inicialização como unidades de serviço do systemd na configuração do Ignition.
Você pode descobrir o IP atribuído à instância executando aws ec2 describe-instances

Agora você deve conseguir fazer SSH na instância usando o endereço IP associado.

Exemplo de conexão
ssh core@<endereço ip>

Configuração remota do Ignition

Como dados de usuários são limitados a 16KB, você pode precisar usar uma fonte externa para sua configuração do Ignition. Uma solução comum é carregar a configuração para um bucket S3, como mostram os passos abaixo:

Create a new s3 bucket
NAME='instance1'
aws s3 mb s3://$NAME-infra
Upload the Ignition file
NAME='instance1'
CONFIG='/path/to/config.ign' # path to your Ignition config
aws s3 cp $CONFIG s3://$NAME-infra/bootstrap.ign

You can verify the file have been correctly uploaded:

List files in the bucket
NAME='instance1'
aws s3 ls s3://$NAME-infra/

Then create a minimal Ignition config as follows:

Retrieving a remote Ignition file from a s3 bucket
variant: fcos
version: 1.5.0
ignition:
  config:
    replace:
      source: s3://instance1-infra/bootstrap.ign
Format the remote Ignition file to json format
butane -p config.bu -o config.ign

You need to create a role that includes s3:GetObject permission, and attach it to the instance profile. See role creation document for more information.

Create the instance profile
cat <<EOF >trustpolicyforec2.json
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Principal": {"Service": "ec2.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }
}
EOF

# Create the role and attach the trust policy that allows EC2 to assume this role.
ROLE_NAME="my-role"
aws iam create-role --role-name ${ROLE_NAME} --assume-role-policy-document file://trustpolicyforec2.json

# Attach the AWS managed policy named AmazonS3ReadOnlyAccess to the role
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess --role-name ${ROLE_NAME}

# Create the instance profile required by EC2 to contain the role
PROFILE="my-instance-profile"
aws iam create-instance-profile --instance-profile-name ${PROFILE}

# Finally, add the role to the instance profile
aws iam add-role-to-instance-profile --instance-profile-name ${PROFILE} --role-name ${ROLE_NAME}

To launch the instance, need to attach the created profile. From the command-line, use --iam-instance-profile.

Launching and customizing a new instance with remote Ignition file from a S3 bucket
NAME='instance1'
SSHKEY='my-key'          # the name of your SSH key: `aws ec2 describe-key-pairs`
IMAGE='ami-xxx'          # the AMI ID found on the download page
DISK='20'                # the size of the hard disk
REGION='us-east-1'       # the target region
TYPE='m5.large'          # the instance type
SUBNET='subnet-xxx'      # the subnet: `aws ec2 describe-subnets`
SECURITY_GROUPS='sg-xxx' # the security group `aws ec2 describe-security-groups`
USERDATA='/path/to/config.ign' # path to your Ignition config
PROFILE='xxx-profile'    # the name of an IAM instance profile `aws iam list-instance-profiles`
aws ec2 run-instances                     \
    --region $REGION                      \
    --image-id $IMAGE                     \
    --instance-type $TYPE                 \
    --key-name $SSHKEY                    \
    --subnet-id $SUBNET                   \
    --security-group-ids $SECURITY_GROUPS \
    --user-data "file://${USERDATA}"      \
    --iam-instance-profile Name=${PROFILE}     \
    --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=${NAME}}]" \
    --block-device-mappings "VirtualName=/dev/xvda,DeviceName=/dev/xvda,Ebs={VolumeSize=${DISK}}"

Once the first boot is completed, make sure to delete the configuration as it may contain sensitive data. See Configuration cleanup.

Configuration cleanup

If you need to have secrets in your Ignition configuration you should store it into a S3 bucket and have a minimal configuration in user-data. Once the instance has completed the first boot, clear the S3 bucket as any process or container running on the instance could access it. See the Ignition documentation for more advice on secret management.

Deleting the Ignition configuration from the s3 bucket
NAME='instance1'
aws s3 rm s3://$NAME-infra/bootstrap.ign

Optionnally, you can delete the whole bucket:

Deleting the s3 bucket
NAME='instance1'
aws s3 rb s3://$NAME-infra
The instance’s user data cannot be modified without stopping the instance.