handatのdatファイル

日頃の出来事を格納するdatファイル

ALBのヘルスチェックがRequest timed outで失敗しているときにReachability Analyzerを使ったら調査が捗った

AWSのネットワークトラブルが起きたときにVPC Reachability Analyzerを使って解決したら便利だったという話です。

困っていたこと

ALBからECSタスクにリクエストを送りたかった。
しかし、ECSタスクを登録しているターゲットグループのヘルスチェックがRequest timed outになってしまいリクエストがECSタスクに到達していないのを何とかしたい。 ALBのヘルスチェックが失敗している様子

調べたこと

ヘルスチェックのリクエストが到達していないので、ネットワーク周りの問題の可能性が高そうと考え下記のようなことを確認しました。

  • ECSタスクのセキュリティグループでは、ALBのセキュリティグループから8000番ポートへのインバウンドを許可している
  • ECSタスクの8000番ポートにアクセスしたときに正しいレスポンスが返ってくることは別の経路から確認済み

ここまで調べても原因が分からず、他の可能性が思いつかなくてお手上げに近い状態になっていました。

こんな時の救世主こそ、VPC Reachability Analyzerです。

VPC Reachability Analyzerとは

Reachability Analyzer は、静的な設定分析ツールです。Reachability Analyzer を使用して、VPC 内の 2 つのリソース間のネットワーク到達可能性を分析し、デバッグします。Reachability Analyzer は、到達可能なときにこれらのリソース間の仮想パス hop-by-hop の詳細を生成し、それ以外の場合はブロッキングコンポーネントを識別します。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/reachability-analyzer.html

簡単に言うと、2つのリソースでネットワークが到達するかを分析し、経路を表示してくれるツールです。 まさに、今回のような問題が起きているときに重宝するツールですね!

VPC Reachability AnalyzerはAWS Network Managerの一機能として提供されています。

VPC Reachability Analyzerを使ってみる

使い方は簡単です。
Reachability Analyzerのページを開いて、「パスの作成と分析」から設定を行っていきます。

パスの送信元

まず、送信元はALBになるのですが直接指定することはできないので、ALBに紐付いているeniをパスの送信元として指定します。

ここでALBのeniを調べるのに少し時間が掛かったのですが、EC2 > ネットワーク&セキュリティ > ネットワークインターフェイスの一覧からALBのeniを確認することができました。 ALBのネットワークインターフェース AZごとに複数のeniがありますが、使うのはどれか1つで大丈夫です。

送信元タイプをNetwork Interfacesにすると、先ほど調べたeniが選択出来るはずです。 ここで、オプションの「送信元での追加のパケットヘッダー設定」を開いて、送信先ポートをターゲットグループの転送先ポートで指定している8000番に指定します。 Reachability Analyzerの設定

パスの送信先

続いて、送信先はECSタスクになります。こちらも直接指定することはできないので、ECSタスクのeniをパスの送信先として指定します。

ECSタスクのeniはタスクの設定画面から確認出来るのですぐ見つかりました。

送信先での追加のパケットヘッダー設定」に送信元での追加のパケットヘッダー設定と同じ項目があったのですが、こちらは設定しませんでした。
送信元と送信先の追加のパケットヘッダー設定をどう使い分けるのか最後まで分からないままでした。

プロトコルTCPのままでよいので、このままパスの作成と分析を行います。

分析結果

VPC Reachability Analyzerの分析には数分くらい掛かりました。
結果は... 到達不可能。これでネットワーク設定が原因であることが確定しました。 Reachability Analyzerで到達不可能の結果

パスの詳細を確認

Reachability Analyzer でできることはこれだけではありません。経路の詳細を表示してどこに原因があるか特定までしてくれます。 Reachability Analyzer パスの詳細 なんと、ALBのセキュリティグループでエグレスがブロックされていました。これは盲点だった。

設定変更して、再実行

早速、セキュリティグループでアウトバウンドのルールを追加して、

同じ経路の到達確認であれば、再実行ができるので便利ですね!ちゃんとツールのユースケールを理解して作られていそう。

