Cloud Penguins

Flying penguins in the cloud.

Auth0でTKGのクラスタを認証できるようにする

TKGでは、認証に外部Identity Provider(IdP)を利用することができる。TKG1.3以降はPinnipedというコンポーネントが含まれており、これが外部IdPを担った認証を行うようになっている。

Pinnipedについては星野さんのCNDO2021の発表が参考になるので興味のある方は是非。

event.cloudnativedays.jp

OpenID Connectを使った認証はTKGのドキュメントに記載があるのだけど、これはOktaを使った説明になっている。 自分は普段Auth0をIdPとして使っており(CNDT/CNDOもAuth0)、そちらを使ったログインをやりたいなと思い、今回の記事を書くことにした。

なおOkta/Auth0に限らずOpenID ConnectなIdPであれば似たような設定で利用可能だと思うので、適宜読み替えて活用してもらえれば。

Management Clusterの構築手順

これ以降の解説はTKG1.3.1 を前提とする。

Management Clusterを作る

Management Clusterの作り方は、1点を除き通常とほぼ変わりなし。今回はUIを使って構築してみる。

$ tanzu management-cluster create --ui

f:id:jaco-m:20210530141517p:plain いつもの画面。今回はvSphereを使うが、認証周りについてはEC2でもAzureでも同じだと思われる。

f:id:jaco-m:20210530141623p:plain Iaas Providerの設定は通常と変わらず。各自利用している環境に合わせて変更。

f:id:jaco-m:20210530141705p:plain Management Cluster Settings。ここも通常と変わらないが、 CONTROL PLANE ENDPOINT の値だけちゃんとメモしておくこと。後で使います。

この後 6. Kubernetes Networkまでは通常と一緒なので割愛。

次に7. Identity Management。ここが一番のポイント。一旦TKG側の設定はここで止めておいて、Auth0の設定に入る。

Auth0の設定をする

auth0.com Auth0にログインをする。アカウントを持っていない方は新規登録しておきましょう。今回の用途くらいであれば無料の範囲内で利用可能。

f:id:jaco-m:20210530142544p:plain ログインしたら、Applications-> Create Applicationをクリック。

f:id:jaco-m:20210530142651p:plain Nameは任意の名前を。application typeはRegular Web Applicationsを選ぶ。

f:id:jaco-m:20210530143203p:plain 次にアプリケーションの設定にはいるが、すこし下にスクロールしたところにあるApplication URIsのAllowed Callback URIsに https://<Control PlaneのIP>:31234/callback を入れる。IPには先ほど控えたControl Planeの値を。これが出来たら一旦Save。

TKGのOIDCの設定をする

Auth0の画面を開いたままTKGの画面に戻る。 f:id:jaco-m:20210530143847p:plain Identity Managementの項目に、Auth0の値を転記していく。

  • ISSUER URL - http://<Auth0 appのDomain>/
    • https:// および 末尾のスラッシュを忘れないこと。これを忘れるとログインが失敗する
  • CLIENT ID - Auth0のClient ID
  • CLIENT SECRET - Auth0のClient Secret
  • SCOPES - openid,groups,email
  • USERNAME CLAIM - どの値をUsernameとして扱うか。今回は email を指定
  • GROUPS CLAIM - どの値をGroupとして扱うか。今回は groups を指定

入れ終わったらNEXTをクリック。残りの設定は通常のクラスタ作成と変わらない。

f:id:jaco-m:20210530144528p:plain 全ての設定が終わったらインストールを開始。しばらく待ち。

Management Clusterの設定

Management Clusterの設定が終わったら、次は tanzu コマンドを使ってadminのkubeconfigを取得。この段階ではOIDC認証は使っていない。

$ tanzu management-cluster kubeconfig get --admin
Credentials of cluster 'demo' have been saved
You can now access the cluster by running 'kubectl config use-context demo-admin@demo'
$ kubectl config use-context demo-admin@demo
Switched to context "demo-admin@demo".

Pinniped周りのPodが正しく上がっているかを確認。この段階で何らしかのErrorが発生していたら、コンフィグを間違っている可能性があるので kubectl logs などを使って確認する。

