機雷がなんだ! 全速前進!

SEというかプログラマというか、日々のエンジニア生活の中で体験したことなどを中心に書き残しています。

*[本]「プロフェッショナルプロダクトオーナー」: プロダクトを効果的にマネジメントする方法

前回の「ゾンビスクラムサバイバルガイド」に続き、また翻訳者の たくぼん さんから書籍「プロフェッショナルプロダクトオーナー」をプレゼントしていただきました。いつもありがとうございます。

概要

この本は、サブタイトル「プロダクトを効果的にマネジメントする方法」にもあるとおり、プロダクトオーナーの役割を担う人が、スクラムを使ってプロダクトを構想し、生み出し、成熟させる方法を説明しています。

感想

この本は、私がこれまでセミナーや書籍やコミュニティなどで学んできたスクラムとプロダクトオーナーに関する重要なポイントが分かりやすく纏められていました。さらに、これまで私が学んできた中には無かった新たな重要なポイントについても、エピソードや具体例を交えて解説してくれており、今後の現場で役立ちそうな知識の引き出しが増えたように思います。原書は2018年の出版以来、アジャイル界隈におけるベストセラーとして広く読まれていたようですが、翻訳版も忖度なしに良書だと思えました。一点だけ残念な点を挙げるならば、持ち歩き用にKindle版の電子書籍を買おうとしたら超絶不便な固定レイアウト形式(文字列検索などができない形式)だった点でしょうか…😅

本書の構成

本の構成は、下記のような章立てになっています。

<構成>
原書刊行に寄せて
日本語版刊行に寄せて
まえがき

■第1部 戦略
第1章 アジャイルプロダクトマネジメント
第2章 ビジョン(Vision)
第3章 価値(Value)
第4章 検証(Validation)


第2部 スクラム
第5章 経験主義
第6章 スクラム


第3部 戦術
第7章 プロダクトバックログマネジメント
第8章 リリースマネジメント
第9章 プロフェッショナルプロダクトオーナー

 

本を読んで個人的に印象に残った点を中心に書き留めておこうと思います。

印象に残った点

印象に残ったフレーズや共感できた点などを以下にメモしておきます。

原書刊行に寄せて

【Page:iv】

"スクラムの大きな強みは、伝えていることがどれだけ明確であるか、相手がどれだけ認識していさるかを頻繁に確認できることです。"(ケン・シュエイバー)

まえがき

【Page:x】

"プロダクトオーナーは、開発、パートナーシップ、インターフェースなどさまざまな方法でプロダクトを持続させ、成長させます。ただし、「自分が決断する」という人物、つまり委員会やグループではない1人の個人だけが、この機能を果たします。"

第3章 価値(Value)

オンプロダクト指標

【Page:68】

"開発者がプロダクトなど、ただ1つの仕事に取り組むことが許される時間。開発者が競合する仕事の間でタスクを切り替えれば切り替えるほど、開発者のコミットメントは低下し、遅延が発生する"

イノベーション率

【Page:73-74】

"設計・開発不良のソフトウェアによる技術的負債の増大。古いソフトウェアを生き長らえさせるため、予算がどんどん消費される(中略)Forrester researchの調査によると、2010年には、IT予算のうち、新しいフィーチャーと保守・拡張に費やされる割合は30%未満でした(図3.16 参照)"

率指標の悪用

【Page:81】

"問題を解決しようとしたことが問題を悪化させてしまい、意図しない結果に至ることをコブラ効果といいます。この言葉はインドの英国植民統治時代の逸話に由来しています。デリーに出没するコブラの数、これが政府の懸念事項でした。そこで、コブラの死体1匹につき報奨金を出すことにしたのです。当初は報奨金目当てに多くのコブラが殺されたので、戦略は成功したかの用に見えました。しかし、収入の足しにするためにコブラを繁殖させようとする輩が現れ始めました。英国政府がこれに気づいて報奨金制度を廃止すると、コブラを飼育していた者たちは価値のなくなった蛇を野に放ちました。結果として、野生のコブラはさらに増えました。表面上の問題解決が状況をさらに悪化させたのです。(中略)「尺度が目標になったとき、それはよい尺度ではなくなる」というグッドハートの法則がこれを言い表しています(図3.20 参照)。"

 

第4章 検証(Validation)

ステークホルダーからのフィードバック

【Page:87】

"ステークホルダーの検証の好例として、Subwayのサンドイッチショップがあります。Subwayは、sandwich作りと顧客との間に透明性を作り出しています(図4.1 参照)。"

狩野モデルによるMVP

【Page:90】

"当たり前フィーチャー、十分な一元的フィーチャー、いくつかの魅力的フィーチャーを押さえれば、MVPになります(図4.4 参照)。