結果は... 到達可能
そして、無事ターゲットグループのヘルスチェックも通過しました! Reachability Analyzer 到達可能になった結果

ALBのヘルスチェックも通過するようになって、めでたしめでたし。

GitHubでパブリックリポジトリへの誤投稿を防ぐ拡張機能を作った

この記事は はてなエンジニア Advent Calendar 2023 の2024年1月7日の記事です。
developer.hatenastaff.com

昨日は id:yunagi_n さんの Google Chrome 拡張機能 / Firefox アドオン作成ボイラープレート 2024 | なつねこメモ でした。2日連続で拡張機能の話ですね。

モチベーション

昨年、GitHubのあるパブリックリポジトリのissueにプライベートリポジトリに投稿すべきコメントを誤って投稿するインシデントを起こしてしまいました。
幸いすぐに気づき削除できたことや投稿内容に機密情報が含まれなかったことで大事にはならなかったものの、もしクレデンシャルや社外秘の情報を含んでいたら重大なインシデントになっていました。
そこで、何か対策ができないかと考えChrome拡張機能を作ることにしました。

作ったもの

github.com

Chrome Web Store でも公開予定ですが、審査待ちのため公開されたらリンクを追加します。 公開されました。 chromewebstore.google.com

機能紹介

  1. パブリックリポジトリ閲覧時ウインドウ下部にメッセージが表示され視覚的に分かりやすくする
    拡張機能を有効にしたときに表示される
  2. パブリックリポジトリのissue/PullRequestの投稿フォームを非表示にして、フォームを利用するための確認をする
    フォームを表示する前に確認ボタンを押す必要がある

見どころ

CRXJS Vite Plugin

CRXJS Vite Pluginを使うと、ReactやVueなどのフロントエンドフレームワークを使いながら簡単にChrome拡張機能を作成することができました。

ただ、2024/01/07時点では Vite v5を使ってしまうとnpm run buildでエラーを吐いて失敗してしまうので、対応するまではvite v4系を使うのが良さそうです。
Build error [crx:web-accessible-resources] TypeError: OutputBundle["manifest.json"] is undefined · Issue #836 · crxjs/chrome-extension-tools · GitHub

パブリックリポジトリの判別方法

この拡張機能を作るには、まずGitHubリポジトリがパブリックリポジトリかどうかを判別する必要がありました。
ページのソースを見ていたらoctolytics-*のようなmeta属性があることに気づき、そのなかのctolytics-dimension-repository_publicからパブリックリポジトリかどうかを判別することができました。
例えば、tak-solder/public-repo-alertリポジトリのページには下記のようなoctolyticsタグが含まれています。

<meta name="octolytics-url" content="https://collector.github.com/github/collect">
<meta name="octolytics-dimension-user_id" content="6647629">
<meta name="octolytics-dimension-user_login" content="tak-solder">
<meta name="octolytics-dimension-repository_id" content="722461988">
<meta name="octolytics-dimension-repository_nwo" content="tak-solder/public-repo-alert">
<meta name="octolytics-dimension-repository_public" content="true">
<meta name="octolytics-dimension-repository_is_fork" content="false">
<meta name="octolytics-dimension-repository_network_root_id" content="722461988">
<meta name="octolytics-dimension-repository_network_root_nwo" content="tak-solder/public-repo-alert">

また、GitHubはSPAで作られており他リポジトリへの遷移時にドキュメントのロードを挟まないことがあるため、その場合でも正しく動作するようにMutationObserverを利用してmeta属性を監視する必要がありました。

GitHubのUIを尊重する

拡張機能は第三者のサイト(GitHub)のUIを変えるものなので、元のデザインは尊重すべきと考えました。
ありがたいことにGitHubPrimer Design System によって作られているので、ほぼCSSを書かずにクラスだけで見た目を整えています。
これによって、ユーザーがGitHubのテーマを変更していてもテーマに合ったUIを提供することができました。

はじめはフォームのsubmitイベントで投稿直前に確認を出す方法にしようかと思っていたのですが、未然に防ぐにはフォームに入力する行動自体を止める方が有効と考え、少し強引な実装でもフォームを隠すようにしました。

まとめ

