(-> % read write unlearn)

My writings on this area are my own delusion

AWSのサービスとアーキテクチャのベストプラクティスを体系的に学べる『Amazon Web Services 定番業務システム12パターン設計ガイド』

Amazon Web Services 定番業務システム12パターン 設計ガイド 』を読みました。とても良い本でした。タイトルからAWS初心者向けかと思ったんですが、既にAWSでのシステム運用経験がある中級者の人でも楽しめます

アーキテクチャだけでなくAWSのサービス自体の説明が豊富

典型的な各種利用シーンについて、アーキテクチャ設計の側面から解説しているのですが、実際にはそのアーキテクチャで使用するAWSのサービスを結構きちんと説明しれくれているのが嬉しいです。

基本的なサービスから順に理解していける構成

最初のほうの章ではEC2やS3、RDSなどといいたド定番のサービスについてもしっかり説明があります。初心者の人でも最初から読み進めていくことで順を追って理解できる構成になっています。

扱っているサービスが幅広い・新しい

2016年06月にGAになったばかりの EFS *1 や、API Gateway、Lambda といったサービスの説明も入っています。

以下に、扱っているサービスや機能を節毎にまとめてみました。 見てもらうと、その構成の秀逸さと網羅性の高さが分かると思います。


  • その節で初めて登場する、またはその節で大きく解説されるサービスを太字にしています。 EC2やELBなど頻繁に登場するサービスは2度目以降の登場では省略しています。

【基本編】

1章 Webシステム

  • 1-1[パターン1]キャンペーンサイト
    • VPC
    • EC2, HVM(完全仮想化)/PVM(準仮想化)
    • EIP
    • EBS
    • Route53
  • 1-2[パターン2]コーポレートサイト
    • S3
    • Cloud Front
    • ELB, SSL Termination
    • AZ
    • EBS, Provisioned IOPS, EBS Optimized
    • RDS, Multi-AZ, マイナーバージョン自動アップグレード, メンテナンスウィンドウ
  • 1-3[パターン3]性能重視のイントラWeb
    • Cloud Watch
    • Auto Scaling
    • Direct Connect
    • ElastiCache
    • RDS for Aurora
    • AMI
  • 1-4[パターン4]可用性重視のイントラWeb

2章 ストレージシステム

  • 2-1[パターン5]バックアップ
    • Glacier, ライフサイクル設定
    • Storage Gateway, ゲートウェイ補完型ボリューム, ****
    • オンプレミスDB と AWS EBS 間のDRBD
    • S3, Versioning, Server Side Encryption
    • RDS, 自動バックアップ
    • Direct Connect
    • サーバーワークス社のDRスターターパック
  • 2-2[パターン6]ファイルサーバー

3章 データ分析システム

  • 3-1[パターン7]構造化データの分析
    • Red Shift
    • AWS パブリックデータセット
    • データ連携ツール: Flydata SyncFlydata Direct
    • データ分析ソフト: Tableau Software
  • 3-2[パターン8]非構造化データの分析
    • Elastic Map Reduce (EMR) Hive
    • Tableau Server
    • データ連携ツール: Fluentd

【応用編】

4章 クラウドネイティブ

  • 4-1[パターン9]サーバーレスのインフラ
    • API Gateway
    • Lambda
    • ジョブ管理ソフト: WebSAM JobCenterコミュニティAMI
    • CloudFront over API Gateway

5章 アプリケーションの高速開発

  • 5-1[パターン10]サーバーアプリの高速開発
    • CodePipeline
    • CodeDeploy
    • Elastic Container Service (ECS)
    • ECS-optimized AMI (Dockerエージェントと ECS Agent がセットアップ済みのAMI)
    • リザーブドインスタンス
    • CIツール: Jenkins
  • 5-2[パターン11]モバイルアプリの高速開発
    • AWS Mobile SDK
    • Device Farm
    • Cloud Formation
    • Device Farm Jenkins Plugin

6章 ハイブリッドクラウド

  • 6-1[パターン12]オンプレミス環境との連携
    • VM Import
    • オンプレのリソース状況をトリガーにした Auto Scaling
    • Direct Connect

