💨

EC-CUBEをGoogle App Engineにデプロイする際にはまったポイント

2023/01/13に公開

先日EC-CUBEをGoogle App Engine上にデプロイする際にはまったポイントがいくつかありましたので、今後困らないように備忘録としてまとめます。

環境

EC-CUBE 4.2
Symfony 5.4
PHP 7.4
MySQL 5.7

ログ・キャッシュ・セッションがうまく出力されない

EC-CUBEのデフォルト設定だと var/ 配下にログ・キャッシュ・セッションのディレクトリが作成されるようになっていますが、App Engineから作成できずエラーとなっていました。

ログ対応

ログの出力先を標準エラー出力に変更し、ログエクスプローラーで拾ってもらうようにしました。

app/config/eccube/packages/prod/monolog.yml
monolog:
    handlers:
        e_user_deprecated_filter:
            type: filter
            accepted_levels: ['info']
            channels: ['php']
            handler: blackhole
            bubble: false
        main:
            type: fingers_crossed
            action_level: error
            passthru_level: info
            handler: main_rotating_file
        main_rotating_file:
            # type: rotating_file
            # max_files: 60
            # path: '%kernel.logs_dir%/%kernel.environment%/site.log'
            # formatter: eccube.log.formatter.line
            # level: debug
            type: stream
            path: "php://stderr"
            level: debug
        front:
            type: fingers_crossed
            action_level: error
            passthru_level: info
            handler: front_rotating_file
            channels: ['front', 'app', 'php']
        front_rotating_file:
            # type: rotating_file
            # max_files: 60
            # path: '%kernel.logs_dir%/%kernel.environment%/front.log'
            # formatter: eccube.log.formatter.line
            # level: debug
            type: stream
            path: "php://stderr"
            level: debug
        admin:
            type: fingers_crossed
            action_level: error
            passthru_level: info
            handler: admin_rotating_file
            channels: ['admin', 'app', 'php']
        admin_rotating_file:
            # type: rotating_file
            # max_files: 60
            # path: '%kernel.logs_dir%/%kernel.environment%/admin.log'
            # formatter: eccube.log.formatter.line
            # level: debug
            type: stream
            path: "php://stderr"
            level: debug
        console:
            type: console
            process_psr_3_messages: false
            channels: ['!event', '!doctrine']
        # keep this last
        blackhole:
            type: "null"

キャッシュ対応

キャッシュの保存場所をApp Engineが書き込めるtmp配下に変更しました。ここでは念のためログの出力先もtmp配下に変えています。

src/Eccube/Kernel.php
    public function getCacheDir()
    {
        if ($this->environment === 'prod') {
            return '/tmp/var/cache/'.$this->environment;
        }
        return $this->getProjectDir().'/var/cache/'.$this->environment;
    }

    public function getLogDir()
    {
        if ($this->environment === 'prod') {
            return '/tmp/var/log';
        }
        return $this->getProjectDir().'/var/log';
    }

セッション対応

セッションの保存場所をDBに変更しました。
参考: https://doc4.ec-cube.net/session_handler_settings#rdbmsに保存する

CSS、JS、画像ファイルが配信されない

こちらはapp.yamlに以下のhandlersを追加することで配信できるようになりました。

app.yaml
handlers:
  - url: /html/template/admin/assets
    static_dir: html/template/admin/assets
  - url: /html/template/default/assets
    static_dir: html/template/default/assets
  - url: /html/user_data/assets
    static_dir: html/user_data/assets
  - url: /html/upload/save_image
    static_dir: html/upload/save_image
  - url: /html/bundle
    static_dir: html/bundle

Cloud SQLに接続できない

ここは非常にはまりました。トライアンドエラーで何とか接続できるようになりましたのでその設定を記載しておきます。
DB名を重複して設定しているのがミソです。これでなぜか動きました()

DATABASE_URL: mysql://[ユーザ名]:[パスワード]@localhost/[DB名]?unix_socket=/cloudsql/[CloudSQLインスタンス接続名]&dbname=[DB名]

例)
DATABASE_URL: mysql://user:password@localhost/eccubedb?unix_socket=/cloudsql/xxx:asia-nortieast1:instance-name&dbname=eccubedb
GitHubで編集を提案

Discussion