2021年5月25日火曜日

S3+CloudFrontで配信している静的ページをFTPで更新できるようにした時のメモ

AWSのS3+CloudFrontで配信している静的Webサイトの更新をFTP(SFTP)でできるようにした時のメモです。

(手順)
  1. サーバ(EC2)にサイト更新用のアカウント(ex: webadmin)を作成してSFTPで繋がるようにする
  2. S3の内容をサーバのローカル(ex: /home/webadmin/web-root)にコピー
  3. lsyncdで/home/webadmin/web-root以下を監視(設定内容を後述)
    1. ファイル追加時:
      1. aws s3 cp でローカル→S3へ転送
    2. ファイル変更時:
      1. aws s3 cp でローカル→S3へ転送
      2. aws cloudfront create-invalidation で invalidation を実行
    3. ファイル削除時:
      1. aws s3 rm で S3からファイルを削除
      2. aws cloudfront create-invalidation で invalidation を実行

(/etc/lsyncd.conf)

settings {

    logfile = "/var/log/lsyncd.log",

    statusFile = "/var/log/lsyncd.status",

    nodaemon = false,

    statusInterval = 1,

    delay = 15,

}


s3sync = {

    maxProcesses = 1,

    onCreate = "[ -f ^source^pathname ] && aws s3 cp ^source^pathname ^target^pathname || true",

    onModify = "[ -f ^source^pathname ] && aws s3 cp ^source^pathname ^target^pathname && aws cloudfront create-invalidation --distribution-id ディストリビューションID --paths ^pathname || true",

    onDelete = "[ -f ^source^pathname ] && aws s3 rm ^target^pathname && aws cloudfront create-invalidation --distribution-id ディストリビューションID --paths ^pathname || true",

}


sync {

    s3sync,

    source = "/home/webadmin/web-root",

    target = "s3://S3バケット名",

}

※上記の網掛け部分を適宜書き換える

(補足)

  • 最初、AWS Transfer for SFTPを使おうとしたけど、CloudFrontのinvalidation込みで動かそうとすると結局サーバが必要になりそうだったし、Lambdaを使うのも面倒だったので、個人的に一番楽な方法で対応
  • この方式に切り替えたサイトはAWSコンソール上で直接S3にファイルアップロードするのは避けるように運用変更が必要(S3とローカルで不整合が発生してしまうので)
  • 本当は git でwebサイト全体を管理して、master更新の都度S3+CloudFrontに反映する感じの方が個人的には良いと思います...ただ、非エンジニアにgitを使わせるのは難儀なので、そうなると安定のFTP(ただし、これから構築するならFTPやFTPSではなくSFTPですが)

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...