2026年2月14日土曜日

Azure DevOpsで「Invalid clientid or client secret」エラーが出た時の解決策!Workload Identity Federationへの移行手順




Azure DevOpsからApp ServiceへDockerイメージをデプロイしようとしたら、突然のエラー。

Invalid clientid or client secret.

昨日まで動いていたのになぜ?

原因はサービス接続(Service Connection)の裏側にある「アプリの登録」の有効期限切れでした。

今回は、今後二度と期限切れに悩まされない「Workload Identity Federation」を使った最新の修正方法をまとめます。

1. 発生したエラー:Build and Push Web Imageで失敗

まずは、私が発生したエラーログを共有します。
• ##[error]error from registry: Invalid clientid or client secret.
• ##[error]The process '/usr/bin/docker' failed with exit code 1
一見するとApp Service側の問題に見えますが、実はAzure Container Registry (ACR) へのログイン失敗が原因でした。


2. 原因:サービス接続(サービスプリンシパル)の有効期限切れ

Azure DevOpsの「サービス接続」は、裏側でAzure Entra ID(旧Azure AD)の「アプリの登録」を利用しています。
インフラ管理画面(Entra ID > アプリの登録 > 証明書とシークレット)を確認したところ、シークレットの有効期限がバッチリ切れていました。


3. 解決策:Workload Identity Federation (automatic) で再作成

シークレットを更新しても直りますが、また数年後に同じエラーが起きます。
今回は、Microsoftが推奨している「パスワードレス」な方式、Workload Identity Federation を使って作り直しました。
設定の手順:
• Project Settings > Service connections > New service connection
• Azure Resource Manager > Workload Identity Federation (automatic) を選択
• 対象のサブスクリプションとリソースを選択して保存

4. YAMLファイルの修正と承認(Permit)

接続を新しく作った後は、azure-pipelines.yml の containerRegistry や azureSubscription の名前を新しいものに書き換えます。
初回実行時は、パイプライン画面で 「Permit(許可)」 ボタンを押すのを忘れないようにしましょう。
※パイプライン実行した後、しばらくしてサイト見てみたら表示できなくて、焦ってパイプライン状況をみたら途中で止まっててびっくりしました。許可が必要だなんて知らなかった、、、

2026年2月8日日曜日

Excelマクロの呪縛を解く。20年目のエンジニアがkintone集計ツールにkrewDataを選んだ理由

 



1. はじめに:エンジニアがkintoneに触れる

ずっとスクラッチのシステム開発(フルスクラッチでの設計・実装)を主戦場としてきた私ですが、最近はお客様から「開発コストを抑えたい」「導入後、自分たちで保守・運用できる仕組みにしたい(ノーコード)」という切実な声を多く聞くようになりました。

そこで数あるノーコードツールの中から、特にカスタマイズ性の高いkintoneに着目しました。

背景にあるのは、多くの現場で「負の遺産」となっている「Excelマクロのブラックボックス化」という普遍的な課題です。これをkintoneという近代的なプラットフォームで、いかに「持続可能な形」に再構築できるか。そこがエンジニアとしての私の挑戦の始まりでした。

2. 直面した課題:標準機能だけでは超えられない「集計の壁」

RDB(リレーショナルデータベース)でいう「テーブル」を、kintoneでは「アプリ」という単位で扱います。

「社員マスタ」「サービスマスタ」といったマスタデータを参照し、日々の活動を記録する「トランザクションアプリ」を作ること自体は、kintoneの標準機能で驚くほどスムーズに実現できました。

しかし、大きな壁となったのが「複雑な集計ロジック」です。

単なる数値の足し算ではなく、以下のようなビジネスルールが絡む場合、標準機能だけでは対応が難しくなります。

• 「利用開始月は無料にする」

• 「解約日が15日以前なら当月分は0円、16日以降なら満額請求」

これをノーコードで、かつ誰が触っても壊れない「堅牢なシステム」として実装するには、標準機能の枠を超える必要がありました。

3. 解決策の比較:DataCollect vs krewData

この「標準機能の限界」を突破するための外部サービスとして、市場で圧倒的なシェアを持つのが、トヨクモ社の『DataCollect(データコレクト)』と、メシウス社の『krewData(クルーデータ)』です。

■ DataCollect(関数型・リアルタイム集計)

アプリの画面上で、Excelのように数式(SUMやIFなど)を直接入力して計算させるツールです。

• メリット: Excelの延長線上で設定できる手軽さがある。

