S3 buckets containing periods not allowed

So, with the introduction of the s3_cdn_url setting, you can set a custom URL to be used instead of the long S3 URL.

Unfortunately, s3_upload_bucket doesn’t allow periods in the name… which means that if I, as per Amazon’s documentation, create a bucket called static.example.com and point a CNAME to it, I can set Discourse to print out URLs to static.example.com, but I can’t set it to actually upload to that bucket.

(I want to put Cloudflare in front of a CNAME, making for a low-cost but effective CDN. It’s not just for looks.)

2 « J'aime »

If periods are indeed supported we should relax the restriction … @techAPJ can you have a quick look

As I understood it, periods in the bucket name cause havoc with https and certificates so it is strongly discouraged that you do this. Unless you never plan to use https.

http://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html

We ran into many problems with this, which is why it is disallowed. It is not random. It’s a resolution to a problem many Discourse instances faced.

5 « J'aime »

aha … well then let’s just leave it as is for now.

1 « J'aime »

This is a good point. However, I think it should be downgraded to a warning, rather than being outright forbidden.

While locking yourself out of HTTPS is a terrible idea on its own, both Amazon CloudFront and CloudFlare (off the top of my head) offer SNI-based SSL certificates that can be put in front of a bucket, even if the default certificate would no longer cover it.

CloudFront can be configured to pull from an S3 bucket of your choice (even if it’s named something different), but also costs money. Well invested money, one may argue, but money nonetheless. If one does not need the additional functionality of a full-fledged CDN, CloudFront is a slightly overkill solution to the problem of “I want my forum to load faster”.
(An incredibly convoluted pricing model doesn’t help… I think there’s an XKCD for this, but I can’t find it.)

CloudFlare is not as configurable, but also offer quite a few other features as well - as well as the very approachable price tag of free. With a properly named bucket and a DNS rule (possibly supplemented by some caching rules), you get an instant improvement to loading performance, with no downsides whatsoever.
Perhaps not as big of a difference as a full CDN would make, but hey, it’s free performance.

3 « J'aime »

@codinghorror @sam I am using a cloudflare CDN to access the S3 content (where discourse uploads all the files) and not directly.

s3 mandates to use bucket name like files.discourse.org to access its content through cname files

http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html#VirtualHostingCustomURLs

Is there a way to allow periods in the S3 name (may be with a warning for https issue for direct s3 use). This is a showstopper in my case to use S3 with cloudflare and discourse.

Thanks

2 « J'aime »

We worked around that here @gingerman :

5 « J'aime »

@fearlessfrog Thanks…I ended up doing exactly the same. I don’t know how I missed your thread earlier. Just to highlight - this approach has a limitation in terms of cache invalidation. we have to do separately invalidations in cloudfront and cloudflare (after rebaking posts). It would be great to automate them with a script at the very least.

I hit up on the same blocks eventually in terms of optimised image urls and was planning to start a thread today…Nice to know that you have already helped the team towards a fix in the below given thread. Kudos for that.

2 « J'aime »

Je voulais simplement ajouter mon +1 pour autoriser les points dans les noms de buckets S3 au sein de Discourse. AWS le permet lui-même (et l’indique d’ailleurs explicitement) désormais pour l’accès aux contenus S3 basé sur des CNAME. À ma connaissance, tant que le paramètre s3_cdn_url de Discourse est utilisé, les problèmes antérieurs liés à HTTPS ne posent plus de souci, du moins lorsque des services comme Cloudflare sont employés (comme le note @uppfinnarn, les certificats SSL basés sur SNI résolvent ce problème).

Serait-il possible de réexaminer cette question dans une prochaine version ?

Merci pour ce excellent produit !

Puisque nous acceptons déjà que S3_CDN_URL puisse avoir n’importe quelle valeur, quel avantage avons-nous à permettre cela ?

Bonjour Rafael, sauf si je passe à côté de quelque chose, bien que ce paramètre permette à Discourse de récupérer depuis une URL CDN, si nous ne pouvons pas spécifier un nom de bucket S3 contenant des points, nous ne pouvons pas réellement y télécharger de fichiers ? Cela impose des contournements peu élégants, comme la configuration de CNAME alternatifs dans des services tiers supplémentaires et non gratuits comme CloudFront (que nous n’utilisons pas du tout pour le moment et que nous préférons éviter).

(Et je suppose qu’au fond, je ne comprends tout simplement pas pourquoi vous voudriez jamais rejeter systématiquement quelque chose qui est un nom de bucket S3 valide !)

Donc vous n’utilisez pas du tout le HTTPS ? C’est la raison principale mentionnée ci-dessus.

1 « J'aime »

Je ne comprends pas quel est le compromis ici.

Si nous autorisons des buckets contenant des points, nous devons ajouter un paramètre pour désactiver la vérification SSL lors de la connexion, ou les utilisateurs doivent ajouter un proxy qui ajoute une couche SSL entre Discourse et le point de terminaison S3, mais la communication restera en HTTP non chiffré entre le proxy et le point de terminaison S3.

Tout cela, et quel est l’avantage ?

1 « J'aime »

Donc vous n’utilisez pas HTTPS… du tout ? C’est la raison principale mentionnée ci-dessus.

Bonjour Jeff, nous utilisons HTTPS, via Cloudflare.

Si nous autorisons les buckets contenant des points, nous devons ajouter un paramètre pour désactiver la vérification SSL lors de la connexion, ou les utilisateurs doivent ajouter un proxy qui ajoute SSL entre Discourse et le point de terminaison S3, mais cela restera en HTTP simple entre le proxy et le point de terminaison S3.

Je suis presque certain que Cloudflare détectera et gérera cela automatiquement, sans qu’il soit nécessaire d’ajouter un paramètre supplémentaire (c’est une approche que nous avons déjà utilisée avec d’autres services).

Je comprends tout à fait votre volonté d’avertir les utilisateurs contre l’utilisation d’une convention que vous jugez problématique, mais étant donné que les noms de buckets S3 valides peuvent contenir des points (et que la documentation AWS recommande de les utiliser dans divers scénarios), seriez-vous ouvert à envisager de le rendre possible à l’avenir ?

Non, nous n’envisagerions pas cela.

D’accord, merci bien. Je suppose que nous allons appliquer un correctif ou trouver une alternative :slight_smile:

Quelle alternative ? Créez simplement un nouveau bucket S3 sans points. Je ne vois aucune raison d’utiliser un bucket existant pour vos uploads Discourse. Cela simplifie même la comptabilité, car il n’y a pas d’objets aléatoires non liés à Discourse dedans.

Espérons quelque chose de moins sous-optimal que cette solution (mais au moins, cela fonctionnera).

Le CDN CloudFront est optionnel. Vous pouvez utiliser n’importe quel autre CDN avec un nom de bucket sans point, et vous n’aurez pas non plus de problèmes liés au HTTPS.

En outre, cette image est la seule chose qui me vient à l’esprit en lisant cet échange.

(Attention : toute personne détenant une habilitation de sécurité américaine actuelle ne doit pas révéler l'image ici.)

2 « J'aime »