NuxtJS+socketioで認証フィルタをはさむ(passport)

NuxtJSでサーバ側はexpress、websocketを使うのにsocket.ioを使っていて、ユーザー認証をpassportで行なう場合の覚書き。

今回試すこと

axiosを使ってサーバAPIでログインし、その後socket.ioでwebsocketに接続する。やりたいことは、サーバAPIで開始したセッションをsocket.ioで引き継ぎ利用することである。

これには、socket.ioのミドルウェアを使って開始済みのセッションを読み込めば、socket.ioのリクエストでセッションを扱える。気をつける点は、socket.ioのミドルウェア関数インターフェースがexpressのそれと異なっているので、正しく情報を引き継げるようミドルウェアをつないでやることである。具体的には、socket.ioのドキュメントにもあるとおり以下のようにすればよい。

socket.ioのロード

今回は、NuxtJSのmoduleのlistenフックを使ってsocket.ioサーバをnuxtのhttpサーバ に統合する。serverMiddlewareで、/apiにexpressのappをマウントする。また、Nuxtのlistenフックを使ってsocket.ioサーバを統合するための設定をmodulesに定義する。

サーバ側

今回は動作検証のため、セッションはメモリストアを使っている。socket.ioとセッションストアを共有するため、共通の定義を使うようにしている。

server/index.js

server/session.js

server/io.js

クライアント側

クライアント側は、ログインしてセッション確認するだけのためのインターフェースにする。以下のような感じ。

ログインしていない状態の時。

ログインしてsocket.ioにつながった時。

Viewテンプレートはveutifyを使う。

pages/index.vue

NuxtJSは、Universalモードで動かしているのでSSRを行なう。sessionは、asyncDataフックを使ってコンポーネントのdataに統合する。

検証用プログラムは以下

https://github.com/moritetu/nuxt-with-socket.io-passport

参考リンク

vuex-persistedstateによるstateデータの永続化

NuxtJSのSSRモードで、vuex-persistedstateによるデータ永続化を適用してしまいSSRのfetchライフサイクルでstoreに設定したデータが上書きされてしまった。これは、私がvuex-persistedstateの使用方法を誤っただけである。SSRモードで動かす場合は、クライアントサイドで永続化したいpathにのみ適用すべし(自分への戒め)。

stateが上書きされてしまったケース

具体的には以下のような使い方をしてしまっていた。

  1. vuex-persistedstateをpluginとしてロード
  2. クライアントサイドでstoreにデータ書き込み(この段階でlocalStorageにデータが書かれている)
  3. SSRでサーバサイドでfetch処理でstateにデータを書き込む

期待する動きは、3で初回ページアクセスしてサーバサイドでcommitしたstateがクライアントサイドで復元される、である。

しかし、3番目のステップでSSRで設定したstateデータがクライアントサイドで復元されると期待するものの、vuex-persistedstateプラグインの永続化処理により、以前にlocalStorageに書き込んだ値で上書きされてしまう、という訳である

プラグインロードのタイミング

NuxtJSでは以下のようにpluginとして組み込める。クライアント再度でpluginがロードされるタイミングは、ライフサイクルでは以下となる。

  • Receives the HTML
  • Loading assets (e.g. JavaScript)
  • client-side Nuxt plugin ★ここ
    • in order as defined in nuxt.config.js
  • Vue Hydration
  • Middleware
  • Global middleware
  • Layout middleware
  • Route middleware
  • asyncData (blocking)
  • beforeCreate (Vue lifecycle method)
  • created (Vue lifecycle method)
  • The new fetch (top to bottom, siblings = parallel) (non-blocking)
  • beforeMount (Vue lifecycle method)
  • mounted (Vue lifecycle method)

引用:https://nuxtjs.org/docs/concepts/nuxt-lifecycle/

Stateのrestoreのタイミング

サーバーサイドでcommitされたstateの情報は、ページアクセスのレスポンスデータの中でシリアライズされて送信される。そして、アプリケーション初期化のタイミングでstateに復元される。

store.replaceStateの復元段階では、まだプラグインの初期化はされていない。プラグインの初期化が呼ばれるのは、コメント // Plugin executionの以降になるので、上記で復元されたstateは上書きされてしまう。

参考リンク

Nuxt.jsでsocket.ioを使うやり方

Nuxt.jsでWebSocket、今回はsocket.ioを使う方法についての備忘録です。他によいアプローチがあるかもしれません。他の方の事例を参考にしながら、自分なりに整理してみました。

以下の3つのアプローチで記述してみます。

  1. moduleでserver.listenの上書き
  2. listenフック
  3. nuxt program

server.listenの上書き