メジャーなサービスからスタートして最新のサービス、そしてサードパーティのソフトやサービスまで本当に幅広く取り扱っています。 また、機能の多いサービスは、最初に登場するときは基本的な使い方のみで高度な機能は後続の節で紹介されるような構成です。 良い復習になりました😋


このブログの全ての意見は個人のものであり、所属する団体や企業とは一切関係がありません。 All opinions expressed are solely my own and do not express the views or opinions of my employer.

*1:書籍内ではプレビューの時点の情報をもとに記載されている

Golang 製の爆速 Static Site Generator 「Hugo」のはまりポイント12

前回の「Static Site Generator」エントリの続きです。 Static Site Generator の Hugo を使ってみました。 ビルドが爆速なのがすごく良いんですが、いくつかはまったのでまとめておきます。 実際には12個もはまってないんですが。

1. デフォルトのテーマ(theme)が設定されていないのでいきなり起動しても何も表示されない

Hexoの場合

# hexo コマンドのインストール
npm install hexo-cli -g
# 新しいサイトを作成
hexo init blog && cd blog && npm install
# ビルドしてサーバを起動
hexo server

とするだけで、デフォルトで設定されたlandscapeというthemeで起動し、 http://localhost:4000/ を開けばトップページが見れます。

Hugoの場合

# Mac-OSの場合 Homebrew で hugo コマンドをインストール
brew update && brew install hugo
# 新しいサイトを作成
hugo new site bookshelf && cd bookshelf
# ビルドしてサーバを起動
hugo server

という手順を踏んでサーバを起動しただけでは、何も表示されません。 thmemeが何も設定されていないからです。*1

2. テーマ(theme)って何?

デザイン・テンプレートです。 既存のthemeを活用してベースのデザインを作成できます。 もちろんカスタマイズすることができます。 HTMLやCSSやJSなどのファイル群で構成されます。 JekyllやHexoでもthemeという用語を使うので、全然はまりどころじゃないかもしれないですね。

3. themeはGithubなどからcloneしてこないといけない

themeを設定するにはthemesディレクトリ配下に、OSSとしてGitHubに公開されているthemeをgit cloneしてくるのが、最も手っ取り早い方法です。*2

例えば、以下のようにanybodyhomeというthemeをインストールします。

mkdir themes
cd themes
git clone https://github.com/lasseborly/anybodyhome.git

そして、適用するthemeを以下のように指定してサーバを起動します。

hugo server --theme=anybodyhome

これで http://localhost:1313/ ((ローカルの1313ポートが既に使用されている場合は、適当なエフェメラルポートがアサインされます。コマンドの出力で確認してください。))を開けばトップページが表示されます。

4. themeは実はまとめて全てcloneしてこれる。

themesディレクトリにはいくつでもthemeをcloneしておけます。 https://github.com/spf13/hugoThemes リポジトリにはOSSで公開されているthemeがまとまっており、これをcloneすればまとめてインストールできます。

git clone --recursive https://github.com/spf13/hugoThemes.git themes

あとは、hugo server --theme=<試したいtheme名>で色々試してみて気に入ったものを見つけたらconfig.tomltheme = "anybodyhome"などのように記述すればOKです。 起動時に--theme指定がない場合にはconfig.tomlの設定が使用されます。

5. 記事のメタデータの書式がToml

hugo new post/foo.mdと実行すると/content/post/foo.mdという記事のファイルの雛形が生成されます。 このファイルの先頭には、自動でメタデータが書かれています。 こんな感じです。

+++
date = "2016-09-04T16:01:08+09:00"
draft = true
title = "foo"

+++

これはTomlという形式です。 メタデータには、他にcategoriestagsslugなどなどの値があるのですが、 categoriestagsには複数の値が指定でき、その場合はTomlの配列の形式で書きます。 例えばこんな感じです。

+++
date       = "2016-09-04T16:01:08+09:00"
lastmod    = "2016-09-11"
draft      = true
title      = "foo"
categories = ["programming", "golang"]
tags       = ["golang", "toml", "hugo"]
notoc      = true
+++