プロダクトは決して「完成」するものではないので、一連のMVPを次々と作っていくことになります。いったんMVPを市場に出したら、主要な価値指標を収集して、次のMVPのためのプロダクトバックログ作成などを行います。

時が経つにつれ、魅力的なものも一元的フィーチャーに変わり、やがて当たり前フィーチャーへと変わっていきます(図4.5 参照)。アンチロックブレーキシステム(ABS)は、かつては高級車のみに搭載されていたフィーチャーでした。現在では、すべての車の当たり前フィーチャーだと考えられています。"

 

第5章 経験主義

複雑さの可視化

【Page:108】

"ステイシーマトリクス(改変版)(図5.1 参照)では、

X軸は使おうとしている技術の確実性を表しています。(中略)左側に行くほど確実性は高くなります。そして右側に行くほど確実性は低くなります。右端では、新しい技術を開発する必要があり、その過程で多くの課題があることを示しています。(中略)

Y軸は要件がどの程度合意されているかを表しています。原点に近いほど必要なことが完全に合意され、変更がないことが期待できます。原点から離れるほど、合意されていることが少なくなります。極端な話、誰も合意しておらず、大まかな目標でさえ合意していないかもしれません。

ケン・シュエイバーは3つ目の軸として、チームという次元を追加しました。"

リスクをマネジメントする

【Page:118】

"僕はマネジメント3.0のクラスで、ティム・ハートフォード(Tim Harford)の短いTEDトーク「Trial, Error and the God Complex」を紹介するのが好きだ。この動画でティムは、リスクを取って学習すること、つまり「よい失敗」をすることの重要性を説明している。"

 

第6章 スクラム

なぜフレームワークなのか?

【Page:126】

"スクラムは自らをプロセスと呼ぶことを慎重に避けています。(中略)ここでポイントとなる要素はオーナーシップです。(中略)スクラムチームがプロセスを自分のものにする必要があります。チームやプロダクト、企業はそれぞれ異なるので、独自のニーズを支援するためにそれぞれに合ったプロセスが現れてくるはずです。とはいえ、足場となる何かから始められれば、チームにとって助けになるでしょう。それは、最小限のルール、つまりフレームワークです。(中略)

プロセスでも同じことが起きます。チームの外で定義され導入されたプロセスを頭ごなしに「押し付け」られたなら、何か問題が起きたときにチームは経営陣やPMOに連絡するでしょう。彼らはプロセスのせいにし、同僚とlunchを食べながら文句を言ったり、ネット上に怒りの投稿をしたりします。責任追及ばかりになってしまうのです

スクラムが出発点、つまり、変更と改善の機会が組み込まれた真のフレームワークだとわかったとき、チームはオーナーシップを持ちます。物事が上手くいかなかったとしても、自分たち以外に責任を追求することはできません。これは、説明責任と自己組織化にとって不可欠な要素です。"

プロダクトオーナー

【Page:132】

"プロダクトの成功には、プロダクトを本当の意味で所有し、最終決定権を持つ人が1人いることが肝心です。

再考の開発チームがいても、間違ったプロダクトを作ってしまっては意味がありません。プロダクトオーナーは、正しいプロダクト、つまりプロダクト全体の品質を左右する重要な存在です。"

ドメインエキスパートとステークホルダーとの関係

【Page:134】

"よいプロダクトオーナーは、ビジネスをさまざまな角度から理解しているドメインエキスパートです。よって、プロダクトオーナーはステークホルダーと協調している中で新しい情報が出てきたときに、素早く調整し、合わせることができるのです。代理人となったプロダクトオーナーは、ステークホルダーの要望を集め、一番声の大きいステークホルダー(騒ぎ立てる人)が喜ぶように優先順位をつけることしかできません。(中略)

現実的には、プロダクトオーナーにそのドメインに関するすべての知識を求めることは、どだい無理な要求です。結果的に振る舞うプロダクトオーナーは、ビジョンとオーナーシップを保ちながらも、プロダクトを導くために他の専門家(Subject Matter Experts:SME)を活用できるはずです。"

開発チーム

【Page:138】

"プロダクトオーナーとして、完璧な開発チームとスタートすることはありえません。時間をかけて完璧なチームになっていくのです。プロフェッショナルなチームになるために必要な時間、集中、リソースを与えましょう。"

プロダクトオーナーとスプリントプランニング

【Page:161】

"2番めのシナリオでは、開発チームは最初から関与します。彼らは、なぜそうするのかという目的を理解します。その機能のオーナーシップを持つ、つまり自分たちのものになります。自分のものならば、気を配り、世話をし、成功させたいと思うものです。"

プロダクトバックログリファインメント

【Page:173】

