たろログ2

実験的運用により、記事品質が乱高下することがあります。予めご了承ください。

2022-05-20 S3 にファイルをアップロードして discord で共有するアプリケーションの作成

tarohida.hatenablog.com

の続き。

目をつけていたスクリプト は無事動き、ブラウザから discord の Webhook へリクエストすることができた。

がしかし、 localhost ではよかったものの、アプリケーションをビルドし、 S3 にアップロードして動かしたところまたも CORS のエラーが発生した。

再度調べてみたが、Access-Control-Allow-Origin · Issue #2545 · discord/discord-api-docs にあるように、相当無理があるようだった。

そもそも、バックエンドのアプリケーションは自分管理でなく Discord 管理なので、CORS エラーについて自分ではどうしようもない。 Discord 側に、自分のドメインを許可してもらうようにお願いするしかないが、現実的でない。

Discord の Webhook URL を叩くだけの、バックエンドアプリケーションを作成してホストすることにした。

mimetype の取得

S3 にファイルを送る際、 mimetype の情報を指定する必要がある (そうでないと全部 octet-stream になってしまう)。そのため、下記のライブラリを指定した。

[AWS] S3へMIMEタイプを自動判定しながらアップロードする - Node.js

画像をアップロードする際に image/png など正しく指定して送るとブラウザでアクセスした際画像として開くが、 application/octet-stream として保存してしまうと、ブラウザはどんな名前のファイルであっても単にダウンロードしてしまう。

このライブラリを組み込むことによって、簡単にこの問題を解決することができた。感謝。

.env

script.js ファイルに認証情報等を直書きしていたが、もとより修正するつもりだったのでこのタイミングで修正を行った。

mrsteele/dotenv-webpack: A secure webpack plugin that supports dotenv and other environment variables and only exposes what you choose and use.

選定は下記のサイトを読んで。

Webpack build 時に環境にに応じた .env を読み込ませたい - かもメモ

ファイルサイズの判定

image.png (125.7 kB)

こんな感じでファイルサイズを表示してあげたかったので、以下のライブラリを使用。

filesize - npm

1GB とかの大きなファイルの場合は、家に帰ってから Wi-Fi でダウンロードしたいかもしれないからね!

S3 と CloudFront でのホスト

この辺と、過去に同じようなことをやっているのでその設定を参照しながら設定。

ドメインは Freenum で取得。

PHP のバックエンドを App Engine にデプロイする

Building an app with PHP 7+ | App Engine standard environment for PHP docs | Google Cloud を参照してデプロイ。

成果物は tarohida/discord-webhook-proxy

まだこの機能の実装を PHP 単体で行うつもりだったときに、App Engine へのデプロイは済ませていたので特に詰まることなく実施できた。