$ kubectl get all -n pinniped-supervisor
NAME                                      READY   STATUS      RESTARTS   AGE
pod/pinniped-post-deploy-job-bfzhn        0/1     Completed   0          3m4s
pod/pinniped-supervisor-f5dd7d547-pbxbd   1/1     Running     0          2m20s
pod/pinniped-supervisor-f5dd7d547-xjw8l   1/1     Running     0          2m20s

NAME                          TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
service/pinniped-supervisor   NodePort   100.65.72.169   <none>        443:31234/TCP   3m4s

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/pinniped-supervisor   2/2     2            2           3m4s

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/pinniped-supervisor-f5dd7d547   2         2         2       3m4s

NAME                                 COMPLETIONS   DURATION   AGE
job.batch/pinniped-post-deploy-job   1/1           44s        3m4s

次に、OIDC経由のユーザーにClusterRoleを付与する。今回はManagement Clusterの全権を付与したいので、cluster-admin をユーザーにつける。ユーザーに与える権限を絞りたい場合は、ここで別のClusterRoleやRoleをbindingすれば良い

$ kubectl create clusterrolebinding cluster-admin-jacopen --clusterrole cluster-admin --user jacopen@gmail.com
clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-jacopen created

終わったら、OIDCで認証するためのkubeconfigを出力する。今回は /tmp/mgmt_oidc_kubeconfig に出力している

$ tanzu management-cluster kubeconfig get --export-file /tmp/mgmt_oidc_kubeconfig
You can now access the cluster by running 'kubectl config use-context tanzu-cli-demo@demo' under path '/tmp/mgmt_oidc_kubeconfig'

出力したkubeconfigを使ってリソースを取得してみる。

kubectl --kubeconfig /tmp/mgmt_oidc_kubeconfig get all

すると、自動的にブラウザが立ち上がってAuth0の認証画面に飛ばされるので、Auth0に設定してある認証手段(user/pass, Google, GitHubなど)を利用してログイン。すると、ブラウザには以下のように表示され、kubectl側では無事にレスポンスが帰ってきているはず。

f:id:jaco-m:20210530155644p:plain

これで無事Management ClusterをOIDCのユーザー経由で利用できるようになった。

OIDC経由のユーザーでtanzuコマンドを利用できるようにする

OIDC経由のユーザーをcluster-adminにしたので、そのユーザーを使ってtanzuコマンドからclusterの作成等が可能になる。

環境を分けるために別ユーザーを作成の後、 tanzu login --endpoint "https://<Management Cluster IP>:6443" --name <Management Cluster名> を実行。

すると自動的にブラウザが立ち上がり、Auth0での認証が行われる。認証が通れば以下ののようになる。

$ tanzu login --endpoint "https://10.9.11.103:6443" --name demo
✔  successfully logged in to management cluster using the kubeconfig demo
$ tanzu management-cluster get
  NAME  NAMESPACE   STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES
  demo  tkg-system  running  1/1           1/1      v1.20.5+vmware.1  management


Details:

NAME                                                     READY  SEVERITY  REASON  SINCE  MESSAGE
/demo                                                    True                     113m
├─ClusterInfrastructure - VSphereCluster/demo            True                     113m
├─ControlPlane - KubeadmControlPlane/demo-control-plane  True                     113m
│ └─Machine/demo-control-plane-kp9pv                     True                     113m
└─Workers
  └─MachineDeployment/demo-md-0
    └─Machine/demo-md-0-86cb4697d7-sm8p8                 True                     113m


Providers:

  NAMESPACE                          NAME                    TYPE                    PROVIDERNAME  VERSION  WATCHNAMESPACE
  capi-kubeadm-bootstrap-system      bootstrap-kubeadm       BootstrapProvider       kubeadm       v0.3.14
  capi-kubeadm-control-plane-system  control-plane-kubeadm   ControlPlaneProvider    kubeadm       v0.3.14
  capi-system                        cluster-api             CoreProvider            cluster-api   v0.3.14
  capv-system                        infrastructure-vsphere  InfrastructureProvider  vsphere       v0.7.7