これは、公式サンプルで書かれている内容です。

render:beforeフックの中で、listenメソッドを上書きしています。元々の処理では、protocolに応じたserverオブジェクトが作られlistenが呼ばれます。上記例では、プロトコルはhttpとしてserverオブジェクトを生成してsocket.ioライブラリに渡しています。

examples/with-sockets/io/index.js

引用)https://github.com/nuxt/nuxt.js/blob/dev/examples/with-sockets/io/index.js

listenフック

server.listenの以降で呼ばれるlistenフックを使います。serverは既にlistenが呼ばれています。

参考)https://stackoverflow.com/questions/63172001/where-do-i-add-this-websocket-code-in-the-new-nuxt-js-setup-since-it-does-not-ha

nuxt program

nuxtをプログラムから使用する方法です。これも、公式のサンプルに例があります。以下例では、公式サンプルを少し触っています。

参考)https://github.com/nuxt/nuxt.js/blob/dev/examples/with-sockets/server.js

server/index.js

server/io.js

サンプルプログラムは以下のとおり。

https://github.com/moritetu/nuxt-with-socket.io

参考リンク

AWS SAP認定試験に合格

AWS 認定ソリューションアーキテクト – プロフェッショナル(SAP)の認定試験を受け合格することができました。ぎりぎり合格なので何ともですが、1回目の試験で無事合格できて良かったです。

あまり参考になりませんが、私の受験記について書いてみます。

受験時のスペック

  • 仕事はシステムエンジニアをしています、業界歴は10年以上、現在は主にWebサービスの開発をしています。
  • IPAの高度情報処理試験はDB・NW・SCの3種類を取得済みで、広く浅くITの知識はあります(と思ってます)。
  • AWSについては、業務でここ1年弱くらい本格的に触っているレベルです。使っているAWSのサービスは、スタンダードなWebサービスで使用されるもので、EC2やALB、RDS、S3といった代表的なサービスになります。その他のサービスについては、本格的に使用した経験はないですが、AWSの各サービスがどのオープンソースソフトウェア(OSS)に対応するのか、といったイメージは大体つくという感じです。

試験対策

以下の2つを使用しました。

1. AWS認定ソリューションアーキテクト-プロフェッショナル

AD

AWSの各サービスについての詳細な説明が書いてあるような教科書的な本ではなく、どちらかというと問題演習が中心です。1回分の模擬テストもついてます。解説が丁寧でわかりやすいので、解説を読むだけで勉強になります。正解でない選択肢については、その理由が説明されており、選択肢を絞り込む思考が身につくと思います。解説を読んで理解が不足しているなと思うサービスがあれば、実際のAWSを触ったりBlackBeltを読むことで補完できます。

私は、本書の問題は8〜9割正解できる状態で試験に臨みました。

2. AWS 認定ソリューションアーキテクト プロフェッショナル模擬試験問題集(全5回分375問)

AWS 認定ソリューションアーキテクト プロフェッショナル模擬試験問題集(全5回分375問)

Udemyの講座で、模擬試験5回分です。

問題数が豊富でボリュームがあり、解説も豊富です。ただ、私にとっては問題文および解説文ともに日本語が少し難しく感じました。理解できたかというと怪しいです。1.の参考書を読んだ後に本模擬試験を受けたところ、4〜5割くらいしか正解できませんでした。

試験に向けては、本講座を一周したのと、前日に再度問題の解説をざっと読み返したくらいです。その際、特にどのような点が問われそうか、というポイントだけ抑えるように意識して読み返しました。メインは、1の参考書を使用しました。

学習時間

1の参考書を理解できるようになるまでです。実務経験の有無など個人差があり、学習時間はあまり参考にならないとは思いますが、私の学習の雰囲気を書いてみます。

私の場合は、土日に2時間くらい、仕事で早く帰った日は夜1〜2時間程度のペースで学習を進めました。学習は、1.の参考書を初めから順番に読み進め、イメージしにくかったり理解が難しいところはAWSのサービスの画面を操作してみたり、マニュアルやBlackbeltなどを眺めてみたり、という感じで進めていきました。期間は大体2〜3ヶ月くらいだったと思います。ただ、実際には試験直前くらいまで仕事がたてこんでしまい、平日はあまり学習ができず、本格的に集中して取り組んだのは試験2週間前くらいでしょうか。

期限がないとダラダラと学習を長引かせてしまうと思ったので、ある程度腹をくくって学習半ばで試験日を先に決めてしまうことにしました。結果的に良い意味で追い込むことが出来たと思います。

試験場所

