Skip to content
TAKANO Mitsuhiro edited this page Mar 21, 2024 · 45 revisions

WordPress on AWS

方針

参照アーキテクチャをベースに課題に合わせた修正をする方針で構築しています。

  • 後述の参照アーキテクチャを構成

    • コードで構成を管理できるようにTerraformによる記述

    • スケーラビリティや可用性を意識しFargateを利用するように変更

  • CloudFrontの利用で運用コスト削減

    • アプリケーションサーバの負荷軽減
  • 踏み台となるホストがなくても管理できるように変更

    • コンテナのサービスでオートスケール

    • SSHなどで接続されてしまうリスクの回避

参照アーキテクチャ

https://docs.aws.amazon.com/whitepapers/latest/best-practices-wordpress/reference-architecture.html

https://docs.aws.amazon.com/ja_jp/whitepapers/latest/best-practices-wordpress/reference-architecture.html

wordpress-on-aws

Fargate の利用

https://futurice.com/blog/terraform-recipe-wordpress-fargate

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/AWS_Fargate.html

wordpress-on-fargate

制限事項や注意事項

本番環境と開発環境

Terraformで site_domain, stage の変数を変更すれば dev, stg, prod(, dev2) のように 複数の環境をデプロイできるコードになっています。ただし tfstate の管理に注意が必要です。

開発環境を同じアカウントで作成すると環境が混在してわかりにくくなって説明のときに混乱しそうなのでデプロイしていません。

現段階ではデフォルトのstageprodという扱いでGitHub Actionsでもprodのみにterraform applyしています。

S3バケットはTerraformの状態保存のみに利用

参照アーキテクチャでは静的なファイルについてCloudFrontオリジンをS3バケットに設定していますがS3を静的なファイルの保存先に指定するにはアプリケーションで大きな変更が必要となってしまいます。

アプリケーションのアップグレードなどが困難にならないようにEFSの領域に保存するのみとしました。

静的ファイルの配信はCloudFrontからALBを経由したECSをオリジンとしてEFSの読み込み配信されることになります。

CloudFrontからの配信とすることでオリジンとなるECSへのアクセスは抑えることができますので問題ありません。

IPアドレスベースでのアクセス制限の未実施

セキュリティのための制限としての要件ですが以下の理由から未実施です。

  • 汎用的な状態のコードに留めておきたかったので本流のコードには入れていません
    • IPv4 アドレスで制限するコードは wafv2-with-ipv4 ブランチに用意しました
      • main ブランチには未適用
  • CloudFrontでDDoSに対策できます
  • WAFで不正なアクセスに対策できます
  • ECSを利用しているので外部からのSSH接続はできません
    • aws ecs execute-commandにはAWSのクレデンシャルが必要
  • IPv6 でもデュアルスタックでサービスできているのでそれを犠牲にしないようにしました
    • IPv4 のアドレスで制限するためには IPv6 を無効にする必要があり、これはサービスの幅が狭まるためIPv4アドレスによる制限をやめました

冗長性確保によるコスト増

単一のリージョンが不能になっても機能するように複数のリージョンでクラスタを組んでいます。

具体的には RDS Aurora MySQL が複数のサーバレスインスタンスでクラスタを組んでいるためコストが増えています

キャパシティプロバイダは FARGATE

Fargate Spot キャパシティプロバイダーは、Fargate の Windows コンテナではサポートされません。

ARM64 アーキテクチャの Linux タスクでは、Fargate Spot キャパシティプロバイダーはサポートされません。Fargate Spot では、X86_64 アーキテクチャの Linux タスクのみサポートされます。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-capacity-providers.html

今回は Graviton3 のインスタンスを活用するために ARM64 を採用したのでキャパシティプロバイダは FARGATE SPOT に設定されていますが、起動するタスクは FARGATE によるものです。