tanzuコマンドを使ってManagement clusterの情報を得ることができた。

TKGのダウンロードやドキュメントにさっくりたどり着く方法

今日は小ネタ。

今すぐTKGのCLIバイナリやドキュメントにアクセスしたい!ってこと、よくありますよね?(あるのか?)

これらはMy VMware からアクセスできるんですが、検索使ったとしても探すのがちょこっと面倒くさい。

GoogleでTKGで検索しても、たまごかけごはんばっかり引っかかってTanzu Kubernetes Gridにはなかなかたどり着けない。

ということで、TKGには https://www.vmware.com/go/get-tkg というショートカットが用意されていて、直接ダウンロードページに飛べるようになっています。

ぶっちゃけそれすら面倒なので、もっと簡単に飛ぶには、ブラウザの検索窓で "get-tkg"と入れればOK f:id:jaco-m:20210119113108p:plain

これで一番上にダウンロードページが出てきます。

f:id:jaco-m:20210119113203p:plain

右のDocumentationからドキュメントに飛ぶことも可能。

2020年買って良かったもの

n番煎じと言われても気にしない。jacopen的今年買って良かったモノを1年の振り返りがてら書いてみる。

ガジェット

SONY VLOGCAM ZV-1

ソニー Vlog用カメラ VLOGCAM ZV-1

ソニー Vlog用カメラ VLOGCAM ZV-1

  • 発売日: 2020/06/19
  • メディア: Camera

ソニーのVLOG向けカメラ。商品レビュー撮影モードの鬼のようなオートフォーカスの速さがヤバい。手ぶれ補正はないので出先で使うとそれなりにブレるが、これはCatalyst Browseでソフトウェア的に補正が可能。

普段はリモートワーク時のWebカメラとしての出番が多いが、出かける時はついでに持ち運んでいる。

eMeet luna

これまたリモートワークの友である会議用マイクスピーカー。1万円を切る価格なのに音質はとても良く、有線、無線いずれの使い方もできて便利。それまではコンデンサマイクを利用していたが、リモートワークにはオーバースペックなのと場所の問題もあったが、eMeet Luna導入で快適さが断然増した。

ATEM Mini

言わずと知れた超コスパスイッチャー。コロナ禍では品不足で全然買えなかったようだが、最近は在庫が安定してきた様子。自分はコロナ禍より前に買っていたので良かった。

USB接続できないカメラをWebカメラ化するのに利用したり、いくつかお手伝いしている配信のスイッチングなどにも利用している。

ハイセンスの65型テレビ

引っ越しを機に購入。国内メーカーとの比較で迷ったが、価格と品質のバランスでハイセンスを選択。65インチはちょっと大きすぎるかな?とも思ったが、実際に使ってみるとむしろちょうど良い大きさだった。F1ファンとしては、情報量がめっちゃ多いF1 ZONEも見やすく大満足。

ゲーミングPC

www.dospara.co.jp

オンライン配信をする際、それまで使っていたMacbook Proでは全然性能が足りず、かつMac版OBSの質も良くなかったためWindows移行を決意。ちょうどWSL2が出たタイミングで、普段の作業にも困らなくなってきたのも後押しになった。 どうせ買うなら十分なスペックのモノをということで、ドスパラのゲーミングPCを購入。Ryzen 3900Xに64GBメモリ。スペックの余裕は心の余裕。OBSはもちろんPremiereやAfter Effectsも快適に使えるので満足。

DELL XPS15

www.dell.com

自宅環境はゲーミングPCでいけるが、出先で配信の裏方をやる際にMacbook Proでは以下略のため、パワーのあるノートPCが必要になってきた。配信の為にはGPUパワーが重要ということで、GTX 1650 Tiを積んだXPS15を選択。ベゼルが細くてかっこいい。おかげで15インチだけどフットプリントはとても小さい。

出先での利用のほか、リビングでテレビを流しながら作業をする用途にも利用している。

トレーニング

コロナ禍で在宅勤務になったこともあり、こりゃ運動しないと体型ヤバいことになるなと思いオンラインのパーソナルトレーナーをつけてみた。結果、コロナ前よりも健康になってきた感ある。 以下はトレーニングのために購入してよかったもの。