起こしてしまったインシデントをなくすことはできないので、インシデント起こした後に誠意を持った対応をすることが大切です。
ヒューマンエラーをゼロにすることは不可能なので、同じインシデントを繰り返さないためにどうするかを考えることが最大の誠意に繋がると考えています。

Terraform CloudからGCPにOIDC認証で接続する

はじめに

最近、GCP(Google Cloud Platform)を少し触ろうと思い、せっかくならTerraformでリソース管理しようとしたのだが、Terraform CloudとGCPを接続する方法の記事が日本語だとあまり見つからなかった。
そもそも、「Terraform Cloud GCP」みたいな検索クエリだと検索意図を「Terraform Google Cloud Platform」とも解釈されてしまうため"非Terraform Cloud"の記事も多くヒットしてしまって目的の記事を探すのが難しいという課題もある。

そこで、一つでもTerraform CloudとGCPに関する記事を増やそうと、設定手順のログを記事として残しておく。

Terraform CloudとGCPを利用(認証)する2つの方法

Terraform Cloudの環境からrunしたときGCPの認証を行う方法は2種類ある

  • サービスアカウントのキーで認証を行う
  • Workload Identity連携を利用して動的クレデンシャル認証を行う
    • OIDCを利用してTerraform CloudとGCP間の認証を行う

この記事ではTerraform Cloud側にGOOGLE_CREDENTIALSのようなセンシティブな情報を保存する必要がないWorkload Identity連携を利用して動的認証を行う方法を紹介していく

手っ取り早く使いたい人向けの情報

Workload Identity連携を利用した認証ができれば何でも良いという人はこちらの記事を見て、Terraform CloudとGCPの設定をlocal等のTerraformで行う方法を見ていただくのが良いだろう。

zenn.dev

操作手順

ここから具体的な操作手順に入っていく。

目標

この記事では下記のことができる環境を用意することをゴールとする。

  • Terraform CloudのワークスペースGCPプロジェクトのリソースを作成できるようにする
  • Terraform CloudとGCP間はOIDCを利用した動的クレデンシャル認証を行う

事前準備

これらのリソースは既に存在している前提で手順は書いていく。

[GCP] Workload IdentityのIDプールとプロバイダを作成する

まず、Terraform CloudからGCPへOIDCで認証するためにGCPで「IAMと管理」内のWorkload Identity連携でIDプールとプロバイダを作成する。

1. IDプールの作成

  • プール名
  • 説明
    • 空欄でも問題ないが、Terraform CloudのOrganization名/Workspace名を入れておくと分かりやすいと思う

2. プールにプロバイダを追加

  • プロバイダの選択: OpenID Connect (OIDC)を選択
  • プロバイダ名: tfc-oidc-providerなど任意の名前を付ける
    • ベストプラクティスに沿うのであれば、IDプールにプロバイダは1つしか作られないので、プロバイダ名/IDはユニーク性を考慮する必要はない
  • 発行元 (URL): https://app.terraform.io
    • Terraform Cloudを利用するなら、この欄はhttps://app.terraform.ioで固定になる
  • オーディエンス: デフォルトのオーディエンスを選択
Info JWKファイルのアップロードが必要なUIに見えるが、アップロードしなかった場合は`/.well-known/openid-configuration`からJWKファイルを取得してくるので空欄のまま進めて問題ない

Terraform Cloudの場合は下記のURLのjwks_uriがJWKファイルとして取り込まれる。 https://app.terraform.io/.well-known/openid-configuration

参考: Workload Identity 連携  |  IAM のドキュメント  |  Google Cloud

3. プロバイダの属性を構成

属性マッピング

属性マッピングはこの後の手順があるサービスアカウントとプロバイダを関連付ける際のロールバインディングで使用するようだが、今回は使わないので最低限必要なマッピングだけを設定していく。

Google OIDC
google.subject assertion.sub

属性条件

assertion.terraform_full_workspace=='organization:${TFC_ORGANIZATION}:project:${TFC_PROJECT}:workspace:${TFC_WORKSPACE}'

${TFC_ORGANIZATION}, ${TFC_PROJECT}, ${TFC_WORKSPACE}は各自の環境で異なる値