試験方式はオンラインとテストセンター試験が選択できます。私は、いつも試験センターで試験を受けているので、今回も会場受験を選択しました。試験センター方式では、困ったときには会場の試験監督員の方に直接相談できるという安心感があるので、私は会場試験が好みです(相談したことはないですが)。今回も焦らず受験できました。

試験当日の準備

私は朝が弱く会場に余裕を持って入りたかったため、午後の試験を選択しました。

試験では、本人確認書類が2種類必要なので忘れずに。私の場合は、運転免許証とクレジットカードの2点を提示しました。試験は3時間の長丁場なので忍耐力がいります。トイレは事前にしっかり済ませること。また試験中にトイレに行きたくならないよう、コーヒー等は控えめにした方が良いかもしれません。

試験

印象としては難しいと感じました。明らかに誤りである選択肢は除いて、残りの選択肢を絞り込めないものが多々ありました。確証が持てない問題は見直しチェックを入れて飛ばしていきましたが、おそらく2、30問ほどあった気がします。。序盤から結構続いたのでしんどかったです。実際、試験中に何度か諦めそうになりました。

解答は、1問約2分のペースで進めました。最後まで解いた段階で30分の時間が余っていました。これは予定通りでした。しかし見直しチェックをつけた問題が多く、30分では数問だけしか見直すことが出来ませんでした。

正直ダメかなとも思いましたが、結果的には合格することが出来ました。最後まで諦めなかったことと、時間配分をきっちりできたのが大きかったと思います。

さいごに

SAPでは、想定されるビジネスシナリオの要求を正しく理解し、AWSのサービスをどのように組み合わせれば良いのか、を導く必要があります。出題されるビジネスシナリオはバラエティに富んでます。どの試験にも言えるかとは思いますが、学習においては漠然と問題の解を覚えるのでなく、AWSの各サービスの特徴と仕組みを理解し、どのようなケースでそのサービスが有効なのか、そしてWell-Architectedの原則に沿っているか、といった点を抑えていくことが重要だと思いました。本質を抑えることで、問題文がアレンジされたとしても正解を導くことができるようになると思いました。

データベーススペシャリスト受験記

2020年秋に行われたデータベーススペシャリスト試験を受験し無事合格することができました。半分ダメだと思っていたのですが、思ったよりも部分点が採れていたのか、午後I・IIとも60点強でなんとか合格点に達していたようでした。実は、過去に2回ほど受験し毎回午後試験をクリアできずにいたので、やっと、という感じです。

勉強方法

過去2回受験していたので、今回はほぼ対策はしませんでした。

午前問題は、直前の3日間くらいで3年分ほどの過去問を解き直しました。8割程度安定して得点できるようにするまで繰り返す、というよくある方法です。過去に受験していたので、問題もなんとなく記憶に残っていて、あまり時間はかかりませんでした。

午後問題は、過去1年分の午後Iを解いた程度でした。毎回午後問題は苦手意識があるにも関わらず、過去問を解くという練習はしてきませんでした。苦手で避けてきたのが正直なところです(これが一番の原因だと分かっているのですが、、)。基礎力さえあれば、あとは読解力次第、というのが頭の中にずっとありました。とは言え、過去問を解いて傾向を知っておくというのは、『敵を知り己を知れば百戦危うからず』の故事にもあるように大切なことだとは思います。ただ、私はできていなかったというだけです。

活用した参考書のシリーズは以下です(実際には、過去受験した時に買ったので2019年版です)。

過去の失敗と試験で気をつけたこと

今までの失敗から、とにかく午後が課題であることは分かっていました。特別な対策は行ないませんでしたが、過去の経験から以下でつまづいていたことは明白でしたので、同じ失敗はしない、これを心掛けて試験に臨みました。

過去の失敗1:問題を最初から丁寧に解く、一問に時間をかけすぎる

分かっていたけれど実践できていなかったことでした。時間配分ができていなかったのです。1つの設問に悩み、いつの間にか時間が大幅に過ぎてしまっていたというのが毎回でした。数分考えてすぐに解答できない問題は飛ばして、後で時間に余裕があれば戻って見直すように割り切りました。ある設問の解答ができなければ、後続の設問を解けないということはあまりないです。ですので、とにかく分かる範囲でできるだけ解答を埋める、ということに徹しました。

過去の失敗2:国語が苦手なのに関わらず、何となく解きやすそうだと概念データモデリングの問題を選択してしまう

設問で説明される業務プロセスの精通度により解答・正解率に変動がありました。SQLの穴埋めや性能計算、テーブル行数の見積もり計算など、データベース技術そのものに近い内容の設問の方が私に向いていると判断し、試験では迷わずこちらの設問を選択するようにしました。どちらが解きやすそうか、という悩む時間を無駄にすることなく、すぐに問題にとりかかることができたのが良かったと思います。

