AWS Amplifyコンソールを使ってHugoベースの静的サイトを構築

2019.03.15

re:invent2018で発表された AWS Amplify コンソールは、モバイルウェブアプリケーション用の継続的デプロイおよびホスティングサービスです。

このサービスと静的サイトジェネレーター(以下 SSG)の Hugo を連携し、独自ドメインでサイトをホストする方法を紹介します。

AWS Amplify Consoleの管理画面でポチポチやるだけで、下図のような構成の継続的デプロイ・サイトホスティングを実現できます。

前提

AWS Amplify は以下のリージョンでのみ利用です。

  • EU (London)
  • EU (Ireland)
  • Asia Pacific (Sydney)
  • US East (N. Virginia)
  • US East (Ohio)
  • US West (Oregon)

特に、東京リージョンではまだ利用できません。

今回は EU (Ireland) リージョンを利用しました。

また、

  • ソースコードは GitHub で管理
  • Route 53 でドメインを管理

しているものとします。

Step 1 : Hugo 用のコンテンツを用意

ビルド&デプロイする Hugo の元データを用意し、GitHub で管理します。

注意点としては、レポジトリからソースコードを取得する際、サブモジュールは取得できないようです。

例えば、別レポジトリで管理されているテーマを利用したい場合、サブモジュールは利用しないようにしてください。

参考 Pipeline Error: My GitHub source stage contains Git submodules, but CodePipeline doesn't initialize them

Step 2 : Amplify アプリを作成

AWS 管理コンソールから Amplify アプリを作成します。

AWS Amplify トップページから "GET STARTED" のリンクをクリックします。

レポジトリサービスに GitHub を選択し、レポジトリとブランチを指定します。

ビルド手順を指定します。

AWS Amplify はレポジトリのソースコードをもとに、手順を自動生成します。

Hugo の場合、フレームワークが自動認識され、以下のビルド手順が自動生成されました。

version: 0.1
frontend:
  phases:
    build:
      commands:
        - hugo
  artifacts:
    baseDirectory: public
    files:
      - '**/*'
  cache:
    paths: []

この設定は、ソースコードを取得後、 $ hugoコマンドを実行し、public ディレクトリ以下のソースコードを artifact として利用するということを意味します。

仕様が AWS CodeBuild に似ていますね。詳細は次のドキュメントを参照ください。

Configuring Build Settings - AWS Amplify

最後に、設定内容を確認し、"save & deploy" ボタンを押せば、終了です。

Provision & Build & Deploy & Verify とすべて緑のチェックが入れば、成功です。

アクセス用の一意なドメインが生成されます。

https://BRANCHNAME.RANDOM-LETTER.amplifyapp.com/

そのドメインから、静的出力されたサイトにアクセスし、期待通り、サイト生成されていることを確認します。

cURL でアクエスし、ヘッダーを確認します

$ curl -I https://BRANCHNAME.RANDOM-LETTER.amplifyapp.com/
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 3816
Connection: keep-alive
Date: Thu, 14 Mar 2019 15:57:14 GMT
Last-Modified: Thu, 14 Mar 2019 12:34:01 GMT
ETag: "388935254ee4654a98ded5165046d13c"
Cache-Control: public, must-revalidate, max-age=0
Accept-Ranges: bytes
Server: AmazonS3
Via: 1.1 dummy0fef99ccf6faacc3588fcd922.cloudfront.net (CloudFront), 1.1 dummy145504681917f09b3c2bed61f9.cloudfront.net (CloudFront)
Vary: Accept-Encoding,Accept-Encoding
X-Cache: Miss from cloudfront

オリジンが S3 であり、 CloudFront 経由で配信されていることがわかります。

通常、CloudFrontのディストリビューションを新規作成すると、10分はかかるイメージがありますが、AWS Amplify の場合、数分で完了します。

AWS Amplify では、スマートな instant cache invalidation ができたりと、モバイル開発のフットワークの軽さと相性がいいように、通常とは異なるキャッシュサーバーで動作しているのかもしれません。

Step 3 : 独自ドメインを設定

デフォルトでは amplifyapp.com のサブドメインが割り振られるため、カスタムドメインを設定します。

DNS 設定は、メニューの「App settings→ Domain management」から行います。

このメニューを開くと、初期状態では、アプリ作成時に割り振られたドメインだけが存在します。

"Add Domain" から自分の管理するドメインを選択し、サブドメインのレコードを追加します。