Terraform Cloudの公式の例ではassertion.sub.startsWith(\”organization:my-org:project:my-project:workspace:my-workspace”\)という記述が用いられているがsub.startsWithだとmy-workspace2のように複数のワークスペースでOIDCトークンが認証されてしまうので、assertion.terraform_full_workspaceの完全一致で条件を指定したほうがより安心なはずである。

Warning 属性条件が不十分だと第三者がTerraform Cloudの他のワークスペースからGCPプロジェクトにアクセスできてしまう可能性があるため、属性条件またはサービスアカウントのロールバインディングを適切に設定する必要がある。

これで保存すれば、IDプールとプロバイダを作成することができる。

[GCP] Workload Identityプールにサービス アカウントへのアクセスを許可する

次にTerraform CloudからGoogle Cloudのリソースを操作を操作するためのサービスアカウントでWorkload Identityを利用できるようにする。

1. サービスアカウントを作成

まず、適切な権限を持ったサービスアカウントを作成しておく。 既にGOOGLE_CREDENTIALS認証で利用しているサービスアカウントがあればそれでも問題は無い。

2. プールにサービスアカウントのアクセス権を追加する

先ほど作成したプールの詳細画面を見に行くと「アクセス権を追加」という項目からアクセス権を追加する。

  • サービスアカウント: Terraform Cloudで使用するサービスアカウントを選択
  • プリンシパル(サービス アカウントにアクセスできる ID)の選択: プール内のすべてのID

追加の際に「アプリケーションの構成」というモーダルが表示されるが、これは不要なので「非表示」を押して閉じてしまって問題ない。

このモーダルは「非表示」で閉じてしまってよい

ここまで行えばGCP側の設定は完了となる。

[TFC] 認証用の環境変数を設定する

最後にTerraform CloudからGoogle Cloudへの接続時に作成したWorkload Identity経由で認証するようワークスペース環境変数を追加する。

Key Value
TFC_GCP_PROVIDER_AUTH true
TFC_GCP_RUN_SERVICE_ACCOUNT_EMAIL Workload Identityと連携させたサービスアカウントのメールアドレス
TFC_GCP_PROJECT_NUMBER GCPのダッシュボードに表示されているプロジェクト番号
TFC_GCP_WORKLOAD_POOL_ID 作成したプールのID
TFC_GCP_WORKLOAD_PROVIDER_ID 作成したプロバイダのID

変数の種類はすべてEnvironment variableを選択する。

Info Workload Identityプロバイダを指定する環境変数には上記で紹介した`TFC_GCP_PROJECT_NUMBER `, `TFC_GCP_WORKLOAD_POOL_ID`, `TFC_GCP_WORKLOAD_PROVIDER_ID`を使う方法の他に、統合した変数`TFC_GCP_WORKLOAD_PROVIDER_NAME`を使う方法がある。

TFC_GCP_WORKLOAD_PROVIDER_NAMEは下記のフォーマットになるが、変数一覧を見たときに各値が分かりやすいよう個別の変数を設定する方法で設定をおこなった。

projects/${TFC_GCP_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${TFC_GCP_WORKLOAD_POOL_ID}/providers/${TFC_GCP_WORKLOAD_PROVIDER_ID}

ここまで設定すればWorkload Identity連携を用いた動的認証が使えるようになっているはず。

トラブルシューティング

実際にTerraform Cloudでrunしてみたところ下記のようなエラーに遭遇したので、対処方法を書いておく。

アクセストークンの生成失敗系のエラー (status code: 400)

Invalid resource name supplied as 'audience': parent resource 'projects/***' does not exist or has been disabled/deleted.

TFC_GCP_PROJECT_NUMBER環境変数の値が間違っているときに表示されるエラー
対処方法: GCPのプロジェクト番号をダッシュボードで確認して、TFC_GCP_PROJECT_NUMBERの値を変更する

The given credential is rejected by the attribute condition.

プロバイダ作成時の属性条件と実行したTerraform Cloudの環境が一致していないときに表示されるエラー 対処方法: Workload Identityプロバイダの属性条件を確認して、組織名/プロジェクト名/ワークスペース名などに間違いがないか確認する

Permission系のエラー (status code: 403)

IAM Service Account Credentials API has not been used in project *** before or it is disabled

OIDCトークンでの認証に必要なAPIが有効になっていないときに表示されるエラー
対処方法: APIとサービスの画面からIAM Service Account Credentials APIを有効にする

Permission '*******' denied on resource

サービスアカウントにリソースの作成・変更に必要な権限が付いていないときに表示されるエラー 対処方法: プロバイダと関連付けたサービスアカウントのプリンシパルに割り当てられているロールを変更する

参考ページ

「初めてのGraphQL」でGraphQLに再入門した

ここ数ヶ月の間GraphQLのサーバサイドの開発をする機会があったのだが、その中で一番難しかったのがスキーマ定義をすることだった。 DBのカラムと1対1になるようなフィールドであれば簡単だが、実際にはそうではないフィールドが必要になり、その定義をどうやって決めれば良いかの判断が難しかったからである。

そこで、初めてのGraphQLを読むことにした。

この本は大まかに言うと以下のような構成になっている。

  • 1,2章: GraphQLの導入
  • 3,4章: 仕様や型定義の説明
  • 5,6章: サーバーサイド/クライアントサイド実装のハンズオン
  • 7章: セキュリティや発展的な使い方
  • 付録: Relayの仕様解説

この記事ではGraphQLの理解を深め、スキーマを定義に役立てられそうな1,2章を中心に要点や感想を書いている。

GraphQLとは

  • APIのためのクエリ言語
  • どのような形でデータを渡すかのみを重要視していて、どのようにデータを生成するかに関心はない

GraphQLの仕様として決まっているのはクライアント/サーバ間の通信を行うための言語仕様のみなので、実装する言語やデータソースに依存しないということが書かれていた。
実際にサーバサイドの実装はメジャーな言語ではすべての言語にGraphQLのライブラリが存在している。

実装面に関する定義がなくRESTのようにAPIの仕様だけになっているということが多くのアプリケーションでGraphQLを採用する一つの要因になっていると感じた。

GraphQLの設計原則

GraphQLの設計原則として以下の5つがが公開されている。

  • 階層構造 (Hierarchical)
    • クエリは階層構造になっていて、フィールドを入れ子にすることができる
    • レスポンスはクエリと同じ階層構造になる
  • プロダクト中心 (Product‐centric)
    • フロントエンジニアを主体として、彼らの考え方や要件に従って実装される
  • 強い型付け (Strong‐typing)
    • アプリケーションごとに定義されている型に基づいている必要がある
  • クライアントごとのクエリ (Client-specified response)
    • GraphQLアプリケーションはクライアントが利用できる機能を公開する
    • GraphQLで提供される機能をどのように利用するかはクライアントが責務をもつ
  • 自己参照 (Introspective)
    • GraphQLサーバは自身の型定義に基づいてGraphQLクエリで問い合わせできる

サーバサイドとして設計原則を読むとGraphQLの型定義に基づいたクエリを定義に基づいて同じ階層構造を返すことだけが求められているように感じた。 一方で「フロントエンジニア主体」や「どのように利用するかはクライアントが責務を持つ」などの表現からGraphQLがクライアントサイドに重きを置いていることがよく分かる。

一つ気になったこととしては、この本の発行(2019年4月)時点のリリース(June 2018)と最新のリリース(October 2021)で5つの原則の順番が異なっている。

June2018版では最初の2つが Hierarchical, Product‐centricの順番になっているが、October2021版ではProduct-centric, Hierarchicalと順番が入れ替わっていた。
GraphQLがプロダクト志向であることをより強く主張したいという意図があるのかもしれないが、それを決定付けるような記事は見つけられなかった。

GraphQLが解決するRESTの課題

  • 過不足あるデータ
    • クライアントで使わない余分なデータもレスポンスに含めることによるパフォーマンス悪化
    • クライアントに必要なデータをすべて取得するために複数回のリクエストが発生することによるパフォーマンス悪化
  • エンドポイント管理の難しさ
    • 過不足あるデータをクライアントごとに最適化しようとするとAPIエンドポイントの数が膨大になる
    • クライアントで必要なデータが変更になると、APIの仕様自体を変更する必要がある

エンドポイント管理の観点に関しては、実際にGraphQLを使ってみるとエンドポイントが1つしかないため、キャッシュの仕組みを考える必要があったり、どんなクエリがを調べるためにアクセスログが使えないなどRESTと比べてデメリットあるようにも思える。
しかし、1つめの必要なデータを1クエリで取得するという要件も含めてクエリごとにRESTのエンドポイントを用意するコストと比較するとGraphQLを使うメリットの方が圧倒的に大きいように感じる。

グラフ理論

上記を踏まえて、2章で説明されているグラフ理論についても少し触れたい。 下記はWikipediaから引用したものである。

例えば、鉄道や路線バス等の路線図を考える際には、駅(節点)がどのように路線(辺)で結ばれているかが問題となる一方、線路が具体的にどのような曲線を描いているかは本質的な問題とならないことが多い。

したがって、路線図では駅間の距離や微妙な配置、路線の形状などがしばしば地理上の実際とは異なって描かれている。つまり、路線図の利用者にとっては、駅と駅の「つながり方」が主に重要な情報なのである。

ー「グラフ理論」(2023/09/02 14:00の版)『ウィキペディア日本語版』。

個人的には路線図の例えがすごくしっくりきた。

路線図を利用者が見る時、下記のような関心ごとがあると思う。

  • 今いる駅はどんな路線が通っているか
  • それぞれの路線に乗るとどこに行けるのか
  • 目的の駅に行くためにはどこで乗り換える必要があるのか

逆に、上記以外の物理的な位置や正確な距離は関心ごとではないため路線図を作る上で重要視されていないことになる。

このグラフ理論をベースとしているからこそ、GraphQLがプロダクト中心でありクライアントが関心を持つことだけを取得できるという原則を重要視しているという考えをより理解することができた。

どう生かすか

初めてのGraphQLを読んでGraphQLはクライアントサイドのためにあるものだということが再認識でき、グラフ理論や路線図の例えによってクライアント主体として考えることでどのようなメリットがあるのかも理解できた。

今後、GraphQLのサーバーサイド開発の求められるのは以下の3つを心がけたい。

  • 関心ごとに着目する(型やフィールドが何のために必要なものなのかを理解する)
  • その上でクライアントサイドが求めている機能を開発する
  • クライアントサイドから見えにくい非機能要件に関しては責任をもつ

IntelliJ系のIDEでバックスラッシュが入力できなくなったときに試すこと

事象

  • IntelliJ系のIDEを使っていて気がついたら\(バックスラッシュ)が入力できなくなっている
  • Karabiner-Elementsを使って、¥(円マーク)と\スワップしている
    • これは
  • IDEGitHub Copilotのプラグインをインストールしている

原因・解決策

GitHub Copilotのプラグイン+\でショートカットが登録されていたので、ショートカットを削除するか、別のキーを割り当てる

備考

バックスラッシュをよく使うPHPStormでは再現せず、期待通りに\が入力できている。 どうやら、PHPStormではスワップした¥キーを入力しても、+¥と認識されているようだった。

YAPC::Kyoto 2023にオンラインで参加しました

"ブログを書くまでがYAPC"ということで、オンライン配信で参加した感想をブログに書きます。 YAPC::Kyoto 2023の発表者・参加者・スタッフの皆さまお疲れ様でした。

配信を見始めたのが12時過ぎからだったので午前中の発表は見れなかったのですが、見た発表の中でいくつか感想を書きたいと思います。

印象に残った発表

マルチテナントの実現における技術選定の審美眼とDB設計 ~ PostgreSQLを添えて ~

タイトルに「PostgreSQLを添えて」とありましたが、メインディッシュがPostgreSQLの発表だったなという感想です。

"Row Level Security"があるという存在は知っていましたが、ポスグレをほとんど使った事がなかったのでへぇ~の連続でした。 確かに、行単位での権限があると他のテナントのデータは参照できなくなるので、マルチテナントとは相性が良さそうだ。

冒頭に、テナントごとにデータベースを分けてしまうのは保守性が悪くなるからアンチパターンだと話した上で、質疑応答の時に「ユーザーのロールに合わせて、ユーザーごとにRLSを付けるのはどうか?」という質問に対してもテナントごとにデータベースを分けるのと同様に保守性が悪くなってしまうと回答していたのも、なるほどなと思い勉強になりました。

発表資料がなかったのですが、こちらの記事を読むと概要はつかめると思います。 soudai.hatenablog.com

ソフトウェアエンジニアリングサバイバルガイド: 廃墟を直す、廃墟を出る、廃墟を壊す、あるいは廃墟に暮らす、廃墟に死す

「人をアサインせずに廃墟を直せると思っている経営者がいる」というような事を話していたのが印象的でした(エンジニア出身じゃない経営だと良くある話かなと思いました) 最低でも1人アサインする(出来れば複数人)と話していましたが、どうしても1人だと知らず知らずのうちに廃墟になってしまう事があると思うので、廃墟を直す・作らない為には複数人のアサインはマストかなと個人的には思っています。

もう一つ「廃墟に困ったらコードを読みまくる」という話も共感できました。 廃墟のドキュメントって信用できない(ドキュメントもメンテされてなくて情報が古い)ことがあるので、急がば回れの理論でコードを読みまくるのが一番の近道だったりします。

docs.google.com

prototype大全

実はPerlを書き始めて3ヶ月ちょっとなのですがprototypeは曖昧にしていた部分も多かったので、今回の中で一番勉強になった発表でした。 try ~ catch の実装が紹介されていたのですが、スライド1枚にまとまるくらい単純なコードだったのが面白かったです。

どこでも動くWebフレームワークをつくる

JavaScriptのWebフレームワークといえばExpressと思っていた勢でHonoを存じ上げなかったのですが、発表を聞いて使ってみたくなりました。 軽量フレームワークなのでEdge Functionとは相性がよさそうです(元々、それように作られているので当たり前ですが...)

オンライン参加の利点

元々チケットを買っていなかったので最初から配信で見るつもりだったのですが、現地参加ではなく配信で参加する最大の利点は同時に複数トラックの発表を同時に視聴できることだと思います。

さすがに、全部の発表で音声を聞くことはできないので、メインで見たい発表以外はミュートしていましたが、気になる部分があればすぐに発表を聞くことができます。 ということで、思わず気になった発表を2つほど。

DNS権威サービスへのDDoSとハイパフォーマンスなベンチマーカ

毎分900万クエリという文字と、平常時がほぼ無に感じるグラフに目を奪われてしまいました。普通のWebアプリケーションではWAFなど前段で対応すべきトラフィックだと思いますが、あとからスライドを見返してオープンリゾルバからの問い合わせという記述を見て、権威DNSという性質的に前段で対応できないという難しさを知りました。 GoogleやCloudfrCloudflareのPublic DNSはこれ以上のトラフィックを受けている可能性があると考えると末恐ろしいです。

4PB(ペタバイト)を超えるオブジェクトストレージをハードウェアからアプリケーションにかけて運用するノウハウ

こちらも普段目にしないペタバイトという単位に目を奪われました。1年くらい前に我が家で導入した6TBのHDD(当時、コスパが一番良い容量)は、データセンターではもう退役を迎える世代なんだなと。 クラウドを利用してバックにある物理サーバを気にすることがほぼないことのありがたさを感じます。割高でも運用コストを考えるとやっぱりクラウドは安いなと考えさせられます)。

全体を通した感想

YAPC当日は朝起きたら肩から首に掛けて痛く、配信を見始めたのが12時頃からになってしまったのが失敗です。(前日、ソファで仮眠のつもりがガチ寝したのがマズかった) 午前中の発表でも、資料を見て気になる発表はいくつかあったのでアーカイブが配信された際には、改めてブログを書ければと。

オンラインの利点もありますが、配信を見ていても会場の一体感にうらやましさを感じられたので、次回があれば現地参加したいなと思いました。