Fornitura di Fedora CoreOS su Amazon Web Services

Questa guida mostra come effettuare il provisioning di nuove istanze Fedora CoreOS (FCOS) sulla piattaforma cloud di Amazon Web Services (AWS).

Prerequisiti

Prima di configurare una macchina FCOS, è necessario avere un file di configurazione Ignition con le proprie personalizzazioni. Se non ne hai uno, consulta Produzione di un File Ignition.

Fedora CoreOS dispone di un utente predefinito core che può essere utilizzato per esplorare il sistema operativo. Se desideri utilizzarlo, completa la sua configurazione fornendo, ad esempio, una chiave SSH.

Se non desideri utilizzare Ignition per iniziare, puoi sfruttare il supporto offerto da Afterburn.

Devi anche avere accesso a un account AWS. Gli esempi seguenti utilizzano lo strumento da riga di comando aws, che deve essere installato e configurato separatamente in anticipo.

Avvio di un’istanza VM

Esempio minimale

Nuove istanze AWS possono essere create direttamente dalle immagini pubbliche di FCOS. Puoi trovare l’AMI più recente per ciascuna regione dalla [pagina di download](https://fedoraproject.org/coreos/download/).

Se sei interessato solo a esplorare FCOS senza ulteriori personalizzazioni, puoi utilizzare una [coppia di chiavi SSH registrata](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html) per l’utente predefinito core.

Per testare FCOS in questo modo, dovrai eseguire il comando aws ec2 run-instances e fornire alcune informazioni per avviare l’istanza. Ecco un esempio di comando che puoi utilizzare:

Avvio di una nuova istanza
# Nome dell'istanza
NAME='instance1'

# Nome della tua chiave SSH (verifica con: `aws ec2 describe-key-pairs`)
SSHKEY='my-key'

# ID dell'AMI (può essere trovato nella pagina di download di Fedora CoreOS o altra immagine)
IMAGE='ami-xxx'

# Dimensione del disco in GB
DISK='20'

# Regione AWS di destinazione
REGION='us-east-1'

# Tipo di istanza (es. t3.micro, m5.large, ecc.)
TYPE='m5.large'

# ID della subnet (verifica con: `aws ec2 describe-subnets`)
SUBNET='subnet-xxx'

# Gruppi di sicurezza (verifica con: `aws ec2 describe-security
Puoi scoprire l’indirizzo IP assegnato all’istanza eseguendo aws ec2 describe-instances

Ora dovresti poter effettuare l’accesso SSH all’istanza utilizzando l’indirizzo IP associato.

Esempio di connessione
ssh core@<indirizzo ip>

Esempio Personalizzato

Per avviare un’istanza FCOS personalizzata, è necessario passare una configurazione Ignition valida come suoi user data al momento della creazione. Puoi utilizzare lo stesso comando della [_minimal_example] ma aggiungere l’argomento --user-data file://path/to/config.ign:

In questo esempio, la chiave SSH per l’utente core viene fornita tramite Afterburn.
Avvio e personalizzazione di una nuova istanza
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-xx' # the security group `aws ec2 describe-security-groups`
USERDATA='/path/to/config.ign' # path to your Ignition config
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}}"
Per progettazione, la configurazione cloud-init e gli script di avvio non sono supportati su FCOS. Invece, si consiglia di codificare qualsiasi logica di avvio come unità di servizio systemd nella configurazione Ignition.
Puoi scoprire l’indirizzo IP assegnato all’istanza eseguendo aws ec2 describe-instances

Ora dovresti poter effettuare l’accesso SSH all’istanza utilizzando l’indirizzo IP associato.

Esempio di connessione
ssh core@<indirizzo ip>

Configurazione Ignition remota

Poiché user-data è limitato a 16 KB, potrebbe essere necessario utilizzare una fonte esterna per la configurazione Ignition. Una soluzione comune è caricare la configurazione in un bucket S3, come mostrano i seguenti passaggi:

Crea un nuovo bucket s3
NAME='instance1'
aws s3 mb s3://$NAME-infra
Carica il file Ignition
NAME='instance1'
CONFIG='/path/to/config.ign' # path to your Ignition config
aws s3 cp $CONFIG s3://$NAME-infra/bootstrap.ign

Puoi verificare che il file sia stato caricato correttamente:

Elenca i file nel bucket
NAME='instance1'
aws s3 ls s3://$NAME-infra/

Quindi crea una configurazione Ignition minima come segue:

Recupero di un file Ignition remoto da un bucket s3
variant: fcos
version: 1.6.0
ignition:
  config:
    replace:
      source: s3://instance1-infra/bootstrap.ign
Formatta il file Ignition remoto in formato json
butane -p config.bu -o config.ign

Devi creare un ruolo che includa il permesso s3:GetObject e allegarlo al profilo dell’istanza. Vedi documento di creazione dei ruoli per ulteriori informazioni.

Crea il profilo dell’istanza
cat <<EOF >trustpolicyforec2.json
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Principal": {"Service": "ec2.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }
}
EOF

# Crea il ruolo e allega la policy di trust che consente a EC2 di assumere questo ruolo.
ROLE_NAME="my-role"
aws iam create-role --role-name ${ROLE_NAME} --assume-role-policy-document file://trustpolicyforec2.json.

# Allega la politica gestita di AWS denominata AmazonS3ReadOnlyAccess al ruolo
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess --role-name ${ROLE_NAME}

# Crea il profilo dell'istanza richiesto da EC2 per contenere il ruolo
PROFILE="my-instance-profile"
aws iam create-instance-profile --instance-profile-name ${PROFILE}

# Infine, aggiungi il ruolo al profilo dell'istanza
aws iam add-role-to-instance-profile --instance-profile-name ${PROFILE} --role-name ${ROLE_NAME}

Per avviare l’istanza, è necessario allegare il profilo creato. Dalla riga di comando, usa --iam-instance-profile.

Avvio e personalizzazione di una nuova istanza con file Ignition remoto da un bucket S3
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}}"

Una volta completato il primo avvio, assicurati di eliminare la configurazione poiché potrebbe contenere dati sensibili. Vedi [_configuration_cleanup].

Pulizia della configurazione

Se hai bisogno di avere segreti nella tua configurazione Ignition, dovresti memorizzarli in un bucket S3 e avere una configurazione minima in user-data. Una volta che l’istanza ha completato il primo avvio, svuota il bucket S3 in quanto qualsiasi processo o container in esecuzione sull’istanza potrebbe accedervi. Vedi la documentazione di Ignition per ulteriori consigli sulla gestione dei segreti.

Eliminazione della configurazione Ignition dal bucket s3
NAME='instance1'
aws s3 rm s3://$NAME-infra/bootstrap.ign

Opzionalmente, puoi eliminare l’intero bucket:

Eliminazione del bucket s3
NAME='instance1'
aws s3 rb s3://$NAME-infra
Gli user data dell’istanza non possono essere modificati senza fermare l’istanza.