そして、これらの問題、というよりも、データベースの計算関連や性能問題で出てくる問題は、大体パターンが決まっているので解答を導きやすいです。例えば、ロックに関して言えば、トランザクションの粒度がどうか、Isorationレベルはどうか、更新の順番はサイクリックでないか、など原因パターンで絞り込めます。SQLが遅く性能が出ないとなれば、インデックスは適切か、アクセスパスは適切か、データはクラスタ化されているか、ロック待ちは発生していないか、と当たりをつけて絞り込むことができます。これは、私の場合でいうと、今まで経験のあるアプリケーション開発の延長の知識で対応できます。ですので、概念データモデリング系で馴染みのない業務プロセスの問題に悩むよりは解きやすいのではないかと思います。

実際には、馴染みのない業務プロセスであってもお客様の要件からデータモデリングできる力は必要ですが、短時間の試験で理解するのはなかなか難しいです。ですので、試験ではある程度割り切ってしまうのも良いかもしれません。

また、私は問題文をじっくり読まず、ざっと見渡した後はすぐに設問にとりかかりました。問題文はいくつかのブロックに分かれていて、設問ごとに大体の関連範囲が決まっています。よって、設問から読み始め関連する部分の問題文を読んだ方が解きやすいです。長文を読んで線を引いていっても、設問を見たときに”結局どこだっけ”と読み返すことが多かったからです(私の記憶力の問題ですが、、)。そのため、先に設問、そこから問題文に関連する箇所を読む、の順の方が解きやすいのではと思います(問題にもよるかもしれませんが)。

CKADに合格!

はじめに

2020年の大晦日にCKAを受験し、その勢いでCKADも受験し無事合格することができました。これで管理者と開発者の双方のスタートラインに立てました。

CKA試験に合格しました

CKAD試験ですが、CKAと対象領域が被る箇所があるので、CKAを受験した後に受けるとやりやすいのではないかと思います。

ここでは、CKAの受験記と内容が重複する箇所が多いため、CKA受験後にCKADに向けて行なった学習についてのみ整理してみます。

CKADの試験概要

オープンソースのコンテナオーケストレーションツールであるKubernetesの開発者向けのスキルを問う試験です。

CKAD試験では、以下のスキル範囲が求められます。

対象領域とコンピテンシー 割合
主な概念 13%
構成 18%
マルチコンテナポッド 10%
可観測性 18%
ポッド設計 20%
サービスとネットワーク 13%
状態の永続性 8%

引用元)https://training.linuxfoundation.org/ja/certified-kubernetes-application-developer-ckad-jp/

  • 試験時間・・・2時間
  • Kubernetesのバージョン・・・v1.19

CKADの申し込みは、Linux Foundationから行えます。CKADには、CKAD-JPという試験監督が日本語で対応してくれるコースがあります。私はうっかりCKAで申し込みをしてしまい英語指示での受験となりました。特にトラブルがなければokとかyesといった単純な返答で済むので焦らず大丈夫かと思います。

試験対策

CKA試験で対策はある程度できていたため、CKADに向けて新たに行なった学習は以下のみです。

Kubernetes Certified Application Developer (CKAD) with Tests

CKAコースと同様、Practice Testsをパッと解答できるようになるまで繰り返し練習しました。といってもCKAと内容がかぶるので、ほとんどは流す感じで済みました。

https://www.udemy.com/course/certified-kubernetes-application-developer/

その他は、CKAの受験時にも活用させていただいた「CKAD-exercises」です。

https://github.com/dgkanatsios/CKAD-exercises

受験環境

CKAの時と同様、Windows 10のノートPCを使用しました。カメラはUSBで外付けのカメラを使用しました。前回ノートPC内蔵カメラを使用したのですが、ノートPCを持ち上げて内蔵カメラで部屋を映すのが煩わしかったためやり方を変えました。外付けのUSBカメラにすることで、試験前チェックをスムーズに行なうことができました。

受験場所は、今回は実家の一室を使わせてもらいました。ネットワーク環境は光でWiFi環境(いざと慣れば有線も可能)も問題ないことがわかっているので心配不要でした。

受験の流れ

試験予約

My Portalから試験予約をします。12:30〜14:30で申し込みました。季節が冬で寒かったので、できるだけ早朝と夕方の冷えこみそうな時間帯を外しました。コマンド操作なので、特に手が冷えるとガクッとパフォーマンスが落ちてしまうかと思いますので、暖房は必須です。

試験ポータルから試験へ

15分前になるとMy PortalからTake Examのボタンが有効になり押せるようになりました。しばらくするとチャットで指示が飛んできます。