"僕は、リファインメントは毎週1回がいいと思っているんだ。2週間のスプリントなら、リファインメントは2回だ。予定する時間は就業前の2時間、普通は午後3時から5時。ガイドに書かれている10%ではなく、5%の時間を使う。そして必要に応じて検査し、適応する。その場限りの少しの時間延長で済むこともあれば、そもそも時間を増やしたり、回数を増やすこともある。リファインメントに必要な時間は大きく跳ね上がることはないけれど、リリース内のどの位置にいるかによって、特にメジャーリリースがある場合は変わるかもしれないことを実感している。"

 

第7章 プロダクトバックログマネジメント

プロダクトバックログ

【Page:183】

"では、具体的には何をプロダクトバックログに入れればよいでしょうか?図7.2からもわかるように、プロダクトバックログはあらゆる種類の作業を受け付けます。

  • 機能要求
  • 非機能要件
  • 実験
  • ユーザーストーリー
  • バグ・欠陥
  • ユースケース
  • ケイパビリティ
  • etc.

"

エピック

【Page:193】

"どうやってストーリーを分割しますか?

これは多くのチームでよく課題になります。プロダクトバックログアイテムは、顧客にとって価値がなければならないことを思い出してください。たとえ小さくても、分割されたどのストーリーも何らかの価値を示さなければならないということです。こういった理由から、技術的なコンポーネント(UI、データベースなど)で分割されたストーリーは適切ではないと考えられています(図7.7)。"

受け入れ基準

【Page:195-197】

"ここで、よくある受け入れ基準の書き方を3つ紹介します。

テストは…

各受け入れ基準を「テストは…」という言葉で始めます。こrが即座に人をテストマインドにさせます。プロダクトバックログアイテムごとに「完成」の確認をするために何をテストしようか?という具合です。

デモは…

各受け入れ基準を「デモは…」という言葉で始めます。これが、価値を実証するためにステークホルダーに見せたいことや、スプリントレビューについて考えさせます。ある意味、スクラムチームはスプリントレビューの台本を書いているとも言えます。スプリントレビューで受け入れ基準のリストを配り、1つずつ確認できます。例として図7.9では、受け入れ基準の欄に「デモは…」を追加しています。"

「完成」の定義の例

【Page:212】

"図7.15は1つのプロダクトに取り組む複数チームのための「完成」の定義の便利なテンプレートです。これは、各チームに共通する要素を定義していますが、各開発チーム内での作業方法には自主性が残されています。"

「準備完了」はマインドセットだ

【Page:213】

"ゴミを入れたら、ゴミが出てく

ゴミをスプリントに投入すると、ほとんどの場合ゴミが出力されます。

スプリント開始時に「準備完了」でないものに手をつければ、スプリントの終わりに「完成」しないとも言えます。"

準備完了にする

【Page:217】

"素晴らしいアイデアを持ったスクラムチームと仕事をしたことがあるんだ。彼らは、ストーリーマップのように配置したプロダクトバックログの壁に「準備完了」ラインを追加した。リファインメントで、見積もられ、複数のカードに分割され、受け入れ基準を追加されるにつれ、プロダクトバックログアイテムは壁をどんどん上っていく。

やがて、カードは来居「準備完了」ラインのすぐ近くまでくる。その後、開発チームとプロダクトオーナーが「準備完了」であると判断して初めて、カードはラインの上にう移動され、次以降のスプリントに持ち込まれる。図7.17がその例だ。"

インパクトマッピング

【Page:224】

"インパクトマッピングは、企業がプロダクトを作る際の迷いを防ぐ戦略的なプランニング手法です。各想定は明確に伝達され、チームの各活動は、明確なビジネス目標の1つに向かって明確に商店を当て、調整されます。各活動が目的に明確に向けられているため、それに取り組みながら測定し、検証できます。そうすることで、より効果的なロードマップ作成に繋がります。"

 

第8章 リリースマネジメント

メジャーリリース

【Page:240-241】

"チームによっては、技術的なフェーズを複数のイテレーションで束ねることがアジャイルアプローチだと信じています(スプリントと呼ぶことすらあります。例えば、分析スプリント、設計スプリント、テストスプリントのように)。通常、そこには定められた計画と承認プロセスがあり、それから事前に準備された要件を実装するためにスクラムが使われ、最終的なリリース前にいくつかのテストがあります。これは、ウォーターフォールにスクラムのプラクティスをいくつか挟んだもの、つまり、ウォータースクラムフォールに他なりません(図8.3 参照)。"

複数チームを管理する

【Page:251-252】

"組織は、開発チームそれぞれに複数のプロジェクトを割り当てることでより多くの成果を得ようとし、その結果、ジョハンナ・ロスマン(Jphamma Rothman)が『Manage Your ProjectPortfolio』で述べているような問題が発生することが多くあります。