可変式ダンベル

最初は自重トレーニングをやっていたが物足りなくなってきたため、可変式のダンベルを購入。細かく主さを調整できるパワーブロックタイプを購入。それまでは10kgのダンベルですら重たいと思っていたのだが、トレーナーから「20kg x2くらいはすぐに物足りなくなりますよ」と言われ、嘘やろと。でもまぁ、可変式であれば重たい側を使わなければいいだけだし、とりあえず買ってみようとこちらを選択。

それから半年経った今、20kgでは全然足りず最大重量の26kgでスクワットしてる。筋肉ってすごい

パワーグリップ

正直筋トレってあまり好きではなかった。みんな重たいダンベルやバーベルをすいすい挙げているのに、自分はその1/3すら持てない。腕や足の筋肉というよりも、握力が足りず手のひらが痛くなってしまい嫌になるパターンが多かった。 ・・・ということをトレーナーに話してみたところ、ウェイトトレーニングやるならパワーグリップは必須ですよと。え、なんそれ初めて聞くアイテム。 ということで、こちらを購入。

筋トレ上級者にはゴールドジムのパワーグリップが定番らしいのだが、レビューを見る限りその1/3の値段で遜色ない品質ということでこちらに。

効果はてきめんで、あ、筋トレってこんなに楽しくやれるものなんだと衝撃を受けるほどだった。握力を使うこと無く鍛えたいところに負荷をかけられるので、その分成長も早いように感じる。

チンニングバー

ダンベルでも良い感じに鍛えられていたのだけど、もっと別のパターンで腕や背中を鍛えたいなということでこちらの懸垂バーを購入。突っ張り棒のように設置するタイプで、自室の入り口に設置している。値段も安く中国産ということで、もし落ちたら大怪我だよな・・・と不安だったが、設置してみるとガッチリ固定されてビクともしない。今のところ不安になる挙動はなく、目論見通りのトレーニングが出来ているので満足。

その他

ミーレ食洗機

www.miele.co.jp

引っ越し先にはホシザキのビルトイン食洗機がついていた。これは洗いが10分程度で終わるユニークな製品だったが、如何せん洗浄力が弱かった。3倍の時間をかけていいからちゃんと汚れを落として欲しかったのだが・・・。

汚れの落ちない食洗機にフラストレーションが溜まってきたため、奮発してミーレの食洗機を購入。こちらは洗いに時間はかかるものの、洗浄力は十分にも関わらず静かで省エネ。洗剤の量も半分で済むようになった。QoL爆上がり。

眼鏡(乱視矯正入り)

今年初め、嫁の父親の付き添いで偶然訪れた眼鏡屋で視力検査してもらったところ、軽度の乱視があることが判明。1年ほど前から目の疲れに悩まされていたのだけど、これが原因だったようだ。

ということで乱視矯正入りの度無し眼鏡を購入。

体感できるほどの効果が出ており、PCを使うときには必ず眼鏡を使うようになった。頭痛も肩こりも軽減したように感じており、ほんと買って良かったなと思う。

React入門したい

今日は雑記。

CloudNative Days Tokyo 2020では、配信プラットフォームを自作したんだけどこれにはRailsを使っている。Railsを選択した理由は、開発を担当した自分と r_takaishiが過去に経験があり一番素早く作ることができたからだ。

正直Railsでほとんど困っておらず、圧倒的な速さで作ることができたので全然これでいいのだが、せっかくフロントエンドに手を出すのであれば新しいものを経験したい気持ちもあるっちゃある。

ということで、Reactデビューしてみることにする。ちなみにこのあたりの知識はゼロでガチの初心者。

手始めに参考にしているサイト

チュートリアル:React の導入 – React

正真正銘のReactだけの不純物なしでReact入門

初めてのReact「入門編」導入から基本まで〜TODOアプリを作ってを学ぼう! | 株式会社ウェブ企画パートナーズ