本人確認など

私は運転免許証とクレジットカードでOKでした。ただ、初めはクレジットカード以外でパスポートなどはあるかと聞かれました。しかし、持ち合わせていないことを伝えると、最終的にクレジットカードでパスできました。

試験本番

CKAに挑戦していたので、画面操作に戸惑うことはなかったです。途中ターミナルがハングしてしまい焦りましたが、試験監督に英語で伝え指示に従うことで回復することができました。また、最終局面でカメラの調子が悪くなり映らなくなってしまい、またもや色々とやりとりしていました。何度やってもカメラが回復しないため、ブラウザを閉じ再度開き直しました。これでなんとか回復できました。CKAの時はトラブルなく受験でき大丈夫だろうと思っていたので、いざトラブルがあるとかなり焦りますね。。いや、ほんとに。

難易度

CKAよりも難しい印象でした。問題文表示は英文を選択していましたが、問題を読み解くのも長文の場合は大変ですが、1つの設問での指示もそこそこあった気がします。もちろん簡単に解答できるものも含まれますが、全体的にボリュームがあった気がします。

1問読み解けない問題があり解答できませんでした。また、もう1問時間がなく解答できずの問題がありました。慣れていないと時間が足りなくなると思います。私の場合は、全体をゆっくり確認し直す時間がありませんでした。

合否の連絡

36時間以内に合否がメールで知らされることとなっています。しかし、今回36時間経っても連絡が来ませんでした、そのためかやや寝不足にもなり。。まる2日経っても連絡がなく、またポータルに行ってもステータスが更新されていなかったので、SupportページからJiraチケットを発行しました。

最終的に、Jiraチケット経由ではレスポンスはなかったのですが、2日とちょっと経ってメールで連絡が来ました。Scoreは88で思ったよりは良かったみたい、、何とか一発で合格することができて良かったです。

試験を終えて

CKAに比べ難易度は高かったという印象です。CKAと重複する箇所も多いので、どちらかを受けて一方に臨むと対策しやすいと思います。私の場合は、CKA〜CKADという順でしたが、CKAD向けに行なった対策はUdemyのPractice Testsくらいでしたので、さほど負荷はなかったです。

CKAを受験済みで一度経験していたといえども独特の緊張感がありますね。試験前確認含めて2時間以上全集中状態のため、試験後はどっと疲れが襲ってきます。

やっとスタートラインに立つことができました。今後もKubernetesのスキルアップに努めていきたいと思います。

CKA試験に合格しました

はじめに

Kubernetesの管理者向け試験であるCertified Kubernetes Administrator (CKA)を受検し、無事合格することができました。2020年に合格する目標を立てていたのですが、ずるずると引き延ばしてしまい2020年の大晦日の受験となりました。結果的に2020年の良い思い出であり、良い締めくくりとなりました。

さて、CKAについては様々な受験記が公開されており真新しさはありませんが、2020年9月に試験が改訂されたようなので、改訂版の試験を受験される方のご参考になればと思い記述します。

https://training.linuxfoundation.org/ja/cka-program-changes-2020/

※試験問題に関する内容は機密事項に該当するため記述はありません。

Linux Foundation Global Certification and Confidentiality Agreement

https://docs.linuxfoundation.org/tc-docs/certification/lf-cert-agreement/

CKA試験概要

オープンソースのコンテナオーケストレーションツールであるKubernetesの管理者向けのスキルを問う試験です。

2020年9月に改訂された新CKA試験では、以下のスキル範囲が求められます。管理者向け試験のため、クラスタのインストールやアップグレード、問題対処といったスキルが含まれています。

対象領域とコンピテンシー 割合
クラスタのアーキテクチャ、インストール、構成 25%
ワークロードとスケジューリング 15%
サービスとネットワーク 20%
ストレージ 10%
トラブルシューティング 30%

引用元)https://training.linuxfoundation.org/ja/cka-program-changes-2020/

  • 試験時間・・・2時間
  • Kubernetesのバージョン・・・v1.19

CKAの申し込みは、Linux Foundationから行えます。CKAには、CKA-JPという試験監督が日本語で対応してくれるコースがあります(私もCKA-JPで受験しました)。

私のバックグラウンド

普段の仕事ではKubernetesに触れる機会はありませんが、過去にとあるプロジェクトでPythonからKubernetes APIを使ってクラスタの簡単な操作をするといった経験はありました。ですので、Kubernetesがどういったものかについては予備知識がありました。それ以外では、自宅のPCでDocker for MacでKubernetesを少し触るくらいのレベルです。正直Podを作成するくらいの操作しかしていませんでしたので、試験を受けると決めてから本格的に学習を始めた感じです。