図8.5からわかるとおり、現在進行中のプロジェクトが増えると、人の時間の奪い合いが増えます。そのため、プロジェクトを素速く終わらせる能力が低下し、完了したプロジェクトの数は減少します。しかし、すべてのプロジェクトは会計年度を通して計画されているので、他のプロジェクトを開始する必要はあります。この複雑な適応システムにおいて、これは正の強化ループと呼ばれるものです。このループは、自己強化し、ループを通るたびに状況を悪化させます。最終的には、あまりに忙しく、過負荷で、多くのことを並行して行うため、何も出荷できなくなるのです。"

スケールしてもスクラム

【Page:258】

"結論から言うと、スクラムのコアとなる価値観とプラクティスは、スケールしても適用されます。NexusLeSS、およびScrum@Scaleは、『スクラムガイド』にしたがって開発されたため、経験主義のマインドセットと自己組織化を中心に据えており、それに最も近いものです。" ← ディシプリンド・アジャイル・デリバリー(DAD)、Scaled Agile Framework(SAFe)が含まれていないことに注目!

ガバナンスとコンプライアンス

【Page:281】

"企業規模が大きいほど、監視を維持し統制下に置くためのガバナンスが必要です。ウォーターフォールでは、ガバナンスのチェックポイントを開発フェーズ間のマイルストーンに一致させます。(図8.25 参照)。何かが構築されるまでは、書類上のガバナンスしかありません。

物事が上手くいかないと、たいていガバナンスが強化され、リリースがさらに遅れます。

ガバナンスなしではカオスになり、ガバナンスを強化すれば秩序も強化されるというのは根拠のない通説です(図8.26 参照)。"

スキルと特性

【Page:301】

"最も重要なスキルドメインビジネスに関する知識で、次に強力なコミュニケーションスキルと続きます。

最も重要な特性決断力、すなわち決断し議論を終わらせる権限と能力を持つこと、次いでビジョナリーであることです。"

 

"プロダクトオーナーの職務記述書の例

ビジネスとドメインを理解する優れたビジョナリーを求めています。役割として、すべてのステークホルダーや関係者と強い交渉力を発揮する、決断力のあるリーダーであることを期待します。プロダクトへの情熱と聞く力は、変化や時折の逆風に対処するのに役立ちます。" ←いや、これスーパーマンやん!現実的にこんな人がどれくらい居るんだろうか、、、こんな人が居たら、別にスクラムじゃなくても上手くいきそうな気すらしますが、以前から思っていたとおり、やはりスクラムはプロダクトオーナー Heavy なフレームワークだなと再認識しました。😅

AWS Fargate のアーキテクチャで気になること

はじめに

最近AWS Fargateのバックグラウンドの仕組みが気になったので、これまでに読んだ書籍やAWS公式ドキュメント、個人ブログなどの情報を一旦まとめておこうと思いました。ここに記載する内容は、同じ情報収集を再度やりたくないために書き留めるもので、何かしらの結論があるような内容でもありません。あらかじめご了承ください。

AWS Fargate

言わずと知れたAWSのマネージドなコンテナ向けサーバーレスコンピューティングのサービスです。具体的には、コンテナオーケストレーションのマネージドサービスであるAmazon ECSもしくはAmazon EKSのワーカーノード(データプレーンとも呼ぶ)として実際にコンテナをデプロイして動作させる環境のインスタンスとして利用します。EC2のようなセルフマネージドなインスタンスとは違い、インスタンスそのものの管理(パッチ適用など)の手間をAWSに委ねることで、アプリケーションやシステムの構築に注力することができます。これ以上の詳細は、ここで説明するまでもないと思いますので、AWSの公式サイトをご参照ください。

アーキテクチャに関する情報(時系列)

調査した内容を時系列で昇順(古い→新しい)で以下に記載していきます。

2018/11/27:Firecracker – サーバーレスコンピューティングのための軽量な仮想化機能

こちらはAWS公式ブログの記事としてFirecrackerについて説明されています。

そして、記事では以下のように記載されていました。

Battle-Tested – FirecrackerはBattle-Testedであり、既にAWS LambdaとAWS Fargateを含む複数のハイボリュームなAWSサービスに利用されています。

タイミング的に AWS re:Invent 2018 の直前の記事なので、満を持して発表されたものだと思われますが、Firecrackerは、既に実践でテスト済(Battle-Tested)で実用的であることがアピールされているように読み取れます。

2021/10/21:AWSコンテナ設計・構築[本格]入門

こちらの書籍はAWSでのコンテナ活用を学ぶに当たっての良書であり、巷の評価も高く個人的にも非常に参考になった書籍です。