• 懸念点: 数式の中にロジックが隠蔽されがち。数が増えると「どのフィールドにどんな式があるか」の把握が難しく、スクラッチ開発でいう「スパゲッティコード」に近い状態になるリスクを感じました。

■ krewData(ETL型・バッチ処理集計)

複数のアプリからデータを吸い上げ、工場のライン(フローチャート)のように加工して、別のアプリへ一括で書き出すツールです。

• メリット: データの結合(JOIN)やフィルタリングの流れが視覚的に固定される。

• エンジニア視点: データフローが可視化されているため、不具合時の切り分けが容易で、構造が非常に直感的です。冒頭にフローイメージも作ってみました。

4. 決め手は「3年後のメンテナンス性」と「デバッグ」

システムは「動く」のは当たり前です。本当に大切なのは「3年後に自分以外の誰かがメンテナンスできるか」という点です。

お客様の中にはExcelに詳しい方もいらっしゃいます。しかし、なまじExcelが使えてしまうと、複雑な数式を無理やり組み込んでしまい、結局「作った本人しか直せない」状態に戻ってしまう危険性があります。

その点、krewDataは「数式を意識させすぎない」UIです。集計や条件分岐がノード(図)として表現されるため、エンジニアも非エンジニアも同じ土俵で「データの流れ」を理解できます。結果的に、これが「お客様自身で運用を回せる」という真のノーコードの価値に繋がると確信しました。

5. まとめ:エンジニアがノーコードを扱う「真の価値」

Excelで実現されている現行業務には、必ずといっていいほど「泥臭く複雑な条件」が潜んでいます。

その要件をただツールに詰め込むのではなく、いかにシンプルで安定した「データのパイプライン」に落とし込めるか。そこがエンジニアの腕の見せ所です。

道具が変わっても、設計思想の重要性は変わらない。そう感じたツール選定でした。


2026年2月1日日曜日

マクドナルドの闇!?フィレオフィッシュのチーズが「半分」なのは、実は計算し尽くされた戦略だった件




 1. 衝撃の発見:その時、事件は起きた

マクドナルドで不動の人気を誇る「フィレオフィッシュ」。

ホカホカのバンズを何気なくめくってみたら……




「えっ、チーズが半分しかない!?」

これ、マック好きなら一度は経験したことがある「フィレオフィッシュあるある」かもしれません。私も最初は「バイトの店員さん、忙しくてちぎれちゃったのかな?」と、クレームを入れる寸前までいきました。

2. 発覚した衝撃の事実:ミスじゃなかった!

怒りに震えながら(?)念のためネットで調べてみると、Yahoo!知恵袋や元店員さんの証言で驚愕の事実が判明。


「フィレオフィッシュのチーズは、最初から半分(1/2枚)が正規のレシピです」


なんと、入れ忘れでも手抜きでもなく、マクドナルドの厳格なルールだったのです。

3. なぜ「半分」なのか?マックのこだわり(という名の正当化?)

なぜ、わざわざ1枚を半分にする手間をかけてまで「半分」にこだわるのか。そこには深い(?)理由があるようです。

• 味のバランス: 白身魚の繊細な味を殺さないよう、チーズの主張を抑えるため。

• コスト管理: …という側面も否定はできませんが、公式には「最高の味のバランス」を追求した結果だとか。

ちなみに、ダブルチーズバーガーにはあんなにチーズが入っているのに、フィレオフィッシュだけがこの扱い。まさに「選ばれし半分の美学」ですね。

4. まとめ:知らぬは客ばかりなり

「チーズ半分」を知らずに食べ続けている人は意外と多いはず。

次からフィレオフィッシュを食べる時は、そっとバンズをめくって「今日も正しく半分だな」と、職人のこだわりを確認してみてください。




【失敗談】3COINSタブレット(2525/PRE-GHTB)をドアベル専用モニターにする計画が崩壊した話。CloudEdgeは動くのか?

 


1. 導入:完璧な計画だった。

「玄関のインターホン(CloudEdge)を、キッチンで座ったまま確認したい。」

そんな願いを叶えるべく、3COINS(スリコ)で1万円のタブレット(2525/PRE-GHTB)を購入。

「Android 15だし、アプリの要求はAndroid 5.0(Lollipop)以上。勝ったな。」

そう確信してレジへ向かったあの時の自分に、今の私は言いたい。「ちょっと待て」と。

2. 期待に胸膨らむ「開封の儀」



• パッケージを開けると、1万円とは思えない綺麗な大画面。