まだ全然わかっていないのでこれから調べていくこと

  • JavaScriptで書いていくべきなの、それともTypeScriptを使ったほうがいいの
  • SSRとやらをするの?しなくていいの?NextJSとかExpressとか出てくるけどこいつらをどう使うの?
  • フレームワークを使ったほうがいいの?Gatsby.jsってやつ?
  • reduxってなんぞ
  • routerってなんぞ

キューブ型ベアボーンに積めるだけ積んで自宅サーバーを作る2020

クラウドの時代になっても、いや、クラウドの時代だからこそ、自宅に自由に触れる環境を作ってあれこれ実験したいもの。

これまで自宅にタワー型のサーバーやラックマウントサーバーなどさまざまなものを置いてみたものの、やはりネックになってしまうのはスペース騒音

タワー型は縦に並べていくのにやや難があり、都内ワンルームなどに住んでいた場合は人間様が使うスペースよりもサーバーのほうが場所食ってんじゃん、なんて状況になりかねない。

自宅に19インチラックを置くガチな人も世の中には一定数存在するのだが、こちらはスペースもさながら騒音が厳しい。少なくとも寝るスペースと同一にするのは難しいため、検証のときだけ起動するといった運用になってしまう。

福音だったIntel NUC

そんな中、2012年末に登場したIntel NUCは自宅サーバー勢には福音であった。

amzn.to

手のひらに乗るサイズなのにも関わらず、Core i3やi5が載っている。その当時でもSODIMMを2枚刺しすれば16GBにでき、自宅環境の劇的な小型化が可能になった。

2020年現在、32GBのSODIMMも値段がこなれてきており、新しいNUCであれば2枚刺しすることで64GBまで拡張できるようになった。多くの検証はこれ1台もしくは数台で十分賄えるでのはなかろうか。

amzn.to

NICが2つ必要ならば小型ベアボーンという選択肢

多くの検証はNUCで行けると書いたが、場合によってはNICが2つ欲しいというユースケースもある。例えばネットワークのセグメントを分けたいケースや、NASへのアクセスにNICを独占させたいケースもあるだろう。NUCはゲーミングモデル以外はNICが1つしかないため、どうしても必要な場合は、USBのNICを利用することになる。 しかしESXiを使いたい場合、利用できるUSB NICの選択肢はAX88179など少数に限られるのが悩ましい。

そこで出てくる選択肢が、小型のベアボーンや産業向けPCである。

例えばShuttleのDH310V2は、TDP65Wまでの第8世代/第9世代Coreが載る上にIntelチップのNICが2つ積まれている。また、公式サイトのカタログスペック的には32GBまでとなっているが、実際には64GBまで認識する。

amzn.to

さすがにNUCほど小さくはないが、それでも十分小型といえるサイズであり、我が家でも故障したNUCの後継として導入している。 f:id:jaco-m:20201221020840j:plain

さらに拡張性が必要な場合はどうする?

では小型ベアボーンでは足りない要件が出てきた場合はどうするべきか。例えば以下のような要件が考えられるだろう。

  • もっとメモリを積みたい
  • 3.5インチHDDを積みたい
  • GPUを積みたい
  • 10GbEを積みたい

じゃあ大人しくタワー型買おうよ って言いたくなるところをグッと抑えて選択肢を模索してみよう。

Mini-ITXマザーボード x 小型PCケース

Mini-ITXをアリにすると、選択肢はグッと広がる。PCI-E x16を1本積んだマザーが多く、GPUなり10GbEなり要件に合う拡張をするとよい。ただし、メモリスロットは2本であることが多いため最大メモリは64GBが上限となってしまう点は要注意だ。

お金に糸目をつけなければサーバー向けのXeonマザーを買う手もある。10GbEやメモリスロット4本積んだものもあるため、小型で超ハイスペックなマシンを組むことも可能だ。 そこまでして小ささにこだわるか?という気持ちになってくるが

amzn.to

ケースは要件に合わせて選ぶ。見るべきポイントは3.5インチのベイ数、拡張スロット周りのサイズ(GPUが入るかどうか)、電源容量あたり。

amzn.to

キューブ型ベアボーン

前置きが長くなってしまったが、今回自分が試したもう一つの選択肢がキューブ型ベアボーンを使う方法だ。