そして、書籍中で以下のように記載されていました。(P.246)

Fargateでは、コンテナごとにFirecrackerと呼ばれるマイクロVMを起動させ、マイクロVM上でコンテナが稼働します。正確には、「タスク」と呼ばれる複数のコンテナをグループ化した単位ごとにマイクロVMが稼働します。

この記載から、最近のAWS Fargateは、すべからくマイクロVMのFirecrackerで動作しているように記載されています。

2022/04月頃:AWS公式ドキュメント「Security Overview of AWS Fargate」

こちらはAWS公式ドキュメントでAWS Fargateについて説明されています。

https://d1.awsstatic.com/whitepapers/AWS_Fargate_Security_Overview_Whitepaper.pdf

そして、ドキュメント中で以下のように記載されていました。(P.15~16)

EC2: Fargateデータプレーンスタックの最下部にあるEC2ハイパーバイザーは、信頼されたハードウェア仮想化を使用して、同じ物理サーバー上で実行されているインスタンスを分離する。前のセクションで述べたように、EC2インスタンスはAmazon Linux 2、Fargate Agent、コンテナランタイムを実行する。コンテナの分離境界はcgroups、namespaces、seccomp policiesのような抽象化で構成されている。これらはある程度の分離を提供しますが、タスクとインスタンスの1対1のマッピングを実行することで、タスクのコロケーションを避けることにしました。この実行モデルは何層もの分離を提供する。したがって、Fargateは同じEC2インスタンス上で2つのタスクをコロケーションすることはない。各インスタンスで実行されるタスクは1つだけだ。RunTask APIが呼び出されると、新しいEC2インスタンスが使用され、タスクが停止するとインスタンスは終了する。これにより、EC2のデータプレーン上でFargateのタスクレベルの分離が保証される。 

Firecracker: FirecrackerマイクロVMはホスト上に配置されたタスクごとに作成される。タスクに属するすべてのコンテナはmicroVM内で実行され、セキュアなタスク境界を促進します。FirecrackerはmicroVMをセキュアにする責任があります。firecrackerプロセス自体は、cgroupsとseccompプロファイルを使ってクイルされる。コンテナ/タスクのクレデンシャルとシークレットは、適切なFirecracker microVMだけが利用できるようにする。したがって、Firecrackerで考慮すべき主なセキュリティは、タスク同士を確実に分離することです。

この記載から、AWS Fargateは、2022年4月の段階においてEC2インスタンスとして動作するパターンとマイクロVMのFirecrackerで動作するパターンの2つあるように読み取れます。

2022/12/12:AWS側がしてきたECS / Fargate のスケーリング速度改善の話

元ネタのAWS公式ブログ記事は上記のAWS公式ドキュメント「Security Overview of AWS Fargate」が発表された頃と同じ2022年4月頃になっていますが、その内容を非常に分かりやすくまとめてくれています。

この記事によると、2020~2022年にかけてFargateのスケーリング速度は大幅に改善されており、これまでEC2に比べて遅いと言われていたFargateのスケーリングが、ことECSにおいてはEC2をベンチマークで大きく逆転するようになっているようです。但しEKSにおいては、そこまで達していないようです。上記ブログ内に元ネタのAWS公式のリンクがありますが、一応以下にも記載しておきます。

2024/02/08:Fargate Is Not Firecracker

そして今年の2月に発表された、この何とも衝撃的なタイトルのこの記事です。

今年の1月までAWSの中の人だったJustin Garrison氏が書いたブログ記事には、以下のように記載されていました。

There was an unspoken policy to never point out that Fargate didn’t actually use Firecracker to create “microVMs” for each container. Just let customers believe what they wanted to. Of course all of the documentation and blog posts make it sound like Fargate uses Firecracker, but you have to read between the lines and know how companies push you to believe something that’s not true.

Fargateが実際にはFirecrackerを使って各コンテナに「マイクロVM」を作成していないことは、決して指摘しないという暗黙のポリシーがあった。ただ、顧客が望むことを信じさせるだけだった。もちろん、すべてのドキュメントやブログ記事は、FargateがFirecrackerを使用しているように聞こえるが、行間を読み、企業がどのように真実ではないことを信じさせるかを知る必要がある。

Justin Garrison氏が本当にAWSの中の人だったのか正確には分かりませんが、2023年4月12日のAWS公式ブログ「Amazon EKS が Kubernetes 1.26 のサポートを開始」の中で氏の名前が何度も登場し、更にAWS のデベロッパーアドボケイトの 1 人として紹介されていました。また、同文中で紹介されているショート動画では、本人(※LinkedInと同一人物に見える)が顔と声を出して自ら語っていることから鑑みても、AWSの中の人だったことは本当だと思われます。