受験の理由

業務で必要に迫られたからという訳ではなく、技術に関する興味からくる自発的な理由で受験しました。

目的は、どの資格試験でも共通しているかもしれませんが『体系的な知識とスキルの習得』『スキルの証明』です。なかでもCKAは実技試験のため、”なんとなく”や”勘”では太刀打ちできません。何のために、どのようなConfigurationすべきか、そしてそれが正しく行われているか、また何が間違っているか、といったことを実操作で確認できなければなりません。そういった意味では、他の知識系の資格試験とは性格が異なり、より実践的なスキルの証明につながるのではと思います(とはいえ、実際のクラスタ管理は資格試験と比べるとはるかに複雑なのだろうとは思います)。

試験対策

他の方の受験記にあるとおりで、特別変わったことはしていません。以下学習を進めた順に記述します。試験に向けて学習した時間は、人によって差があると思うので記述しませんが、UdemyのPractict Testsがパッと解答できるくらいまで練習しました。

Kubernetes完全ガイド

ひととおり読み終えました。完全ガイドというタイトルのとおり、網羅性及び内容は申し分なく、とても詳しく解説されています。Kubernetesはもとより、また周辺のエコシステムについても紹介されており大変参考になりました。

2020年8月?に第2版が出版されているようです。初版で扱っているバージョンはv1.10.5となっています。私は初版を使用しましたが、特段情報が古いといった感じはしませんでした。

Udemy – Certified Kubernetes Administrator (CKA) with Practice Tests

とても参考になりました。本コースのPractice Testsをパっと解答できるようになるまで繰り返し練習しました。全体を2周と理解が浅い箇所については、追加で練習をしました。

英語の動画教材を1周+Practice Testsを1周、Practice Testsのみを1周、理解が浅いところのPractice Testsを何回か練習、といった要領で学習を進めました。

コース単体はそれなりの受講料なのですが、定期的にSALEをしているようで、私もSALEのタイミングで申し込みをしました。

https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/

Kubernetes the hard way with vagrant

Kubernetes the hard wayのVagrant版です。スクリプトを実行していくとクラスタを構築できます。コンポーネントの関連性を理解するのに役立った気がします。

https://github.com/kenfdev/kubernetes-the-hard-way-vagrant

上記のリポジトリではクラスタのバージョンがやや古かったので、試験と同じv1.19に修正して進めました。v1.19にする事で上手く動かない部分があり対処していくなかでより理解が深まった気がします。kubeadmを使うと楽に構築できるありがたさが分かります。

CKAD-exercises

https://github.com/dgkanatsios/CKAD-exercises

こちらは試験前日に1周しました。UdemyのPractice Testsにでてくる操作と重複しているところもあるので、ざっと流しました。こんな操作方法もあるのか、といった発見はあったので試験で活用したか否かに関わらずやっておいて良かったです(続いてCKADも受ける予定なので)。

受験環境

受験端末

Windows10のノートPCです。CPUはCorei5、メモリは8Gです。カメラは、ノートPCに内蔵のものです。特に問題はありませんでした。

受験場所

私はレンタルスペースを借りました。大晦日に小規模な会議室で一人ポツンと受験しました。WiFi環境が不安だったのですが、特に問題なかったです。試験中に切れることもありませんでした。私は特に確認もせず大丈夫だろうと楽観的でしたが、心配な場合は事前にしっかり確認した方が良いと思います。試験環境の接続性や操作性については、UdemyのPractice Testsの環境よりサクサク動いた気がします。

時間

受験前に身分証明書や試験場所のカメラ確認などがあり、20分強くらいはかかった気がします。レンタルスペースを借りる場合は、前後の時間を考慮しておいた方が安全です。別の予約が入っていて延長できないといった焦りや心配がないので。

受験の流れ

試験予約

My Portalから試験予約をします。私は、大晦日12/31の12:00〜14:00で申し込みました。季節が冬で寒かったので、できるだけ早朝と夕方の冷えこみそうな時間帯を外しました。

試験ポータルから試験へ

15分前になるとMy PortalからTake Examのボタンが有効になり押せるようになりました。しばらくするとチャットで指示が飛んできます。

本人確認など

私は運転免許証とクレジットカードを提示しました。最初に運転免許証を見せ、セカンダリIDはあるか?と聞かれたのでクレジットカードを見せました。その後、室内の様子をカメラで映しました。ノートPCの内蔵カメラを使っていたので、カメラによる室内確認はやややりづらかったです。外付けのWebカメラがあれば良かったかもしれません。