Amplify Console の Custom domain 一覧には追加したサブドメインが追加され、Status が AVAILABLE になれば、設定完了です。 カスタムドメインでアクセスできることを確認してください。

Domain Managementの設定は、裏で Route53 と連動しています。

Route 53 を確認すると

  • Hugo を配信するサブドメイン(CloudFront のCNAME)
  • ACM(無料のTLS 証明書サービス)のDNS検証用ドメイン

のレコードが追加されていました。

なお、CloudFrontとACM のリソースは、ユーザーのAWSアカウントには作成されません。

別ブランチ用パイプラインも作成

運用によっては、本番環境に反映する前に、開発環境で一旦レビューを行うワークフローを採用しているケースがあります。

そのようなケースのために、開発用ブランチをデプロイするパイプラインも用意してみましょう。

先程作成したアプリのトップページで "Coonect branch" のボタンをクリックします。

ブランチの選択画面が表示されるため、プルダウンから新規にデプロイしたいブランチ(今回はdevelop)を選択するだけです。

先程と同じく、amplify 専用のドメインが割り振られるため、Domain management からカスタムドメインを割り振ります。

追加したドメインが AVAILABLE になれば設定完了です。

このドメインにアクセスし、選択したブランチのコンテンツが表示されていることを確認してください。

開発環境ということを考慮し、Basic認証によるアクセス制限をかけることもできます。

AWS Amplify Console の利用費を試算する

AWS Amplify Console は従量課金を採用しています。

種類 利用費 ビリングレポートの項目 参考価格
BUILD & DEPLOY $0.01/ビルド時間 $0.01 per build minute (4 vCPU, 7 GB Memory) CodeBuild の build.general1.medium(4 vCPU, 7GB Memory)は $0.01 per build minute(Linux)
artifacts ストレージ $0.023/GB $0.023 per GB build artifacts stored S3標準ストレージの場合、最初の50TB/月までは $0.025/GB(東京リージョン)
インターネットへの配信 $0.15/GB $0.15 per GB served (data transfer out) CloudFront 最初の10TB/月までは $0.114/GB(東京エリア)

参考価格列には、裏で動作していると思われるサービスの東京リージョンでの単価を記載しました。

この価格表をもとに

  • 1ヶ月は30日
  • 1ヶ月は20営業日
  • 1ビルドあたり3分かかる
  • 毎日2回ビルド
  • ビルドされた artifacts の平均サイズは 25MB
  • 毎日1GB分のデータ配信

の前提で試算します。

BUILD & DEPLOY の利用費

1ヶ月あたりのビルド時間は、次の計算式から600分です。

10(build/day) * 20 (day/month) * 3 (min/build) = 600 min

そのため、BUILD & DEPLOY の利用費は $0.01/minute * 600 minute = $6.0 です。

artifacts ストレージ の利用費

1ヶ月のArtifactsの累積サイズは、次の計算式から4.88GBです。

10(build/day) * 20 (day/month) * 25 (MB/build) = 5000 MB = 4.88 GB

そのため、artifacts ストレージ の利用費は $0.023/GB * 4.88GB = $0.11 です。

インターネットへの配信の利用費

1ヶ月あたりのデータ配信量は 30 (day/month) * 1 (GB/day) = 30 (GB/month) です。

そのため、インターネットへの配信の利用費は $0.15/GB * 30 (GB/month) = $4.5/month です。

月額利用費総額

これらを合計すると、1ヶ月の利用費は $10.61 となります。

最後に

AWS Amplifyコンソールを使い、Hugoベースのサイトを構築する方法を紹介しました。

AWS Amplifyコンソールからウィザード形式で画面をポチポチするだけで、Hugoのビルドパイプラインと配信システムを構築できました。

シンプルなワークフローが求められ、細かな制御が不要で、インフラ面でも頑張りたくない場合や、AWSの色々なサービスを使いこなす学習コストを割けない場合、有力な選択肢の一つになると思いました。

一方で、AWS Amplify Consoleが裏で利用しているAWSの各種サービスはブラックボックス化されており、カスタマイズの要素はかなり限定的です。

  • 任意のブランチでビルドを走らせたい
  • ビルド結果をGitHubに戻したい(現在の通知連携はメールのみ)

というような細かい制御が必要な場合は、AWS Code系サービスを組み合わせて、テイラーメードなパイプラインを構築してください。

それでは。

参考