2024/04/20:AWS Fargateのアーキテクチャ探訪

最近の以下のブログ記事でAWS Fargateのアーキテクチャを解説してくれていました。

そして、最後の「おわりに」の中で以下のように記載されていました。

リソース効率からしておそらくFirecrackerによる方式が主流なのだろうなと推測しますが、EC2でもFirecrackerのどちらの方式にしてもVMレベルでECSタスクの分離が行われており、いずれにしても堅牢なセキュリティが確保されていると言えます。

確かに、近年のAWS Fargateのスケーリングの改善の結果を鑑みても、私も同じ所感です。

さいごに

AWS Fargateを支えるアーキテクチャについて気になってしまったので、調べた内容を時系列でつらつらと書き連ねてみましたが、調べる前よりモヤモヤしています(笑)。いずれこのモヤモヤを晴らしたいと思いますが、時間が空いてしまうことで、調べた内容やモチベーションが消えてしまわないよう、一旦ここに吐き出しました。

 

今回は以上です。

Kubernetes and Cloud Native Associate (KCNA-JP) 試験に合格しました【二冠】🐳🐳

先日(5/12)Kubernetes and Cloud Native Associate (KCNA-JP) 試験に合格しました。CKA(失効)→CKAD(失効)→CKS→KCNA の順番に取得したので、今更感が満載ですが、来年更新を迎えるCKSを更新するためには、前準備として失効してしまったCKAの再取得が必要となるため、それに向けたモチベーションUpのためにお試しで受けてみました。

Kubernetes認定資格

現在ではLinux Foundationが認定するKubernetesの認定資格は、次の5種類(KCNA/KCSA/CKA/CKAD/CKS)があります。2020年11月にCKS、2021年11月にKCNA、2024年2月にKCSAの認定試験が追加されており、ここ数年におけるKubernetesニーズの高まりを感じます。また、

2024 年認定有効期限ポリシーの変更 - Linux Foundation - トレーニング

で重要なポリシー変更の発表があったとおり、2024年4月1日から全ての認定期間が24ヶ月(2年)に変更されている点にも注意が必要です。

略称 正式名 概要

KCNA

KCNA-JP

  • Kubernetes and Cloud Native Associate(KCNA)
  • 認定Kubernetesクラウドネイティブアソシエイト(KCNA-JP)