6. 設定ファイルもToml

config.tomlという見慣れない拡張子のファイルがサイト全体の設定ファイルです。 RustのビルドツールのCargoでも採用されているし、実は結構メジャーなのかもしれません。

  • Tomlの基本の構文は、改行区切りで設定を列記していくかたちです。iniとかに少し近いです。
  • 行コメントの記号は、#です。
  • """"""で囲ってやれば複数行の文字列リテラルとなります。
  • 添字配列は、["apple", "orange", "grape"]のように[]で記述します。
  • Tomlが気に入らない場合はconfig.yamlconfig.jsonなどを用意すればtoml以外の形式も使用可能です。

Tomlは連想配列の構文などもあり、シンプルながらかなり表現力豊かですが、Hugoの設定としては上記を知ってればだいたい大丈夫な気がします。 Tomlの詳しい文法はQiitaにもいくつか投稿されています。

7. 記事のURLの変え方

設定ファイルの[permalinks]以下にpostという設定値を追加すればOKです。 [permalinks]自体がなかったらそれも追加してください。

例えばファイル名の拡張子を除いた文字列をURLに使用するなら:filenameというパラメータを使います。

[permalinks]
  post = "/post/:filename"

日付やメタデータtitle値を使うならこんな感じ。

[permalinks]
  post = "/:year/:month/:title/"

8. テンプレートのカスタマイズ

themeでインストールしたテンプレートをカスタマイズ/拡張し管理する方法は2つあると思います。

1つは、themeの中で使われているテンプレート・ファイルのうち上書きしたいものをlayouts/にコピーし、好きに書き換えることです。 例えば、
themes/anybodyhome/layouts/partials/footer.htmlというファイルは全体のフッタ部分を構成するHTMLのテンプレートです。 これを
layouts/partials/footer.htmlにコピーして編集すればOKです。

ただし、この方法はテンプレート・ファイル単位での上書きになってしまうところがちょっと嫌です。 なぜかというと、さっきのfooter.htmlならまだ良いのですが、記事自体のページのテンプレートのHTMLをほんのちょっと修正したいような場合にもthemes/anybodyhome/layouts/_default/single.htmlという記事全体のHTMLのテンプレートをまるまるコピーしないといけないからです。 適切にHTMLがパーツ化されていて、修正したい部分が小さなパーツになっている場合には悪くないんですが。

2つめは、使用するthemeをGitHub上でフォークして修正し、それをgit cloneして使用する方法です。 こっちのほうが差分が分かりやすくなるので全然おすすめだと思います。

9. GolangTime.timeの日付フォーマット表記が独特

Hugoで採用されているGolangのテンプレートエンジンの構文は、私は初めてだったので全然慣れませんでした。 しかし、既存のthemeを使う分には見よう見まねでも結構なんとかなります。

1点はまったのが日付のフォーマットの変更です。 Javaなんかだと%YYYY-%MMなどのように%を使ってフォーマットを指定しますが、GolangではMon Jan 2 15:04:05 -0700 MST 2006のように実際の日付の値を使用してフォーマットを指定します。

つまり、

Mon Jan 2 15:04:05 -0700 MST 2006

この日時が重要なようです。 1月なのを勝手に2月とか3月にしてはいけません。

例えば、記事のページ内にメタデータで記述したdate値を表示するテンプレートの構文は

{{ .Date.Format "2006/01/02" }}

のようになります。 これは、テンプレートエンジンの仕様というよりはGolangtimeパッケージの仕様のようです。

10. 404ページ

デフォルトだと指定したURLのリソースが見つからない場合用の404ページがありません。*3 GitHub Pages でホストする場合には、layouts/404.htmlを用意しておけばOKです。 404ページとして生成・使用されます。 layouts/404.htmlは単にルートに404.htmlを生成するだけなので、GitHub Pages以外の環境でもWebサーバを適切に設定すれば上記のファイルを404ページとして使用可能です。 詳しくはhttps://gohugo.io/templates/404#automatic-loadingを参照してください。

11. References

もはやはまりどころでは全くないのですが、カスタマイズしたりする時によく参照するリファレンス達です。

URL 説明
https://gohugo.io/overview/configuration 設定項目とデフォルト値の一覧 |
https://gohugo.io/templates/functions/ テンプレートで使用できる関数の一覧
https://gohugo.io/templates/variables テンプレートで使用できる変数の一覧
http://themes.gohugo.io/ たくさんのOSSのテーマがまとまっている

12. 動作が早過ぎる

最後に。 むしろ良いことなんですが、最初にhugo new site bookshelfしたとき、レスポンスが早過ぎて失敗してるのかと思いました。 スリープ入れるようにPullRequestすると安心できるかもしれません。

という感じで、皆様幸せなHugoライフを!

*1:もちろん手動でトップページを作っても良いです。

*2:もちろん、themeを使わずに自前で全てデザインすることも可能です。

*3:themeによるのかな?

Static Site Generator (静的サイト・ジェネレータ)とは

Static Site Generator の Hugo を使ってみました。 Hugoについての記事を書こうと思ったのですが、その前に Static Site Generator (静的サイト・ジェネレータ)とは何かについて自分なりに整理していたら記事が長くなってしまったので、この記事に独立させてみました。


Static Site Generator (静的サイト・ジェネレータ)というのは、ウェブサイトを作るツールです。 GithubPagesでサポートされているJekyllが最も有名ですよね。 自分は、今までJekyllしか使ったことがありません。

さて、ウェブサイトを作るポピュラーなツールは何でしょうか。 すぐに思い付くツールとしてはWordPressがあります。 WordPressは、サイト内の更新コンテンツのデータをRDBで管理します。 そして、そのコンテンツ・データをPHPのプログラムが取り出して動的にHTMLを生成します。 更新コンテンツの入力方法としては、WordPressの管理画面上のエディタなどで入力するのが普通でしょう。

一方で、Static Site Generator は、更新コンテンツをファイルとして管理します。 更新コンテンツを記述したファイルは、サーバにアップロードする前にHTMLに変換する必要があります。 ウェブ・ブラウザからのリクエストに対しては、RDBのデータから動的にHTMLを生成してレスポンスするのではなく、事前に生成済みのHTMLファイルを静的にレスポンスします。

WordPressのような動的にHTMLを生成する方式の利点は、更新コンテンツの入力や、そのコンテンツの公開/削除などの全てのワークフローをウェブで完結することができるという点です。*1 FTPソフトでファイルをアップロードしたり、ローカルでビルドしたりといったような作業は基本的に発生しません。 これは、ITリテラシーの低い人にとってはとてもありがたいことです。 一方で、その仕組み自体はやや複雑です。アーキテクチャとしてRDBを必要とするし、内部でPHPのプロセスも動いています。 当然、カスタマイズやトラブルシュートにはPHPRDBの知識が必要になってくることがあります。

Static Site Generator の利点は、全てのコンテンツをファイルで管理することができるという点です。 PHPなどのプログラミング言語は登場しません。*2 構成と仕組みがとてもシンプルです。 Static Site Generator の多くは、更新コンテンツをマークダウンで書くことをサポートしています。 特にプログラマなどにとっては、自分の慣れたエディタで慣れたマークダウン形式で書けるというのは嬉しいことです。 一方で、サイト更新のワークフローはITリテラシーの低い人にはややハードルが高いかもしれません。 理由は、ビルド環境を整えなければいけないことと、コンテンツの差分管理をGitなどのSCMで行うからです。

Static Site Generator は現在ではたくさんの実装がOSSで提供されています。 それらのまとめとしてはTop Open-Source Static Site Generators - StaticGenが見やすいです。 一番スターが多いのはやはりJekyllで、その次が電子書籍の出版などでもよく使われているらしいGitBookです。 今回自分は、次点となっているJavascriptで実装されたHexoGolangで実装されたHugoを簡単に試してみて、最終的にHugoを採用しました。


Hugoについては、次の記事に続きます。

*1:一度セットアップしてしまえば、です。セットアップやメンテナンスには当然別のレベルのITリテラシーが必要です。

*2:サイトの運用上必要ないというだけで、ビルドはプログラムが処理しています。