Gabriel Pastor - écriture et techno

Héberger son podcast chez Amazon Web Services

2020-07-15, tech, s3, hosting

Introduction

Pour la mise en place de mon podcast Livres à vif, j'ai choisi de tout héberger moi-même et de maîtriser complètement la chaîne.

Les fichiers audio sont hébergés dans Amazon S3. Le serveur web est aussi sur s3 pour la partie hébergement et j'ai mis en place Amazon Cloudfront pour bénéficier du HTTPS

Gestion du serveur web basé sur S3

Création d'un bucket dédié à l'hébergement des fichiers audio

# Création du bucket amazon
aws s3 mb s3://audio-bucket-livresavif

# Gestion des logs
aws s3api put-bucket-acl --bucket audio-bucket-livresavif
--grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery 
--grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
		

# Apply log policy
aws s3api put-bucket-logging --bucket audio-bucket-livresavif 
 --bucket-logging-status file://wwwlogconfig.json
more wwwlogconfig.json
{
	"LoggingEnabled": {
   	 	"TargetBucket": "logs-livresavif",
       	"TargetPrefix": "log"
	}
}

# Add website configuration
more website.json
{
    "IndexDocument": {
        "Suffix": "index.html"
    },
    "ErrorDocument": {
        "Key": "error.html"
    }
}

# Cela active le serveur web associé à ce bucket S3
aws s3api put-bucket-website --bucket audio-bucket-livresavif 
 --website-configuration file://website.json

# Control access by adding a policy
aws s3api put-bucket-policy --bucket audio-bucket-livresavif --policy file://policy.json

policy.json:
{
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": "*",
         "Action": "s3:GetObject",
         "Resource": "arn:aws:s3:::audio-bucket-livresavif/*"
      }
   ]
}

# Création d'un fichier index.html pour le serveur web du "audio bucket"
$ more index.html
<html>
<head meta http-equiv="refresh" content="0;url=http://www.livresavif.com/"></head>
</html>

		

Cloudfront

Cloudfront sert de cache pour les requêtes mais je l'utilise uniquement car c'est le seul moyen d'activer HTTPS. J'ai globalement suivi le tutoriel : https://medium.com/@brodartec/hosting-a-static-site-with-https-enabled-using-aws-s3-cloudfront-and-godaddy-826dae41fdc6

Création d'un certificat

J'ai créé un certificat avec AWS certificate manager. Attention par défaut j'étais positionné dans Amazon sur la région Paris. Il faut impérativement être sur la région N. Virginia quand on crée un certificat, sinon il ne sera pas visible de cloudfront lorsqu'on va créer la distribution cloufront.

La migration du certificat est impossible à postériori comme expliqué ici : How do I migrate my SSL certificate to the US East (N. Virginia) Region?

Il faut faire un certificat pour le domaine www.livresavif.com et pour livresavif.com.

  • Get started
  • Request a public certificate
  • saisir les noms de domaines, dans mon cas www.livresavif.com et livresavif.com
  • DNS validation
  • Noter l'entrée CNAME à créer au niveau de l'enregistrement DNS

J'ai validé la création des certificats en créant une entrée DNS chez Gandi auprès de qui j'ai souscrit au nom de domaine. Il faut chez gandi, choisir son nom de domaine et aller dans Enregistrements DNS

Il faut attendre quelques minutes que le certificat passe en statut Issued

Création d'une distribution cloudfront

Créer une distribution qui a pour origine le bucket S3 initial

  • Web - Get started
  • Origin domain name : Ne pas sélectionner le bucket ! Il faut le modifier pour récupérer la valeur indiquée dans s3, bucket properties> static website hosting> endpoint : du style mybucket.s3-website.eu-west-3.amazonaws.com.
  • alternate domain names :dans mon cas www.livresavif.com et livresavif.com
  • custom SSL/li>
  • Cliquer sur le champ vide et si le certificat a bien été créé dans la régino N. Virginia il sera proposé ici
Note : Pour Origin domain name, l'intérêt de donner le endpoint au lieu du nom de bucket est qu'on va pouvoir utiliser des url du style livresavif.com/sousdomaine/ sans avoir besoin de préciser index.html. Car comme indiqué dans la documentation cloudfront le mécanisme dit du RootObject ne fonctionne pour Cloudfront qu'à la racine du site, alors que le cela fonctionne aussi avec les sous répertoires dans S3.

Pour la gestion des erreurs

Gestion du DNS

Il faut maintenant au niveau DNS associer l'url cloudfront à mon nom de domaine. Récupérer l'url cloudfront

Puis créer une entrée de type ALIAS pour la partie livresavif.com sans rien devant et une entrée CNAME pour la partie www.livresavif.com. J'ai du supprimer au préalable le record A existant.