Kubernetesと広範なクラウド ネイティブ エコシステムに関する基本的な知識とスキルを証明する(有効認定期間:2年間

KCSA

  • Kubernetes and Cloud Native Security Associate(KCSA)
  • 認定Kubernetesクラウドネイティブセキュリティアソシエイト (KCSA)
Kubernetesクラスタのベースラインセキュリティ設定を理解し、セキュリティ制御の強化/テストと監視/脅威と脆弱性の強化に参加し、コンプライアンス目標を達成できるスキルを証明します(有効認定期間:2年間

CKA

CKA-JP

  • Certified Kubernetes Administrator (CKA)
  • 認定Kubernetes管理者  (CKA-JP)
Kubernetes管理者の責任を遂行するスキル、知識、および能力を備えていることを保証する(有効認定期間:2年間

CKAD

CKAD-JP

  • Certified Kubernetes Application Developer (CKAD)
  • 認定Kubernetesアプリケーション開発者 (CKAD-JP)
ユーザーが Kubernetes 用のクラウドネイティブ アプリケーションを設計、構築、デプロイできることを証明する(有効認定期間:2年間

CKS

CKS-JP

  • Certified Kubernetes Security Specialist (CKS)
  • 認定Kubernetesセキュリティスペシャリスト (CKS-JP)
Kubernetesの熟練した実践者(CKA認定が必要)であり、コンテナベースのアプリケーションやKubernetesプラットフォームの構築、デプロイ、ランタイム時のセキュリティを確保するための幅広いベストプラクティス能力を実証する(有効認定期間:2年間

試験対策

対策はUdemyの過去問を、試験の1週間前と、前日に、ひととおり解いただけでした。

試験当日

これまでの試験(CKA/CKAD/CKS)と同様に、自宅の自分のPCから受験する方式です。例のごとく PSI Secure Browser という試験用のクライアントツールをインストールして試験を行います。個人的には、これまで何度も受験してきているので試験前の準備(クリアデスク、クリアスクリーンなど)は慣れたものでしたが、身分証明書(今回はパスポート)の提示の仕方が少し変わっていました。これまでは、試験官に対してWebカメラ越しにリアルタイムで手持ち提示していましたが、今回は試験準備操作の中で身分証明書を撮影してセルフチェックしたものが提出できるようになっていました。そのため、試験官から「見にくいから、やり直し!」みたいな指摘をチャット(しかも英語)でされて焦るというようなことがなく、これは良い改善だな、と感じました。

試験結果

受験後24時間後くらいにメールで試験結果が通知されます。今回のスコアは【88/100】でした。合格ライン(スコア75)を、ある程度余裕を持って上回ることができました。

所感

これまでの受験した試験(CKA/CKAD/CKS)のように、実際にコマンドを叩きながら課題をクリアしていく実技中心の試験と比べてかなり簡単な印象でした。試験はオンラインの多肢選択式試験なのですが、出題された問題に対する解答が必ずひとつであるため、AWS認定試験のように複数選択があり得る場合と比べると難易度は低い感触です。とはいえ過去問をやっていく中で、知らないことも出てきましたし、試験結果スコアも満点でなく、そこそこだったので、まだまだ精進が必要だなと感じました。

AWS Lambda で実行の冪等性を考慮しておくことの重要性

背景

AWS Lambda を使うと様々な処理を簡単かつサーバレスに実現することができます。お手軽に使える一方でいくつか考慮しておかないと実運用時に痛い目を見ることも沢山あります。いくつかある考慮ポイントの中で、実際にハマった冪等性の観点について少しまとめておこうと思います。

 

発生したこと

S3にオブジェクトをPutしたのをトリガとして S3 Object Lambda でオブジェクトの種類ごとに様々な処理を行っていました。当初は冪等性を考慮した作りになっていなかったのですが、多くないオブジェクト数(10~100)でテストした限りでは特段問題なく動作していたので本番環境へデプロイしました。実際の本番環境では、膨大な数のオブジェクト数(数百万~数億)を処理することになるのですが、次のような問題が発生してしまいした。

 

<問題点> 

  • 1.なぜかLambdaが複数回発火する場合がある
    • 対象データ処理済の場合は、後で発火したLambdaの実行がエラーになる
      • 前に発火したLambdaが正常終了でも最終ステータスがエラーになる
    • ほぼ同時だと複数処理がデータを取り合って待ちやデータ破損が発生する
  • 2.無駄なLambdaのリトライが発生(初期設定では2回)してコストが嵩む
    • データ起因なので、何度リトライしても確実に同じエラーが発生する
    • リトライ対象のオブジェクト(画像)が巨大な場合は、ハイスペックで高単価なLambda(OOMが発生しないようスペックアップしてある)が複数回実行されることでコストが嵩む
    • リトライ対象のオブジェクトが動画の場合は、後続の変換処理で高単価なAWS Elemental MediaConvertを使用していたためコストが嵩む

 

分析と対策

  • その1

今回はS3にオブジェクトをPutしたのをトリガとして S3 Object Lambda を発火させていますが、AWS Lambdaでは発火イベントが意図せず複数回発生してしまうことがあります。これは「At Least Once(最低一回)」という仕様なので、これを前提にする必要があります。

alt text

【AWS Black Belt Online Seminar】Serverless モニタリング 【P.48】から抜粋

 

AWS Lambdaのベストプラクティス「Lambda 関数を冪等にする | AWS re:Post」では、次のように記載されています。

DynamoDB など、スケーリングが容易でスループットが高いサービスを使用してセッションデータを保存します。

このベストプラクティスに従ってDynamoDBを用いてLambdaの冪等性を確保するよう対策しました。具体的な実装のサンプルのソースコードはGithubに置いておきます。

github.com

こちらDynamoDBの操作【新規登録:put_item()、更新:put_item() 】の条件の記載方法が若干ややこしいので詳細は公式ドキュメントを参照してください。

 

  • その2

無駄なLambdaのリトライについては単純にリトライしないようLambdaの「非同期呼び出し」の設定で「再試行(関数がエラーを返すときに再試行する最大回数)」を 0 に設定するだけで対策できます。

 

結果

以上の対策によりLambdaが複数回発火した場合でも、DynamoDBに登録したステータスのレコードをチェックすることで、直ちにLambdaを終了させることができるようになり、無事にAWS Lambdaの冪等性を確保することができました。これにより、前述の問題点をすべて解消することができました。

 

おわりに

前述したとおりAWS Lambdaでは発火イベントが意図せず複数回発生してしまう「At Least Once(最低一回)」という仕様なので、Lambdaが複数回発火すること自体を防ぐことはできません。そのため、Lambdaが複数回発火することを前提に冪等性を確保するよう実装する必要があります。また、Lambdaのリトライ回数や実行時間などの設定についても用途に合わせて適切にチューニングすることも併せて重要です。個々の処理は微々たるコストでも、今回のように取り扱うオブジェクト数が膨大になるとチリツモで、とんでもないコストを請求されることになりますので、くれぐれもご注意ください。(と、自戒の念を込めて…🙏)

 

参考

日の出・日の入を計算するWebアプリをMercuryで作成して公開してみた

今回も小技ネタですが、一応サンプルWebアプリ公開までやったのでブログに書いておこうと思います。

背景

以前から国立天文台公開データを手動でExcelに取り込んで可視化するということをやっていました。(※下図のイメージ:日の出&日の入の時刻の可視化.xlsx

手動で作成して運用していたExcelファイル

年に1回のことなので、自動化するまでもないと思っていたのですが、それすら面倒くさくなってしまったので Jupyter NotebookGoogle Colab)で自動化することにしました。

課題

Jupyter NotebookGoogle Colab)を使えば可視化まで実現できそうではありますが、次のような懸念点がありました。

  • 国立天文台公開データと比較して精度が大きく劣化する可能性がある
  • 作成したノートブックを いつでもどこでもだれでも 簡単に実行できない

結論

今回は、以下のソリューションを使って作成したノートブックをWebアプリとして公開することで前述の懸念点を解決しました。

公開したWebアプリのURLは次のとおりです。

https://daytime.runmercury.com/app/sample

Webアプリの画面イメージ
続きを読む

Amazon S3 ファイルのMD5ハッシュ値を効率的に計算するLambda

ちょっとした小技です。検索しても情報があまり無かったので一応書き留めておくことにします。

背景

S3にアップロードしたファイルが破損していないことを確認するため、アップロードしたファイルのMD5ハッシュ値を計算してチェックする仕組みが必要でした。S3に配置したタイミングで発火する S3 Object Lambda を用いて実現しようとしたところ、巨大なファイルをうまく処理できないという課題に遭遇しました。

課題

S3には大小さまざまなファイル(最低 0 バイトから最大 5 TB)を配置することができるため、場合によっては超巨大なファイルが処理対処となることもあり得ます。また、AWS Lambda は割り当てるメモリ量(128 MB から 10,240 MB までの任意の量のメモリを 1 MB 単位で関数に割り当て可能)によって単価が高くなるため、コストの観点からも不用意に高めることもできません。

やったこと

以下のように処理方法を変えました。

  • Before
 # S3から一気に全てダウンロードして計算する方式(メモリ不足の懸念あり)
s3_object2 = s3c.get_object(Bucket=src_bucket_name, Key=cpy_object_name)
all_body = s3_object2["Body"].read()
md5_hash_value2 = hashlib.md5(all_body).hexdigest().upper()
  • After
# S3から少しずつダウンロードしながら計算する方式(使用済みデータは捨てる)
s3_object1 = s3c.get_object(Bucket=src_bucket_name, Key=cpy_object_name)
md5 = hashlib.md5()
for chunk in s3_object1["Body"].iter_chunks(chunk_size=10240):
    md5.update(chunk)
md5_hash_value1 = md5.hexdigest().upper()

コピペで動作するサンプルコードとパフォーマンス比較計測結果をGithubにPushしておいたので実際に試してみたい人は以下をご覧ください。

github.com

まとめ

S3に格納されたオブジェクトには巨大なものもあり得るため、特別な理由がない限りは、基本的には【After】のようにMD5ハッシュ値の計算を実装すべきと考えられます。

 

Amazon S3で高速にクロスリージョン間ファイルコピーをする方法

背景

現在はマネージドサービスであるS3 クロスリージョンレプリケーション (CRR) があるのであまりニーズがないかもしれませんが、とある事情でクロスリージョン(東京R→大阪R)間でサイズの大きいS3オブジェクトをコピーし、かつ、コピー先のオブジェクトに既存のオブジェクトのメタデータを引き継ぐだけでなく、新しいユーザー定義のメタデータ(x-amz-meta-xxxx)を追加付与しなくてはいけない要件がありました。

やったこと

S3にオブジェクトをPutしたのをトリガとして S3 Object Lambda から

  • boto3.client('s3').copy_object()
  • boto3.resource('s3').meta.client.copy()

などを使ってリージョン間ファイルコピーを試してみました。しかし、ファイルサイズ制限に引っかかったり、転送速度に難があったり、メタデータを引き継げなかったりと、いずれもやりたい要件をうまく満たすことができませんでした。なるべく独自実装したくなかったのですが、やむを得ず

  • boto3.client('s3').upload_part_copy()

を用いて、マルチスレッドかつマルチパートな通信を実装することで、今回の要件を満たすことができました。処理のサンプルのソースコードはGithubに置いておきます。

github.com

達成したこと

前述した方式は、僅かな差ですが最も速くデータを転送できました。(下図)

alt text

また、コピー元オブジェクトのタグやメタデータを引き継ぎ、新しいユーザー定義のメタデータ(x-amz-meta-xxxx)を追加付与することもできました。

参考