Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EC-CUBEはサーバレスで動かせるのか?

yshimada
March 13, 2025

 EC-CUBEはサーバレスで動かせるのか?

yshimada

March 13, 2025
Tweet

More Decks by yshimada

Other Decks in Technology

Transcript

  1. confidential TENDA CO., LTD. 1. スピーカー紹介 2. EC-CUBEとは 3. AWSとは

    4. EC-CUBEってサーバレス化できるの︖ 5. やってみた 6. まとめ ⽬次
  2. confidential TENDA CO., LTD. 島⽥裕基 • ⼤阪府で⽣まれ⻘春時代を宮城県で過ごす • 東北職業能⼒開発⼤学校 ⽣産電⼦システム技術科卒業

    • 東京で就職 SI/EC/決済/MSP の⾃社サービスを持つ会社でECを中⼼に開発 • 2015年テンダに⼊社 (マニュアル⾃動作成Dojoを知っていたのがきっかけ) なんでもできる(する)テンダ︕ • 現在はPM業務を中⼼に稼働 • 最近Raspberry Pi Pico 2 W を衝動買いして何をしようか悩んでいる 電⼦ペーパーキット買って遊んでます→ 3 スピーカーについて
  3. confidential TENDA CO., LTD. Amazon Web Services(アマゾン ウェブ サービス、略称︓AWS)とは、 Amazon

    Web Services, Inc. により提供されるクラウドコンピューティングサービスである。 2006年にサービス提供が開始され、IaaS における世界的シェアが39%で1位。 世界で数百万以上、⽇本国内においても数⼗万を超える顧客が AWS を利⽤している。 7 AWSとは 参考 : https://ja.wikipedia.org/wiki/Amazon_Web_Services
  4. confidential TENDA CO., LTD. • EC-CUBEはPHPのオープンソースシステム • ステートフルでありセッションやファイル管理を⾏う必要がある ↓ 完全なステートレス(AWS

    Lambda等での構成)は難しい ↓ コンテナのサーバレス化(Fargate/ECS) をしてみよう 8 EC-CUBEってサーバレス化できるの︖
  5. confidential TENDA CO., LTD. ECSって︖ • Amazon Elastic Container Service

    (Amazon ECS) は フルマネージドコンテナオーケストレーションサービス。 • コンテナ化されたアプリケーションを効率的に デプロイ/管理/スケールできる。 9 EC-CUBEってサーバレス化できるの︖ 参考 : https://aws.amazon.com/jp/ecs/
  6. confidential TENDA CO., LTD. EC-CUBEはdockerで動作する仕組みが提供されている 10 EC-CUBEってサーバレス化できるの︖ 参考 : https://doc4.ec-cube.net/quickstart/docker_compose_install

    開発ドキュメントにて以下記事が存在 Docker Composeを使⽤してインストールする https://doc4.ec-cube.net/quickstart/docker_compose_install gitでダウンロードしたリポジトリには左記のように docker利⽤のための資材あり。 dockerで動かせる ということは Fargate/ECSで動かせる、はず︕
  7. confidential TENDA CO., LTD. 12 やってみた 先程までの流れを踏まえ、以下の⼿順で構築。 • セキュリティ系の準備(セキュリティグループ/IAMロール) •

    検証⽤EC2インスタンスの作成 • ECRにEC-CUBEイメージを設置 • RDSでデータベース作成 • EFSで共⽤ファイルストレージ作成 • EC2で環境作成 • ECSでタスク定義〜サービスの実⾏ • 起動後の微修正
  8. confidential TENDA CO., LTD. セキュリティグループの作成 各サービス向けのセキュリティグループを作成する。 • for_ec2 : 検証⽤EC2⽤。WEBサーバポートを許可する。

    • for_efs : 共有ファイルストレージ⽤。 • for_rds : RDS⽤。EC2やECSからのアクセスを許容する。 • for_ecs : ECS⽤。ALBからのアクセスを許可する。 • for_alb : ALB⽤。WEBサーバポートを許可する。 14 やってみた セキュリティ系の準備
  9. confidential TENDA CO., LTD. IAMロールの作成 EC2とECSそれぞれに付与するロールを作成する。 • ttech2025UseECRRole : 検証⽤EC2⽤に付与。

    許可ポリシー AmazonEC2ContainerRegistryFullAccess を設定 • ecsTaskExecutionRole : ECSに付与。 許可ポリシー AmazonECSTaskExecutionRolePolicy を設定 15 やってみた セキュリティ系の準備
  10. confidential TENDA CO., LTD. 検証⽤EC2を作成する。 16 やってみた 検証⽤EC2インスタンスの作成 // EC2インスタンスを作成する

    vpcは ttech2025-vpc にする ttech2025UseECRRoleロールを付与 // dockerのインストールとサービス起動 # dnf install -y docker # systemctl start docker // gitのインストール # dnf install -y git // EC-CUBEのダウンロード # cd /opt/ # git clone https://github.com/EC-CUBE/ec-cube.git # cd /opt/ec-cube/ # git branch * 4.3 // 2025-03 時点では4.3ブランチが最新 // とりあえずなにも変えずビルド # docker build -t ec-cube .
  11. confidential TENDA CO., LTD. 17 やってみた ECRにEC-CUBEイメージを設置 ECRの作成 リポジトリを作成しておく。 検証⽤EC2から、作成したリポジトリに対してイメージのpushを⾏う。

    // ECRログイン(ロール付与してれば成功する) # aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded // ECRへのpushとタグ付け docker tag ec-cube:latest XXXXXXXXXXXX.dkr.ecr.ap-northeast- 1.amazonaws.com/ec-cube:latest docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/ec- cube:latest
  12. confidential TENDA CO., LTD. 18 やってみた RDSでデータベース作成 RDSの作成 データベースを作成しておく。 右記詳細は割愛するが、ポイントは以下

    • エンジンタイプを設定する ここでは Aurora MySQL コンパチにする • DBクラスター識別⼦を設定する ここでは ec-cube-cluster とする • インスタンスタイプの設定 ここでは db.t3.medium とする • 接続は極⼒少なくする • セキュリティグループは for_rds とする
  13. confidential TENDA CO., LTD. 19 やってみた RDSでデータベース作成 検証⽤EC2を使って接続確認の実施と、 EC-CUBE利⽤ユーザとそのパスワードを設定する。 //

    mysqlのクライアントをインストール # dnf -y install https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm # dnf -y install mysql // RDSに接続 # mysql -h ec-cube-cluster.cluster-c9rb6qfpwavf.ap-northeast-1.rds.amazonaws.com -u admin -p // docker-compose.mysql.yml と同じ設定で登録しておく mysql> CREATE USER 'dbuser'@'%' IDENTIFIED BY 'secret'; mysql> GRANT ALL PRIVILEGES ON eccubedb.* TO 'dbuser'@'%'; mysql> FLUSH PRIVILEGES; ユーザー名/パスワードは docker-compose.mysql.yml と同⼀
  14. confidential TENDA CO., LTD. 21 やってみた EFSで共⽤ファイルストレージ作成 検証⽤EC2を使ってマウントの設定と検証をする。 // EFSを使えるように

    # dnf install -y amazon-efs-utils # mkdir /mnt/efs # chmod 777 /mnt/efs # mount -t efs -o tls fs-00f0e4ce20d7117fa:/ /mnt/efs
  15. confidential TENDA CO., LTD. 22 やってみた EC2で環境作成 検証⽤EC2を使ってdocker起動でEC-CUBEを動かす。 // docker-compose.yml

    変更 # cd /opt/ec-cube/ # vi docker-compose.yml # git diff docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml index 3b81328da4..1d44066b2f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,9 +5,6 @@ networks: driver: bridge volumes: - mailcatcher-data: - driver: local - ### ignore folder volume ##### var: driver: local @@ -22,23 +19,22 @@ services: ### ローカルでビルドする場合は以下のコマンドを使⽤します ## docker build -t ec-cube --no-cache --pull --build-arg TAG=8.1-apache . ## docker tag ec-cube ghcr.io/ec-cube/ec-cube-php:8.1-apache - image: ${REGISTRY:-ghcr.io}/${IMAGE_NAME:-ec-cube/ec-cube-php}:${TAG:-8.1-apache} + image: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/ec-cube:latest ports: - - 8080:80 - - 4430:443 + - 80:80 volumes: ### 同期対象からコストの重いフォルダを除外 ##################### - "var:/var/www/html/var" - "vendor:/var/www/html/vendor" - "node_modules:/var/www/html/node_modules" + - "/mnt/efs/html:/var/www/html/html” environment: # EC-CUBE environments - APP_ENV: "dev" - APP_DEBUG: 1 - DATABASE_URL: "sqlite:///var/eccube.db" + APP_ENV: "prod" + APP_DEBUG: 0 + DATABASE_URL: "mysql://dbuser:[email protected] 1.rds.amazonaws.com:3306/eccubedb?charset=utf8mb4" DATABASE_SERVER_VERSION: 3 DATABASE_CHARSET: 'utf8' - MAILER_DSN: "smtp://mailcatcher:1025" ECCUBE_AUTH_MAGIC: "<change.me>" # TRUSTED_HOSTS: '^127.0.0.1$$,^localhost$$' # ECCUBE_LOCALE: "ja" @@ -59,11 +55,3 @@ services: networks: - backend - ### Mailcatcher ################################## - mailcatcher: - image: schickling/mailcatcher - ports: - - "1080:1080" - - "1025:1025" - networks: - - backend
  16. confidential TENDA CO., LTD. 23 やってみた EC2で環境作成 検証⽤EC2を使ってdocker起動でEC-CUBEを動かす。 // docker-composeインストール

    # curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose # docker-compose --version Docker Compose version v2.33.1 // git保有のhtml内容をEFSにコピーする # cp -pr html/ /mnt/efs/ # chmod -R 777 /mnt/efs/html/ // 起動 # docker-compose up -d EC2インスタンスのパブリックIPにアクセス → 表⽰ // 停⽌ # docker-compose down --remove-orphans
  17. confidential TENDA CO., LTD. 25 やってみた ECSでタスク定義〜サービスの実⾏ タスク定義の作成 EC2内でdocker-compose.ymlをどう設定するかを宣⾔したように、 ECSのタスク定義をどう設定するかでAWSコンテナを操作するかが決まる。

    … services: ### ECCube4 ################################## ec-cube: ### ローカルでビルドする場合は以下のコマンドを使⽤します ## docker build -t ec-cube --no-cache --pull --build-arg TAG=8.1-apache . ## docker tag ec-cube ghcr.io/ec-cube/ec-cube-php:8.1-apache image: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/ec-cube:latest ports: - 80:80 volumes: ### 同期対象からコストの重いフォルダを除外 ##################### - "var:/var/www/html/var" - "vendor:/var/www/html/vendor" - "node_modules:/var/www/html/node_modules" - "/mnt/efs/html:/var/www/html/html” … … … … … … 似てる〜
  18. confidential TENDA CO., LTD. 26 やってみた ECSでタスク定義〜サービスの実⾏ タスク定義の作成 docker-compose.ymlを参考にタスク定義に設定したもの(pickup) •

    コンテナ : イメージURIをdocker-compose.ymlに設定したものと同じにする。 • 環境変数 : APP_ENV / APP_DEBUG / DATABASE_URL / ECCUBE_AUTH_MAGIC を docker-compose.ymlに設定したものと同じにする。 • ボリューム / コンテナマウントポイント : docker-compose.ymlと同様に、EFSを設定。 設定したら作成実施。 タスク定義ができたら、 続いてクラスターの作成へ。
  19. confidential TENDA CO., LTD. 28 やってみた ECSでタスク定義〜サービスの実⾏ サービスの作成 先ほど作成したタスク定義を⽤いて、サービスを作成する。 ポイントを以下に列挙

    • コンピューティングオプション : 「起動タイプ」に設定 • 起動タイプ : 「FARGATE」を選択 • アプリケーションタイプ : 「サービス」を選択 • タスク定義(ファミリー指定) : 先ほど作成した ec-cube を選択 • ネットワーキングVPC : 本勉強会⽤のVPCを選択 • サブネット : 利便性を考えてPublic系選択 • セキュリティグループ : 最初に作成した 「for_ecs」 を選択 • ロードバランシングを使⽤ : チェックをつける • 新しいリスナー / 新しいターゲットグループを作成する 設定したら「作成」実⾏。
  20. confidential TENDA CO., LTD. 31 やってみた ECSでタスク定義〜サービスの実⾏ ALBの設定 ECSサービス作成経由だと細かい設定がされていないので修正する。 到達不可能の理由は、ALBのセキュリティグループが「for_ecs」になっているから。

    →最初に作成した「for_alb」に変更する。 もう1点、作成したターゲットグループの属性編集を⾏い、 「維持設定をオンにする」にチェックを⼊れること。これで複数インスタンスでも 対象を維持できる。
  21. confidential TENDA CO., LTD. 33 やってみた 起動後の微修正 動作確認を進めていると、会員登録画⾯に進めないことを確認。。 index.phpを修正することで回避できそう。 EC2で右記対応。

    ECRのリポジトリを最新化したら、 ECSのサービスを強制更新。 再度アクセスすると会員登録画⾯OKに。 # cd /opt/ec-cube/ # vi index.php # git diff index.php diff --git a/index.php b/index.php index 001279a600..d33974a002 100644 --- a/index.php +++ b/index.php @@ -55,6 +55,10 @@ if ($trustedHosts) { Request::setTrustedHosts(explode(',', $trustedHosts)); } +if (@$_SERVER["HTTP_X_FORWARDED_PROTO"] === 'https') { + $_SERVER['HTTPS'] = 'on'; +} + $request = Request::createFromGlobals(); // 再度ビルド # docker build -t ec-cube . // ECRログイン(ロール付与してれば成功する) # aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password- stdin XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com // ECRへのpushとタグ付け docker tag ec-cube:latest XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/ec-cube:latest docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/ec-cube:latest 参考 : https://umebius.com/eccube/elb-alb-https-restrict-err_too_many_redirects/
  22. confidential TENDA CO., LTD. 35 まとめ EC-CUBEをサーバレスで動かすことができた。 EC-CUBEを完全なサーバレス(AWS Lambda etc)で動かすのは難しいが、

    コンテナのサーバレス(Fargate/ECS)なら⽐較的現実的だった。 EC-CUBEにはDocker関連の資材が標準で⽤意されているため、 タスク定義の設定を理解できれば対応する敷居は⾼くない。 (今回紹介しませんでしたが、Docker Compose を使ってECSに直接デプロイもできるそうな。)
  23. confidential TENDA CO., LTD. 37 参考⽂献 • EC-CUBE システム要件 https://doc4.ec-cube.net/quickstart/requirement

    • Amazon Web Services Wikipedia https://ja.wikipedia.org/wiki/Amazon_Web_Services • Amazon Elastic Container Service https://aws.amazon.com/jp/ecs/ • EC-CUBE Docker Composeを使⽤してインストールする https://doc4.ec-cube.net/quickstart/docker_compose_install • ELB、ALBの冗⻑化でHTTPSアクセスがHTTPになる現象を回避する⽅法 https://umebius.com/eccube/elb-alb-https-restrict-err_too_many_redirects/
  24. confidential 【注意事項】 l 本資料を無断で第三者に配布することを禁⽌します。 l Amazon Web Services、『Powered by Amazon

    Web Service』ロゴ、[その他AWS商標名]は、⽶国および/またはその他の諸国における、 Amazon.com, Inc. またはその関連会社の商標です。