CKA-JPで申し込んだので、試験監督は日本語を使用されていました。試験開始直前以降くらいから英語でのチャットとなりましたが、優しい内容のため理解できました。こちらからはokとかyesを答えるくらいです。

Chromeブラウザ以外のアプリケーションは閉じられるように指示されます。タスクマネージャでの確認もあります。また、ブラウザのタブは試験サイトとDocsのみ開くことが可能です。

と、開始までに色々と確認していると20分強くらいは経っていました。

試験本番

試験開始直後は初めての画面操作のため少し焦りましたが、落ち着いて読み進んでいけば操作に慣れてきます。焦らず進めることが大切です。問題数は20問弱くらいです。

途中ターミナルで応答がかえってこない?と思った場面がありましたが、Ctrl-Cで操作を中断し事なきをえました。チャットで英語で会話しましたが、”続けてくれ”、となり気を取り直し別のタスクの解答へ進みました。

キーボード操作、特にコピー&ペーストはCtrl-C、Ctrl-Vでないので気をつけます。マウスの右クリックによるコピー&ペーストは可能でした。

言語の選択

言語は日本語が選択できますが、内容がいまいち読みとりづらかったので結局英語にきり替えて進めていきました。UdemyのCKAコースで慣れていたので、問題文を理解できないことはなかったです。

難易度

全く手がでないという問題はありませんでしたが、序盤で1つの設問で求められる指示が多いものに遭遇したためか、焦ってしまいました、このペースで続くのかと。。しかし、なかには簡単ですぐに解答できる問題もあるため、難しい問題で悩みすぎず簡単な問題を着実に解答していくのが焦らず良いかもしれません。時間は、操作に慣れていないと足りなくなるかもしれません。私の場合は、その場でDocsをゆっくり読んでいる余裕はなかったです。

Docs参照について、ブックマーク集を用意していましたが、結局kubernetes.ioで検索してました。学習中に検索で表示されるタイトルをなんとなく覚えていたので、焦って目的のコンテンツを探し回るということはなかったです。

合否の連絡

36時間以内に合否がメールで知らされることとなっています。私の場合は、34時間くらいで連絡が来ました。連絡が来るまでは気になってなかなか落ち着かなかったです。

試験を終えて

2021年、良いスタートをきることができました。

CKAの試験勉強の過程で、体系的な知識を得ることができたことが良かったです。クラスタに関して簡単な操作はできるようになった気がしますし、クラスタのアーキテクチャについても概要を理解できたと思います。また、試験については実技試験であったため少し自信がつきました。総合して受験して良かったと思っています。

これでようやくスタートラインに立てたと思いますので、今後さらに研鑽をつみ、実践スキルを強化していきたいと思います。

参考/お世話になったリンク

学習や試験に際しては、以下の受験記を参考にさせていただきました。感謝です。なるべく直近で受験された方の受験記を参考にさせていただきました。事前に雰囲気を知ることで、試験で大きく焦らずにすみました。

  • https://qiita.com/mochizuki875/items/a77d5c495d2fb99bd2f9
  • https://www.kimullaa.com/entry/2020/03/27/082156
  • https://www.ubsecure.jp/blog/20200924

Amazon Linuxのamazon-linux-extrasのdockerでのulimit指定

Amazon Linux2でdockerを動かす際、open files制限に引っかかってしまった。systemdのdocker.serviveやlimits.confでの設定はしていたが、dockerコンテナを起動してもlimitsが1024:4096となってしまう。

どうも、docker.serviceの環境定義ファイルのオプションで指定されているようだった。

/etc/sysconfig/docker

--default-ulimit ulimitの値を変更してあげればよい。それ以外では、オプションでなく/etc/docker/daemon.jsonを利用してもよいかもしれない。

 amazon-linux-extrasのdocker

パッケージの中身を確認する。

参考リンク

docker-jitsi-meetのENTRYPOINT

docker-jitsi-meetのbaseコンテナイメージ指定されている/initスクリプトは何だろうと思い調べた内容である。結論から言うと、s6というスーパバイザプログラムでプロセスを実行している。

entrypoint /init

s6 overlay

s6 overlayは、s6というunix系のスーパバイザツールをベースとしたDockerイメージ作成のためのツールセットのことらしい。s6は、daemontoolsやrunitのようなスーパバイザツールである。
Dockerfileのサンプルは以下のようになる。

ENTRYPOINTは/initというスクリプトとなる。s6 overlayツールは、プロセス実行のライフサイクルをステージという単位で扱いプロセス実行している。docker-jitsi-meetは上記をbaseイメージとして使用し、各種サービスのコンテナイメージをbaseイメージから派生させ作成している。

s6 overlayのステージ