自宅にvSphere環境とvSAN環境を構築し、その上にたまごかけごはんTanzu Kubernetes Gridを構築したかったので、以下のような要件があった。

  • 128GBメモリ (メモリの余裕は心の余裕)
  • 3.5インチベイ (3.5インチHDDが余ってたので活用したかった)
  • 10GbE (vSAN組むなら欲しい)

今回選んだのは、ShuttleのSH370R6V2というキューブ型ベアボーン。

このShuttleのSH370R6V2、日本の公式サイトだと最大64GBとなっているが、搭載できる第8/9世代CoreとH370チップセットは128GBまで対応している。また、グローバルのサイトにはUp to 128GBという記述もあり、おそらく問題ないと思われた。

メモリスロットは4本あるため、32GBのDDR4を買うことになる。今回は32GBx2のキットを2つ買う形にした。

amzn.to

CPUヘビーなワークロードを動かすつもりはないが、メモリ量に比例してVM数も増えると想定されるため、こちらもCore i7 9700 にして余裕を持たせることにした。

10GbE NICはESXi標準のドライバで認識できるIntelチップを積んだものを選択。安心を取るならIntel純正のもののほうが良いが、今回は節約してノーブランドのものを調達した。 ノーブランドの10GbE LANカードがオリオスペックに5製品入荷、実売5,940円から - AKIBA PC Hotline!

SH370R6V2はPCI-E x16とx4が1本ずつという構成。NICはx8のため、x16側を利用する形になる。なので、GPU積みたい場合は競合してしまうことになる。 x4側に刺しても認識はすると思うが、その分速度低下が起こりうる可能性がある。SH370R6V2はPCI-E Gen3なので、x4でも計算上10GbEは問題ない気はするのだが、自分の用途だとGPUは不要だったので未確認。 f:id:jaco-m:20201221025444p:plain公式サイトより

そうして起動した様子がこちら。ちゃんと128GB認識していることがわかる。 f:id:jaco-m:20201221024807j:plain

なお、購入した状態ではBIOSが古く、128GBでは起動せずにちょっと焦った。64GBで起動後、BIOSアップデートを行うことで解消したので、これから買おうという方は要注意。

10GbEもちゃんとリンクアップしている。 ちなみにSH370R6V2もGbEなNICを2つ標準で積んでいるので3NIC使えることになる。 f:id:jaco-m:20201221025028p:plain

自宅でvSAN組もうという人は世の中でも稀だと思うが、メモリ128GBにGPUないしは10GbEが積めるというのは結構良いのではなかろうか。

"Opinionated"をどうスッキリ訳すか

ニュアンスを正確に伝える翻訳って難しい。

 

プラットフォームやフレームワークの文脈でよく使われる単語に Opinionated がある。

 

f:id:jaco-m:20201210013851p:plain

 例えばCloud Foundryというアプリケーションプラットフォームの特徴としてもこの単語が使われている。

The Cloud Foundry cloud-native platform has three defining characteristics: it is structured, opinionated, and open.

- Cloud Foundry: The Definitive Guide  https://www.oreilly.com/library/view/cloud-foundry-the/9781491932421/ch01.html

Opinionatedとはどういう意味か。辞書を引いて意味を調べると、こんな感じだ。

opinionated

自説を曲げない、意固地な
・Someone known to be passive may become opinionated. : 従順だった人が意固地になることがある。

https://eow.alc.co.jp/search?q=opinionated

え、なんかめっちゃネガティブ・・・

 

日本語の記事でも翻訳には苦慮しているようで、なんとか表現を工夫して伝えようとしていることが分かる。

これが同社にとっての「opinionatedな」(自社の考えや提供価値を体現した)アプローチだ。
- CNCFのCOOに聞いた、CNCFとOCI、Docker、Kubernetes、Cloud Foundryとの関係 https://www.atmarkit.co.jp/ait/articles/1612/22/news032.html

 このようにCloud Foundryは、デベロッパーに対して無駄なことをさせずに、アプリケーションを書くことに集中させるため、時に「Opinionated(独善的)」という形容詞が付けられるほどだ。

- ONSのトリはVinton Cerf氏登場 そしてCloud FoundryとKubernetesはどうなる?  https://thinkit.co.jp/article/13794

 このように、そのまま日本語に訳すのではなく、Opinionatedという英単語を直接記した後、日本語の補足を加えるというケースが多く見られる。

ポジティブな意味でのOpinionated

しかしプロダクトの特徴に使われるくらいなのだから、当然ポジティブな意味で使っている。

Cloud Foundryは、アプリケーションを開発してcf pushというコマンドを一発叩くだけで、コンテナイメージへの生成からインターネット上への公開まで全ての作業を自動で行ってくれるプラットフォームだ。

f:id:jaco-m:20201210020242j:plain

 超絶便利な一方で、世の中全てのWebアプリケーションを動かせるというわけではない。Cloud Foundryの恩恵を受けながら動かしていくには、12 Factor Appなどいくつかの制約に従う必要がある。

利用者に制約を課す代わりに高い生産性を提供する=Opinionated というわけだ。

 

Constraints are liberating - 制約は自由をもたらす

OpinionatedなWebフレームワークとしてよく取り上げられるのが、Ruby on Railsだ。フレームワークという存在自体が既にOpinionatedだとも言えるが、Railsはその中でも特にその傾向が強い、そしてそのメリットを強烈に印象づけた先駆けといえる。

設定より規約(Convention over configuration) の考え方に則り、あれこれ設定させるのではなくフレームワークの規約に従って開発をさせることで、重要なことに注力できるようになる。規約から外れたことは出来ないため柔軟性は少し落ちるかもしれないが、それを遥かに上回る生産性というメリットがついてくる。

Railsを表現する言葉として 制約は自由をもたらす(Constraints are liberating) というものがあるが、一見矛盾したこの2つの考え方を両立させるのが、規約を重要視したWebフレームワークであり、Opinionatedな仕組みなのである。

で、どうやって訳すのか

 ここまで読んだ諸兄には、Opinionatedのポジティブな文脈での利用法が伝わったと思うが、じゃあこれをどう訳せば日本語としてスッキリするだろうか。

自分は仕事でCloud Foundryに関わることが多いのだが、口で説明するとこんな感じになってしまう。

「Cloud Foundryの特徴はOpinionatedなところにあり・・・えー、Opinionatedという言葉は日本語にすると『独善的』とも訳されることがあるんですが、そういうネガティブな話では無くもっとポジティブな感じで、制約を課すことでむしろ生産性を上げていくという意味でして・・・」

結局先に上げた記事のように、Opinionatedという英単語をそのまま使いつつ日本語で補足するという形になってしまう。

『こだわり』の翻訳

そう悩むこと数年。ついに出会った、個人的にスッキリくる訳がこれである。

『こだわり』

だいぶ前に読んだ何かの記事で使われていた訳だ。出典はちょっと失念してしまったのだが、『○○は、こだわりの強いプラットフォームであり・・・』といった形の表現をされていてた。

なるほど、これはいいかもしれない。

辞書で引いてみるとこういう説明がなされている。

拘わる
読み方:こだわる・かかわる
別表記:拘る

拘わるとは、比較的どうでもいい事を気にしすぎて、いつまでも気にかけたり必要以上に手を加えたりしたがることを意味する表現。「かかずらう(拘う)」ともいう。

「拘わる(こだわる・かかわる)」の意味や使い方 Weblio辞書

おおう、ネガティブ。

そう、『拘る』という言葉は本来ネガティブな意味で使われる言葉だ。しかしご存じのように、『シェフのこだわりランチ』のような形でポジティブな用法もある。これは比較的最近生まれた用法らしい。

ネガティブな用法で使うときは『拘り』と漢字にし、ポジティブな用法で使うときはひらがなにすることが多い。

この二面性がある感じ、Opinionatedと一緒ではないか。

 

「Cloud Foundryって結構こだわりが強いプラットフォームなんです。Kubernetesほどなんでもアリなプラットフォームではないんですが、12 Factor Appsに従ってアプリを作ることで、cf pushだけでアプリをデプロイできて。」

 

うん、だいぶスッキリしたな。