sugizakikun / docker-laravel

ポートフォリオ
https://sakopi.site
1 stars 0 forks source link

エロ画像がアップロードされないようにしたい #21

Closed sugizakikun closed 1 month ago

sugizakikun commented 1 month ago

目的

使うもの(候補)

sugizakikun commented 1 month ago

管理コスト、運用コストを加味した結果こっちに決定。

https://github.com/EugenCepoi/nsfw_api

sugizakikun commented 1 month ago

ローカルで春画検出APIを使えるようにする。 コンテナの利便性をここで享受する。

docker run -it -p 127.0.0.1:5000:5000/tcp --env PORT=5000 eugencepoi/nsfw_api:latest

春画のURLをリクエストパラメータとした場合

スクリーンショット 2024-08-29 15 38 28

普通の画像のURLをリクエストパラメータとした場合(猫ちゃんの画像だよ)

スクリーンショット 2024-08-29 15 42 34
sugizakikun commented 1 month ago

で、これをAWSのECSにアップしてEC2からもアクセスできるようにする

sugizakikun commented 1 month ago
  1. ECRにログインする

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 211125705600.dkr.ecr.us-east-1.amazonaws.com
  2. 引っ張ってきたdocker-image(eugencepoi/nsfw_api:lates)にECRのURIをタグ付けする.

docker tag eugencepoi/nsfw_api:latest xxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/detect-noodie-image:latest
  1. 引っ張ってきたイメージをECRにpushする
docker push xxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/detect-noodie-image:latest
sugizakikun commented 1 month ago
スクリーンショット 2024-08-29 17 03 56

basic認証が必要と言われた・・・ぴえん

sugizakikun commented 1 month ago

GPT先生に聞いてみたらECR単体じゃ動かないみたい・・・ ECSかFargateとの連携が必要らしい。

AWS ECR にコンテナイメージをプッシュした後、そのイメージを実際に使えるようにするためには、コンテナを実行するための環境が必要です。AWS では、そのために以下のサービスを使用します:

と言うことでFargateの設定をする。 ECRリポジトリにプッシュしたイメージをECS Fargateで起動する

sugizakikun commented 1 month ago

期限付きだけどS3に保存されている画像についても解析は可能。

スクリーンショット 2024-08-29 18 44 23
sugizakikun commented 1 month ago

今後の備忘録として記事を書いてみる。

https://qiita.com/sugichaaaan/items/738867e4bc3a1a0077d9

とりあえずAWSとの連携は完了した 💪🏻

スクリーンショット 2024-09-02 0 34 15
sugizakikun commented 1 month ago

考慮すべきこと

APIレスポンスの異常系を考慮せねばばば

APIロジック


    /**
     * @param $s3Path
     * @return float
     */
    public function calculateNsfwScore($s3Path) :float
    {
        $prefix = 'http://'.config('fargate.task_ip_address').':5000';
        $suffix = '/?url='. urlencode($s3Path);
        $endPoint = $prefix.$suffix;

        $jsonString = $this->httpClient->get($endPoint);
        $jsonArray = json_decode($jsonString, true);

        return  $jsonArray['score'];
    }

エラー時のAPIレスポンス

array:3 [▼ // app/Http/Services/Profile/UpdateProfileImage.php:75
  "error_code" => 500
  "error_reason" => "cannot identify image file <StringIO.StringIO instance at 0x7fb9d1869248>"
  "url" => "https://pictures-local.s3.amazonaws.com/zhgvyzc622skskgo80gggg8c.png"
]
sugizakikun commented 1 month ago

出力形式の統一(構想段階)

やっぱNSFWを使うのなら出力用のドメインクラスを作って出力形式を揃えた方が良さげ。 プロフィール画像に限らずカテゴリにも画像を設定することがあるから!

NsfwOutputDomainクラスでも新しく作るかぁ

引数

NsfwOutputDomainのmessageの値(※1)

正常系の場合

Case1: nsfwが0.8未満の場合

Profile image uploaded successfully.

Case2: nsfwが0.8以上の場合

# 「不適切な画像のアップロードが検知されました。」という意味だよ〜
'Inappropriate image upload detected.

異常系の場合

エラーコードによらず$jsonArray['error_reason']の値を表示する。

sugizakikun commented 1 month ago

いや・・・やっぱ正常系と異常系で出力形式は分けるべきかなぁ・・・? Controllerのreturnの段階でinstance ofによる場合分けをするだけで良さそうだし・・・。

正常系

NsfwResponseDomain

scoreによるメッセージの出しわけ(※1)

Case1: nsfwが0.3未満の場合

画像のアップロードが完了しました。

Case2: nsfwが0.3以上でかつ0.8未満の場合

画像のアップロードが完了しました。
(※ただしサムネイルにぼかし処理が入ります。)

Case3: nsfwが0.8以上の場合

不適切な画像のアップロードが検知されました。

異常系

NsfwErrorResponseDomain

sugizakikun commented 1 month ago

実現できたのでこのissueはcloseします!🐱 Fargate最高!