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 лайка

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 лайков

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

1 лайк

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 лайка

@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 лайка

We worked around that here @gingerman :

5 лайков

@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 лайка

Хочу поддержать идею разрешения использования точек в именах бакетов S3 в Discourse. Сама AWS теперь разрешает (и даже рекомендует) это для доступа к контенту S3 через CNAME (см. документацию). Если используется настройка s3_cdn_url в Discourse, то, насколько я могу судить, ранее возникавшие проблемы с HTTPS больше не актуальны, особенно при использовании таких сервисов, как Cloudflare (как отмечает @uppfinnarn, SSL-сертификаты на основе SNI решают эту проблему).

Возможно ли пересмотреть это решение в следующем выпуске?

Спасибо за отличный продукт!

Поскольку мы уже поддерживаем S3_CDN_URL в любом виде, что мы получаем, разрешая это?

Привет, Рафаэль. Если я ничего не упускаю, то, хотя этот параметр позволяет Discourse загружать данные с URL CDN, если мы не можем указать имя бакета S3, содержащее точки, то фактически мы не можем загружать данные в такие бакеты? Это вынуждает прибегать к неуклюжим обходным путям, например, настройке альтернативных CNAME в дополнительных сторонних сервисах, не являющихся бесплатными, таких как CloudFront (который мы в данный момент вообще не используем и предпочли бы не использовать).

И, я полагаю, в конечном итоге я просто не понимаю, зачем кому-то вообще нужно безоговорочно отклонять что-то, что является допустимым именем бакета S3!

Значит, вы вообще не используете HTTPS? Это основная причина, указанная выше.

1 лайк

Я не понимаю, в чём здесь компромисс.

Если мы разрешаем бакеты с точками, нам нужно добавить настройку для отключения проверки SSL при подключении, либо пользователи должны использовать прокси, который добавляет SSL между Discourse и конечной точкой S3, но при этом соединение между прокси и конечной точкой S3 останется обычным HTTP.

И всё это ради чего? Какая в этом польза?

1 лайк

Так что вы вообще не используете HTTPS? Это основная причина, упомянутая выше.

Привет, Джефф, мы используем HTTPS через Cloudflare.

Если мы разрешаем бакеты с точками, нам нужно добавить настройку, чтобы можно было отключить проверку SSL при подключении, либо пользователи, использующие это, должны добавить прокси, который добавляет SSL между Discourse и конечной точкой S3, но между прокси и конечной точкой S3 всё равно будет обычный HTTP.

Я почти уверен, что Cloudflare автоматически обнаружит и обработает это без необходимости добавлять дополнительную настройку (мы уже использовали такой подход с другими сервисами).

Я полностью понимаю желание предупредить пользователей об использовании практики, которую вы считаете проблемной, но учитывая, что валидные имена бакетов S3 могут содержать точки (и документация AWS рекомендует их использовать в ряде сценариев), могли бы вы рассмотреть возможность включения этой функции в будущем?

Нет, мы не рассматриваем такую возможность.

Ладно, спасибо. Похоже, мы либо выпустим патч, либо найдём альтернативу :slight_smile:

Какой альтернативный вариант? Просто создайте новый бакет S3 без точек в названии. Я не могу придумать причин использовать существующий бакет для загрузок Discourse. Это даже упрощает учёт, так как там не будет случайных объектов, не относящихся к Discourse.

Надеюсь, что-то менее субоптимальное, чем это (но хотя бы это сработает).

CDN CloudFront является опциональным. Вы можете использовать любой другой CDN с именем бакета без точек, и у вас также не возникнет проблем с HTTPS.

Кроме того, это единственное изображение, которое приходит мне в голову при чтении этого обмена мнениями.

(Предупреждение: никто из лиц, имеющих действующую американскую допуск к секретным материалам, не должен раскрывать это изображение здесь.)

2 лайка