以下の初期ステージ、実行ステージ、終了ステージ、の3つのステージで構成される。

stage 1

イメージの準備ステージ。具体的には環境変数の設定などである。

stage 2

ユーザ提供のファイルが実行されるステージ。
  • /etc/fix-attrs.dで所有者やパーミッションなどの設定
  • /etc/cont-init.dのスクリプト実行
  • /etc/services.dのサービスを実行しs6が監視を開始

stage 3

終了処理のステージ、プロセスのclean upと停止処理が行われる。
  • /etc/cont-finish.dでfinalize処理
  • SIGTERMでgracefulシャットダウン、SIGKILLで強制停止
基本的には、stage2と3のxxx.dで実行されるフックを使用し目的のプログラムを実行する感じになる。
試しに実行してみよう。

コンソールログから、ステージのライフサイクルを確認できる。また、実行したshは、s6-svscanというプロセスの管理下に置かれていることが分かる。s6-svscanに関する内容は以下にある。
参考)s6-svscan

s6 overlayを使ったイメージ作成と実行

単純な文字列を出力するだけのアプリを動かすイメージを作成する。

ファイル構成

  • etc下にs6で必要となるリソースを配置する。すべてのステージのファイルは必要ではないが、サンプルでは用意する。
  • app下にアプリケーションを置く。今回は、単なるsleepするシェルスクリプトである。

Dockerfileとdocker-compose.yaml

Dockerfile
s6 overlayのインストールとユーザ作成、/initを実行するだけのDockerfileである。

docker-compose.yaml
ホスト側のフックのためのスクリプトを配置したディレクトリをマウントする。

s6 overlayのリソース
etc/fix-attrs.d/01-myattr

これは、以下の形式で記述している。/appディレクトリに対する所有者及びパーミッションを設定している。

参考
etc/cont-init.d/01-config

shebangで指定しているwith-contentというプログラムでは、コンテナの環境変数を構築しexecコマンドで引数で指定されるプログラムを実行している。
etc/services.d/myapp1/run

etc/services.d/myapp1/finish

etc/services.d/myapp2/run

etc/services.d/myapp2/finish

etc/cont-finish.d/

app
単なるsleepするだけのシェルスクリプト。
app/myapp1

app/myapp2

イメージの実行

作成したイメージとアプリを実行してみる。

このプログラムを実行すると、myapp1とmyapp2が終了しても繰り返しプロセスが実行されることが分かる(通常のサーバープログラムは、上記例のようにすぐにプロセスが終了することはない)。s6-svscanによるスーパバイザが機能していることが上記例から分かる。

終了させる場合は、以下のようにできる。

コンテナのログには以下のように表示される。

その他

initやinit-stageXのスクリプトは、execlineというスクリプト言語で記述されている。シェルのようだがシェルとは異なる。コマンド実行に有用な機能が備わっている。
execline

参考リンク

nginxプロキシでアップストリームのヘッダを消す

nginxプロキシでアップストリームサーバが返す一部のレスポンスヘッダを消したい。

アップストリーム側で出力しているヘッダがあり、nginxプロキシ側でも同様にadd_headerでヘッダを出力している場合にヘッダが重複してしまう。例えばmattermostのdocker版では、一部のページでX-Frame-Optionsが重複して出力されてしまう?ようだが、どのページかは言及されていない。ただパッと見た限りではloginページくらいか?ブラウザはエラーにはならないが、できれば取り除きたい。

https://github.com/mattermost/mattermost-docker/issues/468

ソースを調査するかぎりでは、ソース内に直書きされているので管理画面で削除するといったことはできなさそうだった。

https://github.com/mattermost/mattermost-server/blob/3099128bbd4faa1cdcf716182e2cc43c294badfd/web/handlers.go#L171

mattermostのdocker版は、nginxコンテナでsecurity.confというファイルが読み込まれるようになっている。その中で以下の3つのヘッダがレスポンスヘッダに追加される。X-Frame-Options SAMEORIGIN;が追加されていることが分かる。

proxy_hide_header

このディレクティブは、ngx_http_proxy_moduleというモジュールで使えるものだが、デフォルトで組み込まれているモジュールのため使用できる。以下のように指定する。

以下をconfに設定して反映してみよう。

nginxコンテナのconfをコピーしてきて、

以下のように編集する。オリジナルのconfとの差は以下のとおり。

編集したconfを反映する。

ページにアクセスしてみると重複は解消されている。

他のアプローチとして、headers-more-nginx-moduleというモジュールがあるが、これは別途組み込みが必要なようだ。

https://www.nginx.com/resources/wiki/modules/headers_more/

参考リンク

プログラミングや日常の記録など