• 「これがサブ機として動けばコスパ最強伝説の始まりだ」とワクワクしながら電源をON。

3. スムーズなセットアップ



• 初期設定はいたって順調。Android 15 (Go Edition) の軽快な動きに、「お、意外とイケるかも?」と期待値は最高潮に。

4. 運命の瞬間:Google Playストアの無慈悲

いよいよ本命のアプリ「CloudEdge」をインストールしようと検索バーに打ち込みます。検索結果に出てきたアイコンをタップした瞬間、目に飛び込んできたのは……



「……えっ?」

アプリ名で検索はできるのに、、、

OSのバージョンは足りているはずなのに、、、なぜ?

5. なぜ拒絶されたのか?(技術的な考察)

調べたところ、原因はおそらくこれです。

• Android Go Editionの制限: 低スペック端末向けの「軽量版Android」であるため、特定の高度な機能やハードウェア要件(映像のエンコード/デコード等)を必要とするアプリが制限されることがある。

• カメラ・マイクの権限や解像度: ドアベルという「リアルタイム映像」を扱う特性上、このタブレットのチップセット(Allwinner A333)がサポート対象外と判断された可能性。

6. まとめ:1万5000円の勉強代

今回の教訓。

「Androidのバージョンが最新でも、Go Editionには見えない壁がある。」

CloudEdgeをタブレットで使おうと思っている皆さん、安物買いの銭失いにならないよう、せめて「Go Edition」ではない普通のAndroidタブレットを選ぶことを強くおすすめします……。

2026年1月28日水曜日

【Azure】WAFとの死闘168時間。ASP.NET CoreアプリをAzure WAFで守ろうとして学んだこと

 



1. イントロダクション

Azureを勉強して、ASP.NET Coreでポートフォリオ兼用のWebアプリを公開してみた。

「せっかくなら実戦的に」とAzure Web Application Firewall (WAF) を導入したが、ここからが本当の戦いの始まりだった……。

2. 最初の壁:ログインできない!

公開直後、ログインしようとすると謎の403エラー。ログを確認すると……

Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)

何が起きていたのか?

ASP.NETの認証用Cookieに含まれる記号の多さが、「攻撃用コードを隠している」と判定されていた。

• 原因: WAFの「異常検知ルール(942450など)」。

• 気づき: セキュリティを強くしすぎると、標準的なフレームワークの挙動すら「悪」とみなされる。

3. 第二の壁:いたちごっこの泥沼

特定のCookieを除外設定(Exclusion)して「勝った!」と思ったのも束の間。今度は別のログが。

• SQL Injection Attack: SQL Tautology Detected(1=1攻撃の誤認)

• Multiple URL Encoding Detected(二重エンコードの誤認)

しかも、よく見るとCookieだけでなく、URLの引数(ARGS)でも発生している。

ここで私は、「1つ1つ除外設定を書いていたら、いつまでもアプリがまともに動かない」という現実に直面した。

4. 決戦:ログから読み解く「真犯人」

WAFのログに記録された detail_message_s をデコードして、じっくり眺めてみた。

そこには、攻撃コードではなく、ただの「日付データ」や「パスワードの記号」があった。

今回の学び(技術的な急所)

1. 多重エンコードの正体: URLの中にURLを入れる(ReturnUrl)際、記号が %252F のように多重変換される。これはモダンなWebフレームワークの「標準仕様」であって攻撃ではない。

2. パスワードの宿命: 強力なパスワードには記号が必須。これをWAFのSQLIルールで検査すること自体が、実はアンチパターン。

5. 解決策:多層防御の再設計

「WAFの設定をいじり続ける」のをやめ、「どこをWAFに任せ、どこをアプリに任せるか」の役割分担を見直した。

• WAF側: パスワードやReturnUrlなど、正規の処理で記号が入り混じる箇所は、勇気を持って「検査除外」または「特定ルールの無効化」を行う。

• アプリ側: ASP.NET Core Identityを正しく使い、「パラメータ化クエリ(静的プレースホルダ)」と「アカウントロック機能」を有効にする。

6. おわりに:本当のセキュリティとは

WAFは「魔法の杖」ではなかった。

ただボタンをポチポチして「最強」に設定するのではなく、「自分のアプリがどういうURLを吐き出し、どういうCookieを使うのか」を理解して、初めて正しく運用できる。

「いたちごっこ」を終わらせたのは、WAFの知識ではなく、自作したASP.NET Coreのソースコードの中にあった一行のエビデンスだった。