omuronの備忘録

個人的な備忘録

「Nu みちしるべ」フォントの中身を見る

kokagem.sakura.ne.jp

「Nu みちしるべ」は、日本の道路標識に基づいて作ったフォントです。標識の数字に興味を持ったのが切っ掛けで作りましたが、数字だけだとフォントとしてあまり面白くないので、周りの赤い円を含めて自動的に組み立てられるように作り込んでみました。道路標識の全種に対応しているわけではないです。用途は…何かあるでしょうか。

道路標識を表示できるフォント「Nu みちしるべ」が非常に話題になってます。
さゆぬ氏が作成したOpenTypeフォントで、Boothにて公開されており、無料で入手できます。
非常に面白い動きをしているのですが、どうやって実現しているか気になりました。

標識を自動的に組み立てるには、アプリケーションが OpenType‐フォントの高度な機能に対応している必要があります。非対応のアプリしか持っていない場合、手動で画像編集をして部品を組み立てる事になりますが、その部品としてフォントを利用できます。

OpenType フォントの機能を使っているとのことなので、フォントの中身を見てみたいと思います。

ライセンスの確認

フォントの改変と頒布
このフォントに由来するデータを使って新たなフォントを作成し、それを私的な環境にインストールできます。それを頒布してはいけません。ここで言う「新たなフォント」とは、一字づつ切り出した画像など、フォントと同然に使用できるデータを含みます。

フォントの私的な改変は許諾されております。
改変ができるのであれば、中身をみるという行為は問題なさそうに思われますので、実装を見てみたいと思います。
(問題ありそうであれば削除します)

XML ファイルに変換する

fonttools に付属する ttx コマンドを利用して、XML ファイルにして覗いてみたいと思います。
Python 3 系をいれており、 pip が使えるなら以下のコマンドでインストールできます。

$ pip install fonttools

fonttools を入れたら、 ttx コマンドでフォントを変換します。

$ ttx NuMichishirube-Regular-v1.0.0.otf 

これで NuMichishirube-Regular-v1.0.0.ttx という xml 形式のファイルが出来上がりました。
テキストファイルなので、適当なエディタで開いて眺めていきたいと思います。

XML ファイル見る

全体で、25,000行ぐらいのファイルが出力されました。
テーブル単位で構造化されているので気になるところを見ていきます。

GlyphOrder

フォントに入っているグリフがGID 順に表示され、人が読む用の名前も付与されて出力されてます。

  <GlyphOrder>
    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
    <GlyphID id="0" name=".notdef"/>
    <GlyphID id="1" name="space"/>
...
    <GlyphID id="174" name="alignEnd"/>
    <GlyphID id="175" name="alignEndSpace"/>
  </GlyphOrder>

フォントに必ず必要な .notdef を含めて176文字のみ収録されているようです。

また、数字ごとに4種類のグリフパターンが収録されております。

    <GlyphID id="66" name="zero"/>
...
    <GlyphID id="76" name="zero.narrow"/>
...
    <GlyphID id="86" name="zero.small"/>
...
    <GlyphID id="96" name="zero.small.narrow"/>

GPOS

GPOS より(DeepL 翻訳)

Glyph Positioning table (GPOS) は、フォントがサポートする各スクリプトや言語システムにおいて、洗練されたテキストレイアウトやレンダリングを実現するためのグリフ配置を正確に制御します。

ここがとにかく大きい。20,000行近くあります。
このフォントの肝はここにありそうです。

  <GPOS>
...
      <Lookup index="0">
        <LookupType value="8"/>
        <LookupFlag value="0"/>
        <!-- SubTableCount=265 -->
        <ChainContextPos index="0" Format="3">
...

LookupType 8 のサブテーブルが265個あり、とても沢山のパターンを処理していることが見受けられます。
この LookupType 8 がどういう制御をしているか 仕様 を確認します。

LookupType 8: Chaining Contextual Positioning Subtable A Chaining Contextual Positioning subtable

文脈に応じてテキストの位置調整を行うことができます。
言葉で説明するより、仕様書の表を見るほうがわかりやすいと思うのですが、前後の文字に応じていい感じに調整できる機能ですね。

f:id:omron:20201107135631p:plain

この機能を用いて特殊な並びになったときに位置調整を行っているようです。

標識として組み立てるには全部品を丸括弧 ( ) か波括弧 { } で囲み、例えば「(○40)」のように書きます。

公式より引用しましたが、「丸括弧」などを利用して判断している様です。

GSUB

GSUB より(DeepL 翻訳)

グリフ置換 (GSUB) テーブルは、アラビア文字のカーシブに連結された形などのスクリプトの適切なレンダリングや、合字などの高度なタイポグラフィ効果のためにグリフを置換するためのデータを提供しています。

グリフを置換するテーブルを利用して、丸括弧を消したり、文字の種類を切り替えたりしてそうです。

  <GSUB>
...
      <Lookup index="3">
        <LookupType value="6"/>
        <LookupFlag value="0"/>
        <!-- SubTableCount=72 -->
        <ChainContextSubst index="0" Format="3">

GSUB は LookupType 6 のサブテーブルが72個あり、一番大きい処理になってます。
GSUB LookupType 6 も GPOS LookupType 8 と同様に文脈に応じて文字を置換する機能です。

試してみる

FontGoggles を利用して、「(○40)」の入力を可視化してみます。

特殊処理のきっかけとなる丸括弧を入力せず「○40」と入力した場合、入力した文字がそのまま表示されました。

f:id:omron:20201107141329p:plain

「(○40)」と入力した場合は、丸括弧が空文字に置換され○の幅が変更されていることがわかります。

f:id:omron:20201107141526p:plain

「(○100)」と入力した場合は、数字も狭いものに置換されてますね。

f:id:omron:20201107141749p:plain

まとめ

OpenType の高度な組版機能 GPOS / GSUB を利用し、文脈に応じた処理を用いて表現していることがわかりました。
本来この機能は、アラビックとかタイ語とか文脈に応じてグリフが変化する言語を表現するためのものです。
これを利用してこんな面白い表現をするなんて素晴らしいアイデアだと感じました。
柔軟なアイデアを思いついて形にできる力が私も欲しい!

「Serverless Meetup Japan Virtual #10」 #serverlessjp 受講メモ

Serverless Meetup Japan Virtual 気がついたら #10 になってた...
備忘録すら取れてなかったので、久しぶりの Serverless Meetup Japan Virtual メモ。

serverless.connpass.com

ハッシュタグ#serverlessjp
今日の動画のアーカイブ

AppSync 使ってみた!サーバレスライブコマースの構築

講師:三浦一樹 (北海道テレビ放送)

speakerdeck.com

札幌は初雪だそうです!
動画を見ながらお買い物ができるサービスの構築について解説。
今日、夜中本番稼働させるから何かあれば突っ込んでほしいとw。

AppSync :フルマネージドの GraphQL サービス。
「AppSync を何人もから進められたのでわからないけど使ってみた。」という行動力がさすがです。 詳しくないといいながらプレゼンまでできるのは本当にすごい。
「マネコンで Mutation 実行して反映していく」とか、運用の割り切り方も素晴らしいと感じました。

サーバーレスアーキテクチャを採用する際のコストに対する重要な考え方

講師:堀家隆宏 (Serverless Operations)

serverless.co.jp

上記ブログのプレゼンでした。

サーバーレスのコストを考える時はAWS自体のコストだけでなく、TCO(Total Cost of Ownership)で考えることが重要です。

Serverless は、軽く使うとほんとに安いけど、ある程度量が大きくなると高くなるから注意。
APIG 特有の Lambda Authorizer 使いたいとか理由がある場合は使えばいい。
ただ、人件費に比べるとたかが知れてる場合が多いから、ちゃんと考えましょうと。

「costless」というサーバーレスの日々のコストの最適化を行うサービスのベーターパートナー募集中とのこと。

f:id:omron:20201104225122p:plain

興味ある方は Serverless Operations までお問い合わせくださいと。

その他

Serverless Advent Calendar 2020 - Qiita 募集中。

所感

何らかの作業をする場合 CLI 準備してやることや CloudFormation 準備してやることが多いのですが、あまりこだわらず手軽にやる場合はマネコンもありだなーと改めて思いました。
自己満足の作業にならないか? GUI だとミスしやすくないか?とか問題がないか考えて取捨選択しないと駄目ですね。

「JAWS-UG朝会 #14」 #jawsug_asa 受講メモ

jawsug-asa.connpass.com

布団からでるのが辛い季節になってきたけど、這い出てラジオ体操から始まります。

セッション① AWSコスト最適化のポイント~ここまでできるコスト削減~

講師:株式会社アイディーエス 小寺 加奈子さん

コスト削減を実現するために RI と SP の話。
SP が Lambda にも今年2月から対応したとのこと。

Reserved Instans は名前の通りインスタンスを予約するので、(リージョン固定とか)融通は効かないけど割引率が大きかったり、必ずインスタンスを起動できたりするのがメリットと思います。

一方、Saving Plans は、必ず払うお金をコミットすることにより勝手に割引をしてもらう方式。
何も考えずお金だけ払う約束すれば AWS がいい感じに割り引いてくれる。

セッション② 動画配信 × お買い物 × サーバレス

講師:北海道テレビ放送株式会社 三浦 一樹さん

speakerdeck.com

VPC わからんからサーバーレスで構築しているとのこと。
Amplify で GraphQL 利用したりして、ビジネスでやりたいことに特化してバックエンドは活用するだけという AWS のお手本のような使い方。

AWS Elemental Link

aws.amazon.com

AWS Elemental Link は、カメラや動画制作機器などのライブ動画ソースを AWS Elemental MediaLive に接続するデバイスです。

動画配信スタジオから AWS Elemental MediaLink に接続して動画ソースを送り込むデバイス
AWS アカウントと紐付けて出荷される。

Backend

GraphQL を活用。
Amplify - AppSync - DynamoDB を利用してバックエンドを構築。

LT① CloudEndureでVPSからAWSへ移行

講師:株式会社サーバーワークス 小倉 大さん

CloudEndure

  • AWS への以降を簡単にできるツール。
  • 無料で利用可能
  • 物理と仮想環境両方に対応

さくらの VPS にある WordPrerss を移行した。

LT② Organization周りの機能

講師:株式会社ターンアンドフロンティア 富松 広太さん

www.slideshare.net

Organization で使う場合と普通で使う場合の違いについて。

CloudFormation Stacksets

親アカウントから特定の OU(Organization units) を指定して CFn を実行。
特定 OU へのアカウント紐付けに連動した自動適用・自動削除も可能

CloudTrail

各子アカウントでの設定が不要に。
親アカウントで CloudTrail 作るときに組織内の全てのアカウントを対象にできる。 ただし、特定の子アカウントだけ無効にしたり、子アカウントから確認できない。

Config

各子アカウントでの設定が不要に。
親アカウントの設定で「組織を追加する」とするだけ。

LT③ Lightsailでワンコイン開発環境をつくる

講師:運用設計ラボ合同会社 波田野 裕一さん

speakerdeck.com

Lightsail

  • 月額課金。EC2 より安い。PrivateLink も可能
  • APICLI からほぼ全ての機能を操作可能
  • ユーザーデータと EIP にも対応
    • リプレースが楽
  • EC2 との違い
    • VPC 使えない、Public になる。
    • インスタンスプロファイル使えない
    • AMI 使えない
    • AutoScaling 使えない
    • RI できない
  • 月額 366円ぐらい

所感

朝から勉強会するともう一日仕事した感が達成できる!
というものの仕事は始まるの、でサクッと公開して仕事します。

i18nとL10nについて言語化してみる

なかざんさんのこのツイートを見て、i18nL10nについて自分の理解を言語化してみようと思いました。

自分の経験と軽く調べたことをもとに記載するので、間違いなどもあると思いますが、あくまで自分の理解をまとめたいと思います。

i18n

ソフトウェアの世界においては、複数の「地域」や「言語」を扱えるような仕組みを実装すること理解している。

国際化と地域化 - Wikipedia

「国際化」internationalizationはたびたびi18nと略される。

Wikipedia によると、i18n は国際化のこと。
「国際化」対応の仕組みを、自ら実装することもあれば、予め準備されたプラグインなどを利用する場合もある。

地域について

「地域」≒「国」と読み替えて実装することが多い。
台湾など政治的にも扱いが難しい場合もあるのでこのあたりは配慮が必要。

Web アプリケーションの場合、この判定には GEO ロケーションを利用する。
Amazon CloudFront を利用すれば判別が可能。

docs.aws.amazon.com

CloudFront は、サードパーティーの GeoIP データベースを使用して、ユーザーがいる場所を判別します。IP アドレスと国とのマッピングの正確さは、リージョンによって異なります。最近のテストによれば、全体的な正確性は 99.8% です。

ロケーション情報をもとに適切な国に割り振っていく。
「国」は、ISO 3166-1 alpha-2 を利用して2文字で表現することが多く、ドメインやパスで切り替える。

言語について

ソフトウェアの世界においては、複数の「文字」や「音声」を扱えるような仕組みを実装すること理解している。
いわゆる翻訳をしている状況。

「文字」は、ISO 639 を利用して2文字で表現することが多く、パスやクエリパラメータで切り替える。
言語の判定は、リクエストヘッダー内の accept-language を参照する。
accept-language は、複数列挙可能で優先順位付けられているため、ソフトウェアで実装している表示可能な言語を優先的にだす。

地域と言語の切替例
Apple

Apple のサイトでは、ここ で明示的に「国/地域」を変更することができる。

Sony

https://www.sony.com/ に日本からアクセスした場合、以下のように最適なサイトに促される。

f:id:omron:20201025092434p:plain

i18n まとめ

i18n は、基本的には言語の切り替えができる仕組みを作ることと考えます。
「日本」では「日本語」を主に使い、公用語が一つしか無いので普段意識し辛い状況です。
しかし、ソフトウェアを作る場合には公用語が複数ある国のことも考えておく必要もあります。

リツイート元の上記のケースは、「US」という国で日本語を優先的に使いたい人、ようするに在米日本人に向けて表示する場合であれば最適化されている状況と思います。
一方、「日本」に住んでいる「日本語」話者に向けて表示する必要があるかどうかは微妙です。

L10n

L10n は、localization の略。
i18n を行うことで翻訳の実装はできるようになる。
L10n を行うということは、言語以外にももう一歩踏み込んで、法律や通貨などその地域に住んでいる人の風習に合わせて自然に使えることを行うと理解している。

日本語で表示はできているがドル決済しかできない場合などは、完璧にローカライズができていないともいえる。
完璧にローカライズを目指す場合は、現地に法人が無いと難しいかもしれない。

まとめ

i18n で仕組みを構築し、ターゲットとする地域の L10n を行ないます。
Web アプリケーションの場合は、GEO ロケーションと accept-language から判断して、ユーザーに向けた最適化を目指します。
(ネイティブアプリケーションの場合は、OS から取れる情報をもとに実装すると思います。)

アクセス場所と言語を意識して実装する必要があると考えます。

「Amazon Complete Font Set」の中身を見る

以下の Developers.IO を読んでて、 Amazon Complete Font Set というものがあるのを知りました。

dev.classmethod.jp

ということで、このフォントの中身を見てみたいと思います。

確認してみる

フォント一式ダウンロード

f:id:omron:20201019154100p:plain

ここ から、わかりやすく書いてある「Download」ボタンを押して取得します。
中身を解凍して見てみると、以下のファイルが確認できました。

$ ls -la
total 44152
drwxr-xr-x@  11 omuron  staff       352 10 19 17:37 .
drwx------+ 316 omuron  staff     10112 10 19 17:37 ..
-rwxr-xr-x@   1 omuron  staff     40049  3  7  2017 Amazon Ember Licensing Guidelines.pdf
drwxr-xr-x@  10 omuron  staff       320  3 30  2020 Bookerly
drwxr-xr-x@   6 omuron  staff       192  3 30  2020 Bookerly Display
drwxr-xr-x@  15 omuron  staff       480  3 30  2020 Ember
drwxr-xr-x@  11 omuron  staff       352  3 30  2020 Ember Condensed
drwxr-xr-x@   8 omuron  staff       256  3 30  2020 Ember Display
-rwxr-xr-x@   1 omuron  staff  13120607 12 17  2019 amazon_jp_morisawa_font.zip
-rwxr-xr-x@   1 omuron  staff   2617324  4 18  2019 amazon_typography_all.zip
-rwxr-xr-x@   1 omuron  staff   6822095  4 18  2019 amazon_typography_webfonts.zip
  • Amazon Ember Licensing Guidelines.pdf
  • Bookerly
    • Bookerly フォント
  • Bookerly Display
    • ディスプレイ用 Bookerly フォント
  • Ember
  • Ember Display
    • ディスプレイ用 Amazon Ember フォント
  • Ember Condensed
    • Amazon Ember コンデンスフォント
  • amazon_jp_morisawa_font.zip
  • amazon_typography_all.zip
  • amazon_typography_webfonts.zip
    • Web 向けフォント一式

それぞれのファイルを確認したいと思います。

Amazon Ember Licensing Guidelines.pdf の確認

ライセンスファイルです。
まずはこれを確認しないことには始まりません。

All of these fonts were developed under contract for Amazon - as a result Amazon owns them fully outright. To include these designs in your work there are no licenses payments, no royalties, no copyright or attribution notices required.

このフォントは Amazon 向けに作られたもので、ライセンス料を払わなくても利用ができそうです。

The font itself carries the proper ownership and copyright information in the header metadata of the font and Amazon does not require any additional attribution or protections when using the font.

ただし、フォント自体の著作権は、フォントのメタデータに記載しているとのこと。
なので、フォントの中身の著作権情報を覗いてみたいと思います。

フォントのメタデータを見てみる。

フォントのメタデータを見るために、 fonttools を利用したいと思います。
以下の環境で試してます。

$ python --version
Python 3.8.5
$ pip --version
pip 20.2.4

Installation に従ってインストール。

pip install fonttools

準備ができたので、 name テーブル の情報を見てみます。

>>> from fontTools.ttLib import TTFont
>>> bookerly = TTFont("Bookerly/Bookerly-Bold.ttf")
>>> nameTable = bookerly["name"]
>>> nameTable.names
[<NameRecord NameID=0; PlatformID=1; LanguageID=0>, <NameRecord NameID=1; PlatformID=1; LanguageID=0>, <NameRecord NameID=2; PlatformID=1; LanguageID=0>, <NameRecord NameID=3; PlatformID=1; LanguageID=0>, <NameRecord NameID=4; PlatformID=1; LanguageID=0>, <NameRecord NameID=5; PlatformID=1; LanguageID=0>, <NameRecord NameID=6; PlatformID=1; LanguageID=0>, <NameRecord NameID=7; PlatformID=1; LanguageID=0>, <NameRecord NameID=8; PlatformID=1; LanguageID=0>, <NameRecord NameID=9; PlatformID=1; LanguageID=0>, <NameRecord NameID=11; PlatformID=1; LanguageID=0>, <NameRecord NameID=12; PlatformID=1; LanguageID=0>, <NameRecord NameID=14; PlatformID=1; LanguageID=0>, <NameRecord NameID=18; PlatformID=1; LanguageID=0>, <NameRecord NameID=0; PlatformID=3; LanguageID=1033>, <NameRecord NameID=1; PlatformID=3; LanguageID=1033>, <NameRecord NameID=2; PlatformID=3; LanguageID=1033>, <NameRecord NameID=3; PlatformID=3; LanguageID=1033>, <NameRecord NameID=4; PlatformID=3; LanguageID=1033>, <NameRecord NameID=5; PlatformID=3; LanguageID=1033>, <NameRecord NameID=6; PlatformID=3; LanguageID=1033>, <NameRecord NameID=7; PlatformID=3; LanguageID=1033>, <NameRecord NameID=8; PlatformID=3; LanguageID=1033>, <NameRecord NameID=9; PlatformID=3; LanguageID=1033>, <NameRecord NameID=11; PlatformID=3; LanguageID=1033>, <NameRecord NameID=12; PlatformID=3; LanguageID=1033>, <NameRecord NameID=14; PlatformID=3; LanguageID=1033>, <NameRecord NameID=16; PlatformID=3; LanguageID=1033>, <NameRecord NameID=17; PlatformID=3; LanguageID=1033>]

NameID のコードについては こちら を参照。
name テーブルのレコード情報がわかったので、 nameID=0 の Copyright notice を取得してみます。

>>> notice = nameTable.getName( nameID=0, platformID=1, langID=0, platEncID=0)
>>> notice.toStr()
'Copyright 2014 Dalton Maag Ltd. Modification of this file requires prior written permission from Dalton Maag Ltd.'

Dalton Maag Ltd という会社のフォントで、著作権もこの会社に帰属するようです。

Amazon Ember も同様に見てみます。

>>> ember = TTFont("Ember/Amazon-Ember-Medium.ttf")
>>> nameTable = ember["name"]
>>> notice = nameTable.getName( nameID=0, platformID=1, langID=0, platEncID=0)
>>> notice.toStr()
'Copyright 2015 Dalton Maag Ltd. All rights reserved. This font may not be altered in any way without prior permission of Dalton Maag Ltd.'

こちらのほうが新しいですが、同じ会社のフォントですね。

WebFont の確認

amazon_typography_webfonts.zip というファイルを解凍して確認してみます。

$ ls amazon_typography_webfonts_5e593ec/webfonts/ | head
AmazonEmberCd_W_Bd.eot
AmazonEmberCd_W_Bd.woff
AmazonEmberCd_W_Bd.woff2
AmazonEmberCd_W_BdIt.eot
AmazonEmberCd_W_BdIt.woff
AmazonEmberCd_W_BdIt.woff2
AmazonEmberCd_W_Lt.eot
AmazonEmberCd_W_Lt.woff
AmazonEmberCd_W_Lt.woff2
AmazonEmberCd_W_LtIt.eot

以下の3種類のフォーマットが確認できました。
フォーマットが違うだけで、フォントとしては同じ内容と思われます。

  • .eot
    • IE8 以下向けなどのレガシーなブラウザ向けフォーマット
  • .woff
    • ブラウザ向けフォントフォーマット
  • .woff2
    • モダンブラウザ向けフォントフォーマット、圧縮率が高い

モリサワフォントの確認

以下のファイルが含まれています。

$ ls amazon_jp_morisawa_font/Fonts/
AM-JP-UDShinGoNTPr6N-DeBold.otf
AM-JP-UDShinGoNTPr6N-Reg.otf
AM-JP-UDShinGoNTPr6N-Light.otf
利用規約.txt

UD新ゴNT が3書体含まれていました。
jp とついているように、日本向けですね。
利用規約も日本語であります。

Amazonサイトに掲載されるバナー、クリエイティブ
・リンク先がAmazonのサイト内であるバナー、クリエイティブ
Amazonから発信するオフラインドキュメント・クリエイティブ

Amazon サイト内のみの利用のみに限定されているようでした。

まとめ

さすがの Amazon も自社でフォントの全ては作成していないようですが、Amazon 向けに作られて所有しているフォントのようでした。
もともとは、Kindle電子書籍閲覧用に作ったフォントでしょうか。
Amazon がフォントにもちゃんとこだわっていることが確認できました。

「[Online]nakanoshima.dev#12 Night Talk1」受講メモ #nakanoshima_dev

nakanoshima-dev.connpass.com

最近リアルでは行くことがない中之島のイベントです。

CloudFrontの最近のアップデートについて

PeeringDB

接続情報を共有するデータベースの PeeringDB
これ以外にもプライベートの接続もたくさんある。

AWS Global Infra Structure

infrastructure.aws

AWS のグローバルなインフラがグリグリうごいて見ることができて楽しい。

CloudFront 2020 Update

  • L@E Node12.x Python 3.8 サポート
  • オリジン接続の思考とタイムアウトが設定可能に
  • ビューワー接続用の新しい TLS1.2 ポリシー
  • キャッシュポリシーとオリジンリクエストポリシーを追加
  • 詳細なジオターゲッティングを行える位置情報ヘッダーが追加
  • リアルタイムログストリーミング
  • TLS 1.3 によるビューワー接続サポート
  • Brotli 圧縮のサポート
  • CloudFront クォータ 40Gbps -> 150Gbps, 100,000rps -> 250,000rps
  • キャッシュポリシーとオリジンリクエストポリシー
    • オリジンに転送するデータとキャッシュキーを分離
    • 同じキャッシュ設定やオリジン転送設定のポリシーを複数の Behavior から再利用

所感

AWS アップデート多すぎて追いつくのは難しいので、重要なところをピンポイントで聞けるのは嬉しい。
CloudFront でキャッシュキーを分離できれば、ユーザーごとで異なるキーでも同一キャッシュとかが実現できそう。

AWS H4B「AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!」受講メモ

pages.awscloud.com

AWS Hands-on for Beginners「AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!」が、初心者向けでわかりやすかったので、そのときの作業メモです。

作業内容

CodeCommit

リポジトリ test-repository 作成。

IAM Role

EC2 用 S3 Full Access ロール S3FullAccess4EC2 作成。

EC2

デプロイしたい Amazon Linux2 インスタンスを適当に作成して S3FullAccess4EC2 Role 紐付け。
デプロイ時に名前がわかるように Name タグに test-ec2 とつける。

CodeDeploy Agent

CodeDeploy を利用したいのでエージェントを ssh 接続してインストール。

sudo yum install ruby
wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

S3

アーティファクト保存用バケット test-bucket-artifact 作成。

CodeBuild

dev-build-test 作成して、以下の設定を行う。

  • Source
    • AWS CodeCommit
    • test-repository
    • Branch
      • develop
  • Environment
    • Amazon Linux2
    • Standard
      • 最新版
  • Artifact

IAM Role

作成された codebuild-dev-build-test-service-roleAWSCodeDeployDeployerAccess をアタッチ。

buildspec.yml

以下の内容で作成。

version: 0.2
phases:
  build:
    commands:
      - aws deploy push --application-name dev-app-test --s3-location s3://test-bucket-artifact/dev-artifact.zip --source .
artifacts:
  files:
    - '**/*'
  base-directory: .

CodeDeploy

次項の Role を事前に作成して dev-app-test という名前の EC2 向けアプリケーションの作成。
appspec.yml を作成して、 test-repository にコミット。
/tmp にデプロイして確認する。
root ユーザーではなく、ec2-user に chown する。

version: 0.0
os: linux
files:
  - source: /
    destination: /tmp
permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

IAM Role

AWS サービス - CodeDeploy - CodeDeploy から AWSCodeDeployRole を紐付けたロール codedeploy-dev-test-app-service-role 作成。

Deploy group

  • dev-web
  • Role
    • codedeploy-dev-test-app-service-role
  • Enviroment
    • EC2
      • Name : test-ec2
  • Agent install
    • None
  • Load balancer
    • Off

Deploy

  • アプリケーション からラジオボタンで選択して アプリケーションをデプロイする
    • デプロイグループ
      • dev-web
    • リビジョンの場所
      • s3://test-bucket-artifact/dev-artifact.zip

CodePipeliine

dev-pipeline を作成して、以下の設定を行う。

  • Source
    • AWS CodeCommit
    • test-repository
    • develop
  • Build stage
    • AWS CodeBuild
    • Project name
      • dev-build-test
  • Deploy provider
    • AWS CodeDeploy
      • dev-app-test
      • dev-web

パイプラインの動作確認

develop ブランチを test-repository に push するとパイプラインが動作して、リポジトリ配下の内容すべてが /tmp にデプロイされる。

所感

CodeDeploy はエージェントいれたり事前準備も多いため、 CodeBuild だけですますことが多い状況でした。
そのため、CodePipeline も利用せずにいたのですが、CodeCommit からフックしようとすると CodePipeline が必須という仕様。
GitHub とか BitBucket 利用なら WebHook できるのに、CodeCommit を使う場合は CodePipeline 経由の必要があるため、ついでに CodeDeploy も試してみましたが、思ったよりも簡単に EC2 にデプロイできることが確認できました。