Automator で SimplyStatics をもっと便利に!

経緯

このWebサイトは以下のように運用しています。

  1. 手元にあるWordPressをCMSとして使う
  2. Simply Statics(WordPressプラグイン)でHTMLファイル群をZipでダウンロード
  3. Zipを展開して、S3の静的サイトホスティングにアップロード

SimplyStaticsに年間1.5万円くらい払えば、直接S3にアップロードする機能も使えるみたいなのですが、あまり更新しないブログ(更新しろ)なので、そんなに費用かけるのもなぁ…という感じ。

そこで、Zipダウンロードするところまでは変わらず、S3にアップロードを楽にしようと思います。

※ この記事はMacを使っている人向けです。

簡単にツールの説明

Simply Statics

WordPressを静的なファイルに変換してくれるツール。
要は投稿やページをPHPを介さずに直接HTML, CSS, JSを表示できます。

Automatorとは

Mac標準の自動化ツール。

クイックアクションという機能を使うと、そのファイルに対してシェルを実行したりできます。
例えば、Finderで画像を右クリックしてサイズを変換したり、音楽を右クリックしてビットレートを変更したり…いろいろできるので重宝しています。

今回作ったもの

  1. 指定されたZipファイルを一時フォルダに展開
  2. S3に中身をアップロード
  3. CloudFrontのキャッシュを削除
  4. 一時フォルダを削除

前提

下記のインストール等が完了している前提で進みます。

このあたりは検索すれば五万と情報が出てくるのでここでは割愛します。

  • s3の静的ホスティングのバケットが用意されていること
  • awscliが利用できること

まず準備

AWSでIAMの追加

AWSコンソールにログインし、IAMユーザーを作成します。

  1. IAMユーザーの画面から「ユーザーの作成」ボタンをクリック
  2. ユーザー名は好きな名前をつける。ここで作るのはuploadしてくれるやつなので、仮にs3-uploaderとします。「次へ」ボタンをクリック
  3. 「ポリシーを直接アタッチする」を選択し、AmazonS3FullAccessCloudFrontFullAccessにチェックを入れて「次へ」ボタンをクリック
  4. ユーザーを作成ボタンをクリック

これでIAMユーザーが作成できました。

Credentialの取得

ユーザー一覧画面に戻るとユーザーが作成されていることがわかります。このユーザーでAWSにアクセスするためのCredentials(認証情報)を取得しましょう。

※ 最後に出てくる情報は一度しか表示されないので、間違えて消さないようにしましょう。

  1. ユーザー一覧のユーザーをクリック
  2. 中段にある「セキュリティ認証情報」タブを開く
  3. 中段にある「アクセスキーを作成」ボタンをクリック
  4. 「コマンドラインインターフェース(CLI)」を選択
  5. 画面下部の「上記のレコメンデーションを理解し、アクセスキーを作成します。」のチェックボックスにチェックを入れて「次へ」ボタンをクリック
  6. 「アクセスキーを作成」ボタンをクリック
  7. アクセスキーとシークレットキーをメモする(一度しか表示されません)

MacにCredentialを登録

profile名はなんでもいいのですが、IAMユーザーの名前に合わせてs3-uploaderにしておきます。

下記のコマンドを叩くと対話形式で認証情報の設定ができます。

$ aws configure --profile s3-uploader

AWS Access Key ID [None]: {先ほど取得したアクセスキー}
AWS Secret Access Key [None]: {先ほど取得したシークレットキー}
Default region name [None]: ap-northeast-1
Default output format [None]: json

ここまでで準備は完了です。

作り方

まず、Automatorを立ち上げましょう。「アプリケーション」の中にロボットのアイコンのAutomatorがあると思います。

起動して、「ファイル」→「作成」をすると、種類の選択画面が出てきます。今回はクイックアクションを作りたいので、そちらを選択すると、クイックアクションを作る画面が出てきます。

まず、画面上部でこのクイックアクションの対象を設定をしていきましょう。

ワークフローが受け取る現在の項目: ファイルまたはフォルダ
検索対象: Finder

左のリストの中から「ユーティリティ」を選択し、その中の「シェルスクリプトを実行」を右のエリアにドラッグ&ドロップしましょう。

右上の「入力の引き渡し方法」の項目は「引数として」にした上で、以下を記入してください。

#!/bin/bash

# Automator の PATH 設定
# `which aws`などを叩いて、PATHを通してあげてください。
export PATH="/opt/homebrew/bin/:$PATH"

# AWS プロファイルとバケット名の指定
AWS_PROFILE="s3-uploader"
S3_BUCKET="your-bucket-name"
DISTRIBUTION_ID="E1234567890"  # CloudFront のディストリビューションID

# 引数として渡されたZIPファイルを取得
ZIP_FILE="$1"

# 引数のファイルが存在するか確認
if [ ! -f "$ZIP_FILE" ]; then
    osascript -e "display notification \"指定されたZIPファイルが存在しません\" with title \"ZIP to S3\""
    exit 1
fi

# ZIPファイル名と展開先ディレクトリの設定
ZIP_BASENAME=$(basename "$ZIP_FILE" .zip)
TEMP_DIR=$(mktemp -d)

# ZIPファイルを一時ディレクトリに展開
unzip -q "$ZIP_FILE" -d "$TEMP_DIR"

# 展開されたディレクトリの中身を S3 バケットにアップロード
aws s3 cp "$TEMP_DIR/" "s3://$S3_BUCKET/" --recursive --profile "$AWS_PROFILE"

# アップロード完了通知
osascript -e "display notification \"S3 アップロード完了\" with title \"ZIP to S3\""

# CloudFront のキャッシュを無効化
INVALIDATION_OUTPUT=$(aws cloudfront create-invalidation \
    --distribution-id "$DISTRIBUTION_ID" \
    --paths "/*" \
    --profile "$AWS_PROFILE")

# キャッシュ無効化の結果を確認
if [ $? -eq 0 ]; then
    osascript -e "display notification \"CloudFront キャッシュの無効化を完了しました。\" with title \"ZIP to S3\""
else
    osascript -e "display notification \"CloudFront キャッシュの無効化に失敗しました。\" with title \"ZIP to S3\""
fi

# 一時ディレクトリを削除
rm -rf "$TEMP_DIR"

# 完了通知
osascript -e "display notification \"処理が完了しました。\" with title \"ZIP to S3\""

CloudFrontのディストリビューションIDはAWSコンソールのCloudFrontのページに行けば、簡単に見つかると思うので、ここでは割愛します。

ここまでやったらわかりやすい名前をつけて保存しましょう。

「Zipを展開してS3にアップロード」とかでいいと思います。

動かし方

動かすのは簡単で、SimplyStaticsで書き出したzipファイルをダウンロードして、「右クリック→クイックアクション→Zipを展開してS3にアップロード」を選択するだけ。

サイトにアクセスすれば反映されていることがわかると思います。

まとめ

Automatorで処理を作るのはちょっと難しいですが、何度も何度も繰り返し行うルーチンであれば、一度頑張って作っておくと今後の未来は明るいです。

自分は過去にmovをgifに変えたり、動画の音声をトラックごとに抽出するスクリプトをAutomatorで作って作業効率化しています。

Automatorで楽しましょう!