ブログ

  • ExtendDB + PostgreSQLは「DynamoDBの代わり」になるか — 検証して採択した理由と、明確な欠点

    ExtendDB + PostgreSQLは「DynamoDBの代わり」になるか — 検証して採択した理由と、明確な欠点

    AWS前提で書かれたアプリケーションを、AWSの外で動かしたい。そう考えたとき、最初に突き当たるもののひとつがDynamoDBである。リレーショナルDBなら移行先はいくらでもあるが、あの独特なNoSQLの「代わり」は、AWSの外にあるのか。

    先に結論を書く。当社はDynamoDB互換のOSS「ExtendDB」とPostgreSQLの組み合わせを2段階で検証し、動くことを確認したうえで、進行中のプロジェクトの技術スタックとして正式に採択した。アプリのコードはほぼそのまま、接続先を差し替えるだけで移行できる。ただし、導入前に知っておくべき明確な欠点もあった。

    本稿では、採択に至った理由と検証の中身、そしてその欠点を順に書く。DynamoDBからの移行先を探している人の判断材料になれば幸いである。

    前提 — 我々が置かれていた状況

    EastCloudでは、デジタル庁がOSSとして公開した政府向け生成AI「源内」を、国産のさくらのクラウド上で動かせるかを検証するプロジェクトを進めている(経緯は1本目の記事にまとめた)。1本目で「チャット履歴などの永続化は初期範囲から外した」と書いたが、本稿はその宿題を回収する話である。

    源内のWeb部分(源内Web)は、公式リポジトリでアーキテクチャ図が公開されている。

    源内WebのAWSアーキテクチャ図。WAF、CloudFront、Cognito、API Gateway、Lambda、DynamoDB、S3、Bedrockなどで構成される
    図1: 源内Webの公式アーキテクチャ図。チャット履歴などの保存先としてDynamoDBが使われている(出典: デジタル庁 digital-go-jp/genai-web、CC BY 4.0)

    図の右側にある通り、チャットやエージェントの実行履歴の保存先はDynamoDBである。我々の条件は2つあった。第一に、データは国内の自分たちの管理下に置きたい。第二に、源内Webは公開後も更新が続くOSSなので、上流の更新に追従し続けられる形にしたい。この条件で、DynamoDBの受け皿を探すことになった。

    この記事の主役になる用語(知っている方は読み飛ばしてください)

    DynamoDB
    AWSのフルマネージドなNoSQLデータベース。表の形を厳密に設計するリレーショナルDBと違い、キーに対して柔軟な形のデータを高速に出し入れする用途に向く。バックアップやスケールをAWSが面倒見てくれるため、AWS上のアプリでは定番の保存先になっている。

    ExtendDB
    AWSが2026年5月にオープンソース(Apache 2.0ライセンス)として公開した、DynamoDB互換のAPIアダプタ。DynamoDBと同じ「話し方」(ワイヤプロトコル)を実装しているため、アプリはDynamoDB用のSDKのまま、接続先だけを差し替えて使える。実データは裏側のデータベース(最初の対応はPostgreSQL)に保存される。

    マネージドDB
    データベースサーバの構築・バックアップ・監視・アップグレードといった運用を、クラウド事業者が肩代わりしてくれる提供形態。対義語は「セルフホスト」で、こちらは自分でサーバを立てて自分で面倒を見る。

    移行先の二択

    DynamoDB前提のコードをAWSの外で動かす方法は、実質的に2つに絞られる。

    方針具体例強み弱み
    リレーショナルDBへ再設計するTiDB / MySQL互換、PostgreSQL運用ノウハウが豊富。SQLで検索・集計しやすい上流の更新のたびに、DynamoDB前提のコードを翻訳し直す
    DynamoDB互換のAPI層を挟む(今回の採択)ExtendDB + PostgreSQLアプリのコードをほぼそのまま残せる互換層とDBの両方を自分で運用する

    当社が採択したのは後者、ExtendDB + PostgreSQLである。

    決め手は上流への追従だった。源内Webは公開後も更新が続くOSSで、当社の検証実装はそれに追従し続ける必要がある。リレーショナルDBへ再設計する方式だと、上流がDynamoDB前提のコードを変更するたびに、こちらの翻訳もやり直しになる。互換APIを挟む方式なら、その影響を互換層の中に閉じ込められる。移行のゴールが「一度きりの引っ越し」なら再設計も十分に有力だが、「追従し続ける」なら互換層が有利、という判断である。

    ExtendDBとは何か

    ExtendDBは、AWS自身が2026年5月20日に公開したOSSで、Rust製のDynamoDB互換APIアダプタである。DynamoDBのワイヤプロトコルを実装しているため、AWS SDKやCLIは接続先を変えるだけでそのまま動く。保存先はプラグイン式で、最初のバックエンドとしてPostgreSQL(14以上)が提供されている。

    対応範囲は、テーブル操作、項目の読み書き、Query / Scan、バッチ処理とトランザクション、Streams、TTLなど、DynamoDBの主要なAPIに及ぶ。一方で、グローバルテーブル、リージョン間レプリケーション、オートスケーリングは実装されていないと公式が明記している。

    ここは押さえておきたい。ExtendDBは「DynamoDBのAPIを話す翻訳機」であって、「DynamoDBというマネージドサービス」の代わりではない。バックアップも監視もアップグレードも、翻訳機とその裏のPostgreSQLの両方について、自分でやることになる。

    検証 — 手元で通し、さくらの仮想サーバで通す

    検証は2段階で行った。ExtendDBはv0.1.1を固定して使った。

    段階1(手元の開発環境)。 源内互換のAPI経由で、チャット・メッセージ・実行履歴の作成・取得・更新・削除が一通り動くことを確認した。各コンポーネントを再起動してもデータが残ること、依存先が落ちたときに正しくエラーになることも確認している。アプリ側はDynamoDB用のデータアクセスコードのままで、接続先の変更だけで動いた。

    段階2(さくらのクラウドの仮想サーバ)。 同じ構成一式をさくらのクラウドの仮想サーバへ持ち込み、同じ操作が同じ結果になることを確認した。手元で動くことと、実際に載せたい環境で動くことは別問題なので、この段階を分けている。

    アプリはDynamoDB用SDKのまま接続先をExtendDBへ差し替え、実データはPostgreSQLに保存される構成図
    図2: 置き換えの形。アプリ側のコードはほぼそのまま、接続先だけをExtendDBへ変更する

    2段階の検証がいずれも成功したことをもって、ExtendDB + PostgreSQLを本プロジェクトの技術スタックとして正式に採択した。

    明確な欠点 — 秘密情報が「カタログDB」に集まる

    ここからが、導入を検討する人に一番伝えたい話である。検証の過程で、明確な欠点がひとつ見つかった。

    ExtendDBは、自分の動作に必要な管理情報を「カタログ」と呼ばれる領域に保存する。実体はPostgreSQL上のデータである。検証したv0.1.1では、このカタログに次の2つが保存される。

    • 裏側のPostgreSQLへ接続するための情報(パスワードを含む)
    • 互換APIのアクセスキーを暗号化するための鍵

    つまり、守りたい暗号文と、それを開ける鍵が、同じ場所に置かれる。例えるなら、金庫と金庫の鍵が同じ引き出しに入っている状態だ。しかも、この引き出しごと複製するのがバックアップなので、バックアップを取るほど「鍵と接続情報のコピー」も増えていく。カタログを読めてしまう相手には、暗号化はほとんど効かない。

    ExtendDBのカタログDBに接続情報と暗号化の鍵が保存されバックアップにも複製されることと、外部から直接届かないプライベートネットワークで隔離して読める経路を塞ぐ対策を示す図
    図3: 検証で分かった欠点。カタログDBとそのバックアップに秘密情報が集まるため、ネットワーク隔離を前提に設計する

    マネージドのDynamoDBを使っている限り、この心配はAWSの認証基盤が肩代わりしてくれていた。ExtendDBに乗り換えるということは、この心配がまるごと自分の仕事になる、ということでもある。

    この欠点が実害になるのは、「カタログを読める人」が現れたときである。逆に言えば、対処の方向は2つしかない。鍵を別の場所へ移して同居を解消するか、カタログへ到達できる相手を絞るかだ。前者はExtendDB本体の改修が必要になるため、ソースを改変しない方針の当社は、後者を選んだ。

    具体的には、ExtendDBとPostgreSQLに外部から直接届くアドレスを与えず、プライベートネットワークへ隔離して、アプリからの決められた通信だけを通す。こうすると、カタログへ到達しうる相手は「インターネット全体」から「ネットワークの内側+承認済みの経路」まで縮む。金庫の鍵を引き出しから出せないなら、引き出しのある部屋に施錠して入れる人を決める、という考え方である。

    ただし、これは欠点の解消ではなく緩和である。ネットワークの内側に侵入された場合や、バックアップそのものを持ち出された場合には効かない。だからバックアップの保管先も、同じ水準の管理下に置く必要がある。

    このほかに、運用面の負担も挙げておく。

    • 運用が二層になる。ExtendDBとPostgreSQLの両方について、バックアップ・監視・アップグレードを自分で設計する
    • マネージド機能はない。自動スケールも自動バックアップも、DynamoDBでは意識しなかったものを自前で用意する
    • 互換層のバージョン管理。ExtendDB自体の更新への追従計画が必要になる

    なお、検証が通ることと本番で使えることは別である。バックアップと復旧、性能、運用体制は、それぞれの要件で確認してから本番に載せてほしい。当社もその検証はこれからである。

    さくらのクラウドで使う場合の位置づけ

    誤解のないように書いておくと、さくらのクラウドにマネージドDBがないわけではない。TiDB互換のオンデマンドDBや、データベースアプライアンスといったリレーショナル系の選択肢は用意されている。見当たらないのは、マネージドのNoSQLである(2026年7月の検証時点)。

    だから、DynamoDB前提の資産をさくらのクラウドへ持ち込むなら、道は二択の表のとおりになる。リレーショナルへ再設計してマネージドDBに乗るか、ExtendDBのような互換層を自分で立てるか。今回の我々は上流への追従を優先して後者を選んだが、追従の必要がない一度きりの移行であれば、再設計してマネージドに乗るほうが運用は軽い。資産の量と運用体制で答えは変わる。

    検証結果の賞味期限

    本稿の検証は2026年7月、ExtendDB v0.1.1を固定して行った。ExtendDBは2026年5月の公開から約3か月でv0.1.10までリリースを重ねており(2026年8月26日時点)、月数回ペースの更新が続いている。さくらのクラウド側も機能追加が速い。本稿で挙げた欠点や未実装機能も、読んでいる時点では状況が変わっているかもしれない。判断の前に、最新のリリースノートと公式ドキュメントを確認してほしい。

    まとめ

    • DynamoDB前提のコードをAWSの外で動かす現実的な道は「リレーショナルDBへ再設計」か「互換API層を挟む」かの二択
    • 上流の更新に追従し続けたいなら互換層が有利。ExtendDB + PostgreSQLは、手元とさくらの仮想サーバの2段階検証で動作を確認し、正式に採択した
    • 明確な欠点がある。接続情報と暗号化の鍵が「カタログDB」とそのバックアップに集まるため、ネットワーク隔離などの対策を最初から設計に織り込む
    • マネージドのDynamoDBが肩代わりしていた運用(バックアップ・監視・スケール)は、すべて自分の仕事になる
    • 検証成功と本番運用は別物。バックアップ・復旧・性能は、自分の要件での確認を

    「DynamoDBの代わりになるか」という冒頭の問いに戻るなら、答えはこうなる。APIの代わりにはなる。マネージドサービスの代わりには、自分がなる。

    よくある質問

    Q1. ExtendDBとは何か

    AWSが2026年5月にオープンソース(Apache 2.0)として公開した、DynamoDB互換のAPIアダプタである。DynamoDBのワイヤプロトコルを実装しており、DynamoDB用のSDKやCLIは接続先の変更だけで使える。実データは裏側のデータベース(最初の対応はPostgreSQL)に保存される。

    Q2. ExtendDBはDynamoDBと完全に互換か

    主要なAPI(テーブル操作、項目操作、Query / Scan、バッチ、トランザクション、Streams、TTLなど)に対応するが、グローバルテーブル、リージョン間レプリケーション、オートスケーリングは実装されていないと公式が明記している。マネージドサービスとしての運用機能は利用者側で用意する。

    Q3. 既存のDynamoDB用コードはどのくらい書き換えが必要か

    本稿の検証では、アプリ側のデータアクセスコードはそのままで、接続先(エンドポイント)の変更だけで動作した。ただし利用しているDynamoDB APIがExtendDBの対応範囲に収まっているかは、事前の確認が必要である。

    Q4. ExtendDBを本番運用するときの注意点は何か

    検証したv0.1.1では、PostgreSQLへの接続情報とアクセスキー暗号化用の鍵が、カタログDBとそのバックアップに保存される。カタログを読める相手を絞るため、ネットワーク隔離を前提に設計したい。加えて、ExtendDBとPostgreSQLの二層について、バックアップ・監視・アップグレードを自分で運用する必要がある。

    Q5. さくらのクラウドにDynamoDB互換のマネージドサービスはあるか

    2026年7月の検証時点では見当たらない(NoSQL系のマネージドDB自体が見当たらなかった)。なお、マネージドDB自体はある(TiDB互換のオンデマンドDBなど。いずれもリレーショナル系)。DynamoDB互換が必要なら、ExtendDBのような互換層を仮想サーバ上で自分で動かすことになる。

    Q6. 互換API層とリレーショナルDBへの再設計は、どちらを選ぶべきか

    元のアプリの更新に追従し続ける必要があるなら互換層、一度きりの移行で自分たちのスキーマを育てていくなら再設計が向く。再設計ならマネージドDBに乗れるため、運用は軽くなる。

    参考リンク

  • 社内文書RAGを作って、2か月で捨てた — 作って捨てて分かった「索引の鮮度」問題

    社内文書RAGを作って、2か月で捨てた — 作って捨てて分かった「索引の鮮度」問題

    プロジェクトの設計文書が増えてきて、AIコーディングエージェントに「関連文書を読んでから作業して」と言う回数も増えてきた。エージェントへの指示書(AGENTS.md)は膨らみ続け、会話が長くなると、AIは序盤に伝えたはずのルールを忘れる。それなら、文書をAIに検索させる仕組みを作ればいい——社内RAGを検討した動機がこれだ、という方には共感いただけるのではないかと思う。

    当社もまさにそれで、2026年6月の初めに、設計文書を検索するための社内RAGを作った。そして7月31日に、全面的に廃止した。精度が低かったわけでも、費用がかさんだわけでもない。索引(index)の鮮度を、安全に、安く保証する方法が見つからなかったからである。

    「社内の文書をRAGで検索できるようにする」は、生成AIの業務活用で最初に出てくる定番の企画だと思う。当社はその定番どおりに作り、定番には書かれていない理由で止めた。本稿はその2か月の記録である。先に言っておくと、これは「RAGは使えない」という話ではない。「動くRAG」と「信じてよいRAG」のあいだにある距離の話だ。

    前提 — どんな現場の話か

    EastCloudでは、デジタル庁がOSSとして公開した政府向け生成AI「源内」を、国産のさくらのクラウド上で動かせるかを検証するプロジェクトを進めている(経緯は1本目の記事にまとめた。未読の方はそちらから)。このプロジェクトは、AIコーディングエージェントが実装・レビュー・監査の実作業の多くを担い、人間は方針と判断に集中する体制で動いている。

    当時、エージェントの頭脳として使っていたモデルはGPT-5.5である。いまとなっては一世代前のモデルで、使い込むほどに困りごとがはっきりしてきた。まず、ルールや設計上の決まりはAGENTS.mdに書けば制御できるのだが、大規模なプロジェクトではそのAGENTS.md自体が肥大化していく。次に、会話が長くなると、序盤に渡したはずのルールが忘れ去られる。入力が長くなるほどモデルの性能が落ちるこの現象は、のちにChromaが「Context Rot」という名前で体系的に測定しているが、体感としては当時から明確にあった。そして、毎回「この文書とこの文書を読んでから始めて」と人間が指定する運用は、文書が数十本を超えたあたりで限界が来る。

    そこで、AIが作業前に関連文書を自分で探すための検索RAGを、社内ツールとして試作した。なお本稿で扱うのはこの開発チーム内部の道具の話であり、製品にRAG機能を組み込む話とは分けて読んでほしい。

    この記事の主役になる用語(知っている方は読み飛ばしてください)

    RAG(検索拡張生成)
    AIに質問する前に、関連する文書を検索して「これを参考に答えて」と渡す仕組み。AIが知らない社内情報を答えさせるための定番の構成で、裏側には文書を検索するための索引がある。

    embedding(ベクトル化)
    文章を、意味の近さを数値で比べられる形(数百個の数字の並び)に変換すること。RAGでは文書を小さな塊(チャンク)に分け、それぞれをベクトル化して索引に入れておき、質問もベクトル化して「意味が近い塊」を探す。

    index(索引)
    ベクトル化した文書の塊をためておく検索用のデータ。索引は文書の「その時点のコピー」であり、元の文書を直したからといって自動では変わらない。本稿の主役はここである。

    何を作ったか

    構成は、いま社内RAGを作ろうとしている人が思い浮かべるものとほぼ同じだと思う。

    • 対象: 設計の正本文書(要件、アーキテクチャ、ADR、ロードマップ、引き継ぎ文書、段階ごとの報告書)。作業ログや議事録、ソースコードは対象外
    • 処理: 文書を見出し単位の塊に分け、軽量な多言語embeddingモデル(MiniLM系、384次元)でベクトル化し、ローカルで動くベクトルDB(Qdrantのローカルモード)に索引として保存
    • 使い方: AIエージェントが作業前にコマンドで検索し、ヒットした文書の原文を読みに行く。検索結果は「ヒント」であって正本ではない、というルール付き
    • 規模: 7月中旬の時点で78ファイル、約1,360チャンク

    ツール自体は小さなPythonスクリプトで、作るのに大した時間はかからなかった。問題はそこではない。

    あわせて、AIエージェント向けの作業ルールにこう書いた。「設計文書を追加・更新したときは索引を更新すること。検索結果を判断の根拠に使う前に、関係する文書の更新後に索引が再構築されたことを確認すること」。ルールとしては正しい。だが、このルールを守り続けることのコストを、当時は見積もれていなかった。

    最初はうまくいった

    7月初旬の段階では、ちゃんと役に立っていた。効果を実感した順に挙げる。

    一番効いたのは、ルール逸脱が減ったことである。前述のとおり、当時のGPT-5.5は会話が進むとAGENTS.mdやコンテキスト上の指示が薄れ、序盤に決めたルールを踏み外すことがあった。作業の前にRAGで該当ルールと関連する設計判断を引き当て、原文を読み直させる運用にしてから、この「ルール忘れ」は目に見えて減った。長大な指示書を最初に一度読ませるより、いま必要な数枚をその都度引かせるほうが、明らかに効いた。

    「どの文書に書いてあるか」を探す往復も減った。人間がパスを思い出して指定する代わりに、AIが自分で当たりをつけて原文へ到達する。新しいAIコンテキストを立ち上げるときのキャッチアップも短くなった。

    編集する人が実質1人(動かすAIのコンテキストも1つ)だったあいだは、「更新したら再構築」の運用で十分に維持できた。文書の数が少ないうちは、索引の鮮度は問題にすらならなかったのである。

    何が詰んだか

    崩れ始めたのは7月中旬から下旬にかけてで、原因は3つ重なっている。

    1つ目は更新の頻度である。 設計文書は、7月14日の67ファイルから7月29日の84ファイルへ、2週間で2割以上増えた。数が増えただけでなく、同じ文書が1日に何度も更新される。技術選定が進む時期は、ロードマップ、選定の台帳、ADR、引き継ぎ文書が連鎖して変わるからだ。「更新したら再構築」は、更新のたびに再構築が必要だという意味であり、更新が1日数回あれば、再構築も1日数回になる。そして再構築は、実行して終わりではない。検証まで含めた更新一式に30分ほどかかることもあった。1日に何度も行えば、それだけで明確なタイムロスである。

    2つ目は並行開発である。 7月中旬以降、複数のAIコンテキストが別々のgit worktree(同じリポジトリの作業コピーを複数並べる仕組み)で並行して動くようになった。データ層の選定を進めるコンテキスト、認証まわりの検証を進めるコンテキスト、全体を束ねるコンテキスト。それぞれの作業コピーでは、文書の状態が違う。未コミットの変更もある。ところが索引は1つしかない。「この索引は、どの作業コピーの、どの時点の文書を写したものか」が、もう説明できなくなった。

    3つ目が一番たちが悪い。古い索引は、エラーを出さない。 壊れた索引なら気づける。だが古い索引は、最新に見える過去の答えを、自信たっぷりに返す。たとえば、ある構成を「必須」としていたADRが翌日に「任意」へ改訂されたとする。索引が前日のままなら、AIは前日の「必須」を根拠として引用し、それを前提に実装やレビューを進める。引用元のパスも行番号ももっともらしいので、読んだ人間も気づきにくい。図書館でいえば、本を入れ替えたのに目録カードだけ古いまま、という状態で、しかも司書はカードを信じて本を探しに行く。

    この「頻繁に変わるものの索引は、作った瞬間から古い」という問題は、当社だけの発見ではない。AIコーディングエージェントのClineは2025年5月、公式ポストで「Clineはコードベースに索引を作らない。RAGも、埋め込みも、ベクタDBも使わない。これは制限ではなく、意図的な設計判断だ」と公言している。

    X(旧Twitter)のポスト — Cline(@cline)2025年5月27日

    Cline doesn’t index your codebase. No RAG, no embeddings, no vector databases. This isn’t a limitation — it’s a deliberate design choice. As context windows increase, this approach enhances Cline’s ability to understand your code. Here’s why. 🧵

    Xでポストを見る →

    理由の筆頭が索引の鮮度で、公式ブログの言葉を借りれば、索引とは定義からして「時間の止まったスナップショット」(”An index, by definition, is a snapshot frozen in time.”)であり、進化し続けるコードと必ずズレていくからだ。RAG構築の講座を主宰するJason Liu氏のような推進側の専門家までが、この判断への賛同を公言している。対象がコードか設計文書かの違いはあれど、「頻繁に変わるものを索引で追いかけない」という論理は、当社が痛感したものとまったく同じである。

    鮮度保証を真面目にやったら、作業記録が200件になった

    ここで当社が取った行動は、たぶん多くのチームと同じで、「ならば鮮度を機械的に保証する仕組みを作ろう」だった。7月21日から29日にかけて、段階的に仕組みを足していった。

    • embeddingモデルの取得を固定する。どのモデルの、どの版の、どのファイルを使ったかをハッシュで記録し、ライセンスも確認して、別の人がレビューしてから使う
    • 依存パッケージを丸ごと固定する。Pythonの実行環境に入っている全パッケージのファイルごとのハッシュを記録し、1バイトでも違えば起動しない
    • 再構築を段階化する。いきなり現行の索引を上書きせず、別の場所に新しい索引を作り、検索で検証し、レビューを経てから差し替える。途中で失敗しても古い索引を失わない
    • 索引の元になった文書の集合を固定する。どのブランチの、どのコミットの、未コミット分はどのファイルまでを含めたかを記録し、作成前後でファイルが1つでも変わっていたら止める

    ひとつひとつは真っ当な対策だと思う。実際、この仕組みは何度も「正しく」止まった。実行ファイルのパーミッションが足りずに起動が拒否されたとき。パッケージ管理ツールが自動生成するメタデータに空欄のハッシュが2,700件以上あり、それを「改竄の可能性あり」と判定して停止したとき。モデルの取得にネットワークが要るのに、作業環境の外部通信が閉じていたとき。どれも、仕組みが設計どおりに疑って止めたのである。

    だが、そのたびに原因を調べ、直し、別の担当がレビューし、監査し、もう一度試す。当社の開発は実装・独立レビュー・最終監査を分離しているので、1回の修理で3種類の記録が残る。9日間でこの内部ツールに関する作業記録は約200件に達した。そして気づいたときには、製品の機能でもなんでもない検索ツールの修理が、本来のフェーズの完了——データ層の技術選定を閉じること——を止めていた。鮮度を保証するための仕組みが、フェーズの完了条件に組み込まれていたからである。

    7月31日の決断 — 直すのをやめ、捨てる

    7月31日、プロジェクトの責任者が廃止を決めた。理由は3つに整理されている。

    1. 並行する作業コピーと頻繁な正本更新に対して、索引の鮮度を安全かつ低コストに保証できない
    2. 古い索引が最新の判断と誤認されるリスクを、運用ルールだけでは消せない
    3. 製品の統制ではない内部ツールの修理が、フェーズ完了のクリティカルパスを塞いでいる

    廃止の中身も、曖昧にしなかった。使わない、更新しない、再構築しない、検証しない、修理を再開しない。過去の検索結果を設計・実装・レビュー・監査の根拠に使わない。一方で、ツールのソース、テスト、固定した環境の記録、失敗や修理の記録は、消さずに読み取り専用で残す。「なかったこと」にはしない。

    代わりに何をするか。正本文書を直接読む。それだけである。AIエージェントには、判断の根拠にした文書のパスと行、参照したブランチとコミット、未コミットの変更の有無を記録させる。並行するコンテキスト間の同期は、検索ではなく、人間の判断記録と明示的な引き継ぎ文書で行う。検索の便利さは失ったが、「何を根拠にしたか」は前より明確になった。

    一般化 — 社内RAGを入れる前に確かめたいこと

    当社の失敗を、社内RAGを検討している人向けのチェックリストにしておく。

    • その文書群は、どのくらいの頻度で変わるか。月に数回なら「更新したら再構築」で回る。日に数回なら、再構築の運用そのものが仕事になる
    • 文書を同時に編集する人(やAIのコンテキスト)は何人いるか。複数なら、索引が「誰の、いつの状態」を写したものかを説明できる仕組みが要る
    • 古い答えが返ってきたとき、誰がどう気づくか。検索結果に「索引の作成時刻」と「元文書の更新時刻」を並べて出すだけでも、事故はかなり減る
    • 索引が古いときの被害はどの程度か。社内FAQなら笑い話で済む。設計判断や監査の根拠に使うなら、古い索引は誤った判断を量産する
    • 正本は別にあるか。RAGの検索結果が正本扱いされ始めたら、それは設計上の事故である。検索は入口で、根拠は原文、を守れるか
    • そもそも、検索できないとどれだけ困るか。文書が100本程度で、一覧と目次が整っているなら、「全部の見出しを読む」ほうが速くて確実なことは多い

    当社の場合、最後の項目に戻ってきた。設計の正本を数十本の範囲に保ち、索引を持たず、原文を読む。地味だが、いまのところ一番事故が少ない。

    念のため書いておくと、ここでの比較は「RAG対ファインチューニング」ではなく「RAG対、原文を直接読ませる」である。そして、RAGが正解になる状況も明確にある。LlamaIndexのCEOであるJerry Liu氏は、長コンテキスト時代のRAGを論じた2024年3月のポストで、その前提を「ナレッジベースがコンテキストウィンドウに収まらないほど大きい場合」と置いている。

    X(旧Twitter)のポスト — Jerry Liu(@jerryjliu0)2024年3月1日

    What does RAG look like in a long-context LLM future? Excited to release the first blog post (to our knowledge) on highlighting long context RAG architectures 💫 – where you want to take advantage of the long-context windows but your knowledge base is still too big!

    Xでポストを見る →

    裏を返せば、収まる規模なら選択肢は変わるということだ。文書が数百・数千本あり、全部読ませることが物理的に不可能な組織では、いまもRAGが正道である。当社のように正本を数十本に絞れる現場かどうか、そこが分かれ目になる。

    当社も、内部RAGを再導入する可能性を閉じたわけではない。ただし次にやるなら、鮮度の保証方法、並行する作業コピーとの境界、古い索引の拒否、失敗時の挙動、保守の担当者を、作る前に合格条件として決める。過去の索引が残っているから再開する、はやらない。

    この判断の賞味期限

    本稿は2026年7月末時点の、当社の特定の開発現場での判断である。文書の量、更新頻度、並行度が違えば結論は変わる。そもそも生成AI自体が日進月歩で、それを使った開発のベストプラクティスも数か月単位で塗り替わっている。本稿の困りごとの起点だった「長い会話でルールを忘れる」挙動にしても、モデルの世代が進めば様変わりしうる。本稿の判断は、当時のモデル(GPT-5.5)と道具立てを前提にした一つのスナップショットとして読んでほしい。「社内RAGはやめておけ」ではなく、「索引の鮮度を誰がどう保証するかを先に決めろ」という話として受け取ってもらえれば、賞味期限を超えて役に立つはずだ。

    まとめ

    • 設計文書を検索する社内RAGを6月初めに作り、7月末に全面廃止した。理由は精度でも費用でもなく、索引の鮮度を安全に保証できなかったこと
    • 導入直後は効果があった。ルール忘れが減り、文書を探す往復が減り、新しいAIコンテキストの立ち上がりが速くなった
    • しかし、更新が1日数回・並行する作業コピーが複数、という条件では「更新したら再構築」が破綻する。そして古い索引はエラーを出さず、最新に見える過去の答えを返す
    • 鮮度を機械的に保証しようとした結果、内部ツールの修理が約200件の作業記録を生み、本来のフェーズ完了を止めた
    • 廃止後は正本文書を直接読み、根拠のパス・行・コミットを記録する運用へ戻した。「索引を作らない」は、コーディングエージェント界隈でも設計判断として公言され始めている
    • ナレッジベースがコンテキストに収まらないほど大きいなら、いまもRAGが正道。分かれ目は、文書の量と変わる速さにある

    作ったものを捨てる判断は、作る判断より重い。ただ、今回は捨てたことで「何を根拠に判断したか」がむしろ見えやすくなった。便利さより追跡可能性を取った、というだけの話である。

    よくある質問

    Q1. 社内文書RAGとは何か

    社内の文書をチャンクに分けてベクトル化し、質問と意味の近い部分を検索してAIに渡す仕組みである。AIが知らない社内情報を根拠つきで答えさせるために使われる。本稿では、設計文書をAIコーディングエージェントが作業前に探すための内部ツールとして試作した。

    Q2. RAGのindex(索引)が古いとどうなるか

    索引は作成時点の文書のコピーなので、元の文書を直しても自動では変わらない。古い索引は、エラーを出さずに過去の内容を最新の答えのように返すため、改訂前の設計判断が根拠として引用される事故が起きる。検出する仕組みがなければ、人間も気づきにくい。

    Q3. 社内RAGの索引はどのくらいの頻度で更新すべきか

    文書の更新頻度に合わせる必要がある。月に数回の更新なら「更新したら再構築」で運用できるが、日に数回の更新や複数人の同時編集がある環境では、再構築の運用自体が負担になる。本稿のケースでは、2週間で文書が67件から84件へ増え、同じ文書が日に何度も更新されたことが破綻の一因だった。

    Q4. 社内RAGをやめる判断基準は何か

    索引の鮮度を安全かつ低コストに保証できない、古い索引が最新と誤認されるリスクを運用ルールで消せない、ツールの維持が本来の業務のクリティカルパスを塞いでいる、の3つが揃ったときである。本稿では、製品の機能ではない内部ツールの修理が本来のフェーズ完了を止めた時点で廃止した。

    Q5. 社内向けの文書検索RAGと、製品に組み込むRAGは何が違うか

    開発チームが自分たちのために運用する内部ツールか、顧客へ提供する製品機能かという違いがある。製品に組み込む場合は、鮮度の保証に加えて、権限、監査、障害時の挙動まで要件として設計することになる。本稿の教訓——索引の鮮度を誰がどう保証するかを先に決める——は、どちらにも当てはまる。

    Q6. AIコーディングエージェントに設計文書を読ませる方法で、RAG以外の選択肢はあるか

    ある。設計の正本文書を数十本の範囲に保ち、一覧と目次を整えて原文を直接読ませる方法である。本稿では廃止後にこの方法へ戻し、根拠にした文書のパス・行・ブランチ・コミットを記録させている。文書が少ないうちは、検索より確実で速いことが多い。

    Q7. 社内RAGを再導入するなら、どんな条件が必要か

    鮮度の保証方法、並行する作業コピーとの境界、古い索引の拒否、ネットワークやキャッシュの扱い、失敗時の挙動、保守の担当者を、最初から合格条件として定義することである。過去の索引やモデルが残っているからといって、そこから再開しないことも重要になる。

    参考リンク

  • Kimi-K2.7-Code をさくらのAI Engineで動かす — 差し替え1行と5つの落とし穴

    Kimi-K2.7-Code をさくらのAI Engineで動かす — 差し替え1行と5つの落とし穴

    さくらのAI Engineに Kimi-K2.7-Code が乗りました。手元の OpenAI SDK のコードは base_url の差し替えでそのまま向けられますが、model に Kimi-K2.7-Code と書くと通りません。公式の告知に載っている文字列は、頭に preview/ が付いた preview/Kimi-K2.7-Code です。

    プレビュー提供中のモデルには、この接頭辞が付きます。一方でマニュアルのサンプルコードは正式提供の gpt-oss-120b のままなので、サンプルだけを見て書くと最初の一投目で詰まります。ここを含めて、動かすまでに引っかかる箇所を先に潰しておきます。

    この記事でわかること

    • さくらのAI Engineで Kimi-K2.7-Code を動かす最短手順と、正しいモデル名
    • 手元のコードを base URL の差し替えだけで OpenAI SDK から呼ぶ方法
    • 無料枠の月3,000リクエストでどこまで試せるか、そして thinking が課金に効いてくる理由
    • 速度と失敗率とコストを自分で測るための 実測テンプレ

    なぜ今これか

    コード生成モデルを使うとき、多くの人は OpenAI か Anthropic に API を投げています。ただ案件によっては、データを国内に置きたい、請求と権限を分けたい、特定ベンダーに寄せきりたくない、といった要件が先に立ちます。

    さくらのAI Engine は2025年9月24日に一般提供が始まった推論API基盤で、GPUクラウドの高火力を土台にしています。同じタイミングで、さくらの生成AIプラットフォームは「さくらのAI」へ名称が変わり、AI Engine がその中核に据えられました。公式は、モデルの実行と通信をすべて国内クラウドで完結させ、外部へデータを送らないと明記しています。モデル提供元にもデータが渡らないため、学習に使われる心配もないという書き方です。社内のコードを丸ごと投げるコード生成用途では、ここが実質的な選定理由になります。

    そのAI Engineに、Moonshot AI の Kimi-K2.7-Code が2026年7月28日からパブリックプレビューで乗りました。API は OpenAI 互換なので、既存の OpenAI SDK のコードをほぼそのまま国産クラウド上のモデルに向けられます。しかも Chat Completions は月3,000リクエストまで無償です。まず触るハードルはかなり低い。

    さくらのクラウド上でAIを動かす話はさくらのクラウド シンプルAI(CR版)を申請から疎通まで最短で通すにもあります。合わせて読むと、申請まわりの温度感がつかめます。

    準備。アカウントトークンを発行する

    1. コントロールパネルにアクセスして利用規約に同意し、プランを選ぶ
    2. 左メニューのアカウントトークンから作成に進み、トークン名を入れて発行する

    トークンは <UUID>:<シークレット> というペアの形式で、作成時に一度しか表示されません。公式マニュアルにも、再度表示されないのでコピーして安全な場所に保存するようにと書かれています。ここでコピーし損ねると作り直しです。

    ひとつ紛らわしいのが、さくらのクラウド本体のAPIで使うアクセストークンとシークレットとは別系統だという点です。インフラ管理側の鍵は AI Engine では使えません。AI Engine のコントロールパネルで発行したものを用意してください。

    最短で叩く。curl

    curl --location 'https://api.ai.sakura.ad.jp/v1/chat/completions' \
      --header 'Accept: application/json' \
      --header 'Authorization: Bearer <UUID>:<シークレット>' \
      --header 'Content-Type: application/json' \
      --data '{
        "model": "preview/Kimi-K2.7-Code",
        "messages": [
          {"role": "system", "content": "あなたは熟練のソフトウェアエンジニアです。"},
          {"role": "user", "content": "Pythonで、指定ディレクトリ配下の重複ファイルをハッシュで検出する関数を書いて。"}
        ],
        "temperature": 0.2,
        "max_tokens": 4000,
        "stream": false
      }'

    エンドポイントは https://api.ai.sakura.ad.jp/v1/chat/completions、認証は Authorization: Bearer <アカウントトークン> だけです。OpenAI の Chat Completions を触ったことがあれば、見慣れた形のはずです。

    max_tokens を4000にしてある理由は後述します。ここを小さくすると痛い目を見ます。

    モデル名は preview/ 付き

    冒頭に書いたとおり、パブリックプレビューのモデルには preview/ が付きます。7月28日の提供開始告知に、model パラメータへ指定する文字列として preview/Kimi-K2.7-Code が明記されています。

    これはこのモデル固有の話ではなく、プレビュー全般の命名規則です。Anthropic互換のMessages APIで使えるモデルも preview/Kimi-K2.6 という表記になっています。逆に正式提供の gpt-oss-120b や llm-jp-3.1-8x13b-instruct4 には接頭辞が付きません。プレビューか正式提供かで書き分けが要る、と覚えておけば迷いません。

    裏を返すと、モデル名の正解はマニュアルではなく各モデルの提供開始告知にあります。新しいモデルを試すときは、まず告知ページを開くのが早い。

    OpenAI SDK から使う。差し替えは2行

    既存の Python コードなら、base_url と api_key を差し替えるだけです。

    from openai import OpenAI
    
    client = OpenAI(
        base_url="https://api.ai.sakura.ad.jp/v1",   # ← ここだけ差し替え
        api_key="<UUID>:<シークレット>",              # ← アカウントトークン
    )
    
    resp = client.chat.completions.create(
        model="preview/Kimi-K2.7-Code",
        messages=[
            {"role": "system", "content": "あなたは熟練のソフトウェアエンジニアです。差分だけを返してください。"},
            {"role": "user", "content": "このReactコンポーネントのuseEffectの依存配列漏れを直して: ..."},
        ],
        temperature=0.2,
        max_tokens=4000,
    )
    print(resp.choices[0].message.content)

    環境変数派なら OPENAI_BASE_URL=https://api.ai.sakura.ad.jp/v1 と OPENAI_API_KEY=<アカウントトークン> を設定すれば、OpenAI を前提にした多くのツールがそのまま向きます。

    ただし Anthropic SDK 経由で使いたい場合は事情が変わります。Messages API で使えるモデルは現状 preview/Kimi-K2.6 だけで、K2.7-Code は含まれていません。さくらの7月28日の告知でも、対応APIは Chat completions と書かれています。Claude Code のようなAnthropic互換前提のツールから K2.7-Code を呼ぶ選択肢は、いまのところありません。

    Kimi K2.7 Code はどういうモデルか

    Moonshot AI の公式情報によると、K2.7 Code は総パラメータ1Tのミクスチャー・オブ・エキスパートです。384のエキスパートから8つを選び、トークンあたり32Bがアクティブになります。コンテキスト長は256Kトークン、ライセンスは Modified MIT License です。

    性格としてはコーディング特化のagenticモデルです。K2.6比のベンチマークでは、Kimi Code Bench v2 が50.9から62.0へ、Program Bench が48.3から53.6へ伸びました。推奨設定は temperature 1.0、top_p 0.95 とされています。

    ここで押さえておきたいのが、このモデルは非thinkingモードに対応しておらず、常に思考を有効にして動くという点です。K2.6と比べて thinking トークンの消費量は約30%減ったとされていますが、ゼロにはできません。この性質があとでコストと max_tokens の両方に効いてきます。

    もう一点、さくらの告知はこのモデルを画像とテキストを組み合わせた理解と生成が可能なマルチモーダルモデルとして紹介しています。想定用途にはドキュメント理解や画像キャプション生成、マルチモーダルQAも挙がっています。コード特化だが画像も入る、という理解が正確です。

    コスト感

    Kimi-K2.7-Code の単価は次のとおりです。いずれも税込で、1万トークンあたりの金額です。

    単価
    Input0.52円 / 10,000トークン
    Output5.04円 / 10,000トークン

    加えて Chat Completions は月3,000リクエストまで無償です。基盤モデル無償プランと呼ばれています。個人の検証や社内の小さな自動化なら、無料枠だけで回り切ることも多いはずです。無償枠を超えた場合は自動で課金に切り替わるのではなく、レート制御がかかる形になります。

    出力課金が入力の約10倍なので、コストは基本的に出力トークン量で決まると考えておくと見積もりしやすい。ざっくり、1回の生成で出力2,000トークンなら約1.0円。1日20回テストしても月あたり数百円のオーダーです。

    ただしこの試算はそのままでは甘い。thinking の出力も課金対象だからです。K2.7-Code は思考を切れないので、画面に見えている回答が短くても、裏で消費したトークンぶんは請求に乗ります。体感の単価は「見えている回答の長さ」より高くなると思っておいてください。

    この数字が高いのか安いのかは、単体では判断できません。そこで提供中のモデルを全部並べてみます。

    モデル提供区分入力出力
    gpt-oss-120b正式提供0.15円0.75円
    llm-jp-3.1-8x13b-instruct4正式提供0.15円0.75円
    gemma-4-31B-itプレビュー0.24円0.96円
    Qwen3.6-35B-A3Bプレビュー0.3円1.5円
    Kimi-K2.6プレビュー0.6円3円
    Kimi-K2.7-Codeプレビュー0.52円5.04円

    いずれも1万トークンあたり、無料枠は月3,000リクエストで共通です。CPU実行の小型モデルまで含めて図にすると、差がはっきりします。

    K2.7-Code は出力単価でプレビュー中の最高値です。入力は K2.6 より安いのに出力は1.7倍近い。長い生成を回す使い方ほど、他モデルとの差が開きます。

    max_tokens を絞ると回答側が削られる

    thinking が常時オンであることの実務的な影響がここに出ます。max_tokens が縛るのは出力トークンの総量で、思考もそこに含まれます。そして K2.7-Code は思考を切れません。つまり値を小さくすると、思考だけで予算を使い切り、可視の回答が削られるという筋道が成り立ちます。

    短い応答が欲しいときほど max_tokens を絞りたくなりますが、このモデルでは逆効果になりえます。予算そのものは数千トークン確保しておいて、出力の長さはプロンプト側で指示するほうが安全です。この記事のサンプルを4000にしてあるのはそのためです。応答が短すぎる、あるいは途中で切れると感じたら、まずここを疑ってください。

    自分の用途で測る

    ここからが本題です。プレビュー中のモデルは、公開ベンチの順位より自分のプロンプトでの挙動のほうが当てになります。しかも K2.7-Code は thinking が常時オンなので、他モデルの感覚をそのまま持ち込むとコストの読みを外します。

    そこで、そのままコピーして回せるベンチマークを置いておきます。汎用の数字を引用するのではなく、あなたの環境の数字を出すためのものです。

    測る指標は次のものです。

    • レイテンシ。初回トークンまでと、全体の両方
    • スループット。tokens/sec
    • 失敗率。タイムアウトと5xxとレート制限の割合を、100回から500回の連続実行で
    • 実効コスト。usage の prompt と completion のトークン数から円換算
    • 実効コンテキスト長。Moonshot公式は256Kだが、AI Engine 側の上限は公表されていない
    • 生成品質。同一プロンプトを OpenAI や Anthropic と並べて、主観評価かテスト通過率で

    スクリプトはこちらです。トークンを差し替えればそのまま動きます。

    import time, statistics
    from openai import OpenAI
    
    client = OpenAI(base_url="https://api.ai.sakura.ad.jp/v1", api_key="<Token>")
    N = 50
    lat, ok, in_tok, out_tok = [], 0, 0, 0
    for i in range(N):
        t = time.time()
        try:
            r = client.chat.completions.create(
                model="preview/Kimi-K2.7-Code",
                messages=[{"role":"user","content":"二分探索をPythonで。境界条件のテストも。"}],
                temperature=0.2, max_tokens=4000,
            )
            lat.append(time.time()-t); ok += 1
            in_tok += r.usage.prompt_tokens; out_tok += r.usage.completion_tokens
        except Exception as e:
            print("fail:", e)
    print(f"成功率 {ok}/{N}  中央値レイテンシ {statistics.median(lat):.2f}s")
    print(f"コスト概算 {(in_tok/10000*0.52)+(out_tok/10000*5.04):.1f}円")

    completion_tokens には thinking のぶんも入るので、この概算は実請求に近い値になります。見えている回答の長さと突き合わせると、思考にどれだけ使っているかも見えてきます。ここが他モデルと一番ずれるところなので、最初に一度は確認しておく価値があります。

    50回なら無料枠の3,000リクエストに対して十分な余裕があります。無償枠を超えても自動で課金に切り替わるのではなく、レートリミットがかかる形です。

    比較対象を作るなら、同じスクリプトの base_url と model だけ差し替えて、普段使っているモデルにも同じプロンプトを流してください。差し替えが1行で済むのがこの構成の利点なので、そのまま横並びのベンチになります。

    正直なところ

    ここまでの手順で動きますが、本番に載せる前に知っておいたほうがいいことがいくつかあります。

    • トークンは再表示されない。<UUID>:<シークレット> の形式で一度きりなので、パスワードマネージャに即保存を。
    • モデル名はマニュアルではなく告知ページを見る。マニュアルのサンプルは正式提供の gpt-oss-120b のままで、プレビューモデルの識別子は各モデルの提供開始告知に書かれています。
    • API種別によって使えるモデルが違う。K2.7-Code は Chat Completions での提供です。Anthropic互換の Messages API は preview/Kimi-K2.6 のみ。Responses API での K2.7-Code 対応可否は公式に確認できませんでした。ちなみに Responses API 自体、画像入力とマルチターン会話には未対応です。
    • プレビューの条件は緩くない。公式は、予告なく提供を終了する場合があり、提供期間中も安定性や応答品質を保証せず、動作や仕様が変更となる可能性があると書いています。SLAの明示もありません。プロダクションに載せるなら、モデル差し替えを前提にした抽象化層を1枚挟んでおくのが無難です。
    • レート制限の具体値は非公開。無償枠を超えるとレートリミットがかかると書かれているだけで、RPM や TPM の数値は公開されていません。連続実行する前に小さく試してください。
    • さくら上での実効コンテキスト長も未公表。Moonshot公式は256Kですが、AI Engine 上で同じだけ入るかは確認できません。長いコンテキストを前提にするなら、測る項目に入れてください。
    • 品質と速度は自分の用途で測ってから。汎用ベンチの数字を当てにしすぎない。だからこの記事は実測テンプレを付けています。

    エージェントとして常駐させる方向まで踏み込むなら、常駐AIエージェントの落とし穴3つで挙げた権限と監査とコストの話がそのまま効いてきます。

    よくある質問

    Q. モデル名を Kimi-K2.7-Code と書いたらエラーになりました

    preview/ が抜けています。パブリックプレビューのモデルは preview/Kimi-K2.7-Code です。正式提供モデルには接頭辞が付かないので、そちらのサンプルを流用すると間違えます。

    Q. 応答が短すぎる、途中で切れます

    max_tokens が小さすぎる可能性があります。K2.7-Code は thinking を切れず、思考も出力トークンの予算を使います。まず4000程度まで上げて試してください。

    Q. さくらのクラウドのAPIキーをそのまま使えますか

    使えません。インフラ管理APIのアクセストークンとシークレットは別系統です。AI Engine のコントロールパネルでアカウントトークンを発行してください。

    Q. Claude Code から使えますか

    現状は使えません。Anthropic互換の Messages API に対応しているのは preview/Kimi-K2.6 で、K2.7-Code は Chat Completions での提供です。

    Q. 無料枠だけでどこまで試せますか

    Chat Completions は月3,000リクエストまで無償なので、100回規模の計測なら十分に収まります。API種別ごとに枠が違い、ベクトル埋め込みは月10,000リクエスト、音声の文字起こしと音声合成はそれぞれ月50リクエストです。枠を超えると課金ではなくレートリミットがかかります。

    まとめ

    • さくらのAI Engine は OpenAI SDK の base_url を差し替えるだけで Kimi-K2.7-Code を叩ける
    • モデル名は preview/Kimi-K2.7-Code。プレビューモデルには接頭辞が付く
    • 月3,000リクエスト無料、出力は1万トークンあたり5.04円で、コストは出力量が主
    • thinking は常時オン。課金に乗るうえ、max_tokens を絞ると本文が空で返る
    • Anthropic互換の Messages API では使えない。Chat Completions での提供
    • 入門で止めず、自分の用途でレイテンシと失敗率とコストを実測するところまでやる

    国産クラウド上でコード生成APIを、既存資産をほぼ壊さずに試せるのは大きい。まずは無料枠で、自分のプロンプトを1本流してみるところからどうぞ。


    参考(一次情報)

  • 【新機能を触る】AppRun共用型がDocker Hub・GHCRに対応|外部コンテナレジストリで何が変わった?

    【新機能を触る】AppRun共用型がDocker Hub・GHCRに対応|外部コンテナレジストリで何が変わった?

    さくらのクラウドの「AppRun共用型」で、Docker HubとGitHub Container Registry(GHCR)のコンテナイメージを利用できるようになりました。

    これまでAppRun共用型で利用できるコンテナレジストリは、さくらのクラウドが提供するコンテナレジストリのみでした。

    2026年5月28日の仕様変更により、Docker HubとGitHub Container Registryが利用可能なコンテナレジストリとして追加されています。

    これにより、すでにDocker HubやGHCRで管理しているコンテナイメージについては、さくらのコンテナレジストリへ別途登録せず、AppRun共用型のデプロイソースとして指定できるようになりました。

    一方で、GitHubのソースコードを指定するとAppRunが自動でビルドしてくれる機能や、コンテナレジストリへのpushを検知して自動的に新バージョンを作成する機能が追加されたわけではありません。

    この記事では、外部コンテナレジストリ対応によって何が変わったのかを整理し、GHCRに登録した簡単なWebアプリをAppRun共用型へ配備する流れを解説します。

    この記事で分かること

    • AppRun共用型の外部コンテナレジストリ対応で変わったこと
    • 従来の配備方法との違い
    • GHCRのイメージをAppRunへ配備する方法
    • コンテナイメージを更新する方法
    • 外部レジストリ対応後も変わらないAppRunの仕様

    結論:外部レジストリへの対応で何が変わった?

    今回の変更で明確に変わったのは、AppRun共用型がコンテナイメージを取得できるレジストリの選択肢です。

    利用できるレジストリは、次の3種類です。

    コンテナレジストリ 利用可否
    さくらのクラウド コンテナレジストリ 利用可能
    Docker Hub 利用可能
    GitHub Container Registry(GHCR) 利用可能

    例えば、すでにGHCRでコンテナイメージを管理している場合、次のような構成が可能です。

    GitHub
      ↓
    コンテナイメージをビルド
      ↓
    GitHub Container Registry
      ↓
    AppRun共用型

    従来必要だった「AppRunで利用するために、さくらのコンテナレジストリへイメージを登録する工程」を省けることになります。

    任意の外部レジストリに対応したわけではありません

    外部レジストリとして公式に案内されているのはDocker HubとGitHub Container Registryです。Amazon ECRやGoogle Artifact Registryなどが利用可能と案内されているわけではありません。

    また、外部コンテナレジストリに関する個別設定やトラブルは、さくらインターネットのサポート対象外とされています。

    従来の配備方法と何が違うのか

    外部レジストリ対応前

    外部レジストリ対応前は、AppRun共用型で利用可能なコンテナレジストリは、さくらのクラウドのコンテナレジストリのみでした。

    そのため、GHCRなどで管理していたイメージをAppRunで利用したい場合は、さくらのコンテナレジストリへ登録する工程が必要でした。

    コンテナイメージを作成
            ↓
    外部レジストリへpush
            ↓
    さくらのコンテナレジストリへ登録
            ↓
    AppRun共用型へデプロイ

    外部レジストリ対応後

    Docker HubまたはGHCRにあるイメージを、AppRun共用型のコンテナイメージとして直接指定できます。

    コンテナイメージを作成
            ↓
    Docker HubまたはGHCRへpush
            ↓
    AppRun共用型へデプロイ
    作業 従来 対応後
    さくらのコンテナレジストリへの登録 必要 Docker Hub・GHCRを使う場合は不要
    Docker Hub/GHCRのイメージを直接指定 不可 可能
    AppRun側でのアプリ作成 必要 必要
    AppRunの新バージョン作成 必要 必要

    外部レジストリ対応で省けるようになった工程

    公式仕様から明確に言えるメリットは、Docker HubまたはGHCRを使用する場合に、AppRun用としてさくらのコンテナレジストリへイメージを登録する必要がなくなったことです。

    特に、すでにGHCRをコンテナイメージの保存先として利用している環境では、同じイメージを別のレジストリへ登録する工程を省けます。

    そのため、GitHubとGHCRを中心とした開発環境では、従来より少ない工程でAppRunを配備先として利用できるようになったと考えられます。

    外部レジストリ対応後も変わらないこと

    GitHubのソースコードから直接デプロイする機能ではない

    AppRun共用型で指定するデプロイソースは、コンテナレジストリに登録されたコンテナイメージです。

    GitHubリポジトリを指定するとAppRunがソースコードをビルドする、という仕組みではありません。

    自作アプリを利用する場合は、引き続きコンテナイメージをビルドし、対応するレジストリへ登録する必要があります。

    GHCRへのpushだけでは新バージョンは作成されない

    AppRunのマニュアルでは、新しいバージョンは「アプリケーション構成を変更してデプロイ」から作成する仕様となっています。

    GitHub Actionsなどから自動デプロイしたい場合は、AppRun APIを利用してCI/CDツールと連携できます。

    コンテナイメージの条件も変わらない

    AppRun共用型で使用するコンテナイメージには、次の制限があります。

    • アーキテクチャ:linux/amd64
    • コンテナイメージサイズ:2GiB以下

    外部レジストリに保存されていれば、どのコンテナでも動くという意味ではありません。

    GHCRのイメージをAppRunへ配備する

    ここからは、Nginxを使った簡単なWebページをコンテナ化し、GHCRへ登録してAppRun共用型から指定する流れを見ていきます。

    前提条件

    • さくらのクラウドを利用できる
    • GitHubアカウントを利用できる
    • Dockerを実行できる
    • GHCRへコンテナイメージをpushできる

    手順1:サンプルページを作成する

    index.htmlを作成します。

    <!doctype html>
    <html lang="ja">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>AppRun External Registry Demo</title>
    </head>
    <body>
      <h1>AppRun External Registry Demo</h1>
      <p>GitHub Container Registryから配備するサンプルです。</p>
      <p>Version: v1</p>
    </body>
    </html>

    手順2:Dockerfileを作成する

    FROM nginx:alpine
    
    COPY index.html /usr/share/nginx/html/index.html
    
    EXPOSE 80

    手順3:GHCRへログインする

    GitHub PackagesではPersonal Access Token(classic)を利用して認証できます。

    コンテナイメージをアップロードする場合は、write:packagesスコープを持つトークンを利用します。

    macOS・Linux

    export CR_PAT="YOUR_TOKEN"
    
    echo "$CR_PAT" | docker login ghcr.io \
      -u YOUR_GITHUB_USERNAME \
      --password-stdin

    Windows PowerShell

    $env:CR_PAT = "YOUR_TOKEN"
    
    $env:CR_PAT | docker login ghcr.io `
      -u YOUR_GITHUB_USERNAME `
      --password-stdin

    注意:アクセストークンをDockerfileやソースコードへ直接記載しないようにしてください。

    手順4:linux/amd64でビルドしてGHCRへpushする

    docker buildx build \
      --platform linux/amd64 \
      -t ghcr.io/YOUR_GITHUB_USERNAME/apprun-external-registry-demo:v1 \
      --push \
      .

    Windows PowerShellの場合は次のように実行できます。

    docker buildx build `
      --platform linux/amd64 `
      -t ghcr.io/YOUR_GITHUB_USERNAME/apprun-external-registry-demo:v1 `
      --push `
      .

    AppRun共用型はx86_64アーキテクチャで動作します。公式マニュアルでもlinux/amd64を指定してビルドするよう案内されています。

    手順5:GHCRの公開設定を確認する

    GitHub Container Registryでコマンドラインから初めて公開したPackageは、デフォルトではPrivateです。

    認証なしでAppRunから取得させる場合は、GitHub側でPackageのVisibilityをPublicへ変更します。

    Privateのまま利用する方法については後述します。

    手順6:AppRun共用型でアプリケーションを作成する

    さくらのクラウドのコントロールパネルからAppRun共用型を開き、「アプリケーションの作成」を選択します。

    今回の例では、次のように設定します。

    項目 設定例
    アプリケーション名 apprun-external-registry-demo
    最小スケール数 0
    最大スケール数 1
    コンテナイメージ ghcr.io/YOUR_GITHUB_USERNAME/apprun-external-registry-demo:v1
    ポート 80
    リソース構成 0.5vCPU / 1GiB
    ヘルスチェックパス /
    ヘルスチェックポート 80

    今回のPackageをPublicにしている場合、コンテナレジストリアクセス設定へのユーザー名・パスワード入力は不要です。

    アプリケーション作成後は状態が「処理中」となり、正常にデプロイされると「正常」と表示されます。

    状態が正常になったら、アプリケーション詳細に表示される公開URLからアクセスできます。

    コンテナイメージを更新する

    次に、index.htmlの表示をv1からv2へ変更します。

    <p>Version: v2</p>

    v2タグでビルドしてGHCRへpushします。

    docker buildx build \
      --platform linux/amd64 \
      -t ghcr.io/YOUR_GITHUB_USERNAME/apprun-external-registry-demo:v2 \
      --push \
      .

    AppRunのアプリケーション詳細から「アプリケーション構成を変更してデプロイ」を開き、コンテナイメージを変更します。

    変更前
    ghcr.io/YOUR_GITHUB_USERNAME/apprun-external-registry-demo:v1
    
    変更後
    ghcr.io/YOUR_GITHUB_USERNAME/apprun-external-registry-demo:v2

    AppRunの仕様では、最後にデプロイしたアプリケーション構成と今回の構成が同一の場合、新しいバージョンは作成されません。

    そのため、同じlatestという指定を維持したままレジストリ側のイメージ内容だけを変更するより、次のように異なるタグを使用してAppRun側のデプロイソースも変更する方が、バージョンを明確に管理できます。

    ghcr.io/example/app:v1
    ghcr.io/example/app:v2
    ghcr.io/example/app:a1b2c3d

    旧バージョンへトラフィックを戻すこともできる

    AppRun共用型では、アプリケーションごとに最大5バージョンを保持できます。

    また、最大4つのバージョンをトラフィック分散の対象として設定でき、それぞれ0~100%の割合を指定できます。割合の合計は100%にする必要があります。

    例えば、v2からv1へ戻したい場合は、v1へ100%のトラフィックを割り当てる設定が可能です。

    v1を90%、v2を10%といった割合にして、新しいバージョンへ一部のトラフィックだけを割り当てることもできます。

    GHCRのPrivateイメージを使う場合

    AppRun共用型では、コンテナレジストリが非公開の場合、コンテナレジストリアクセス設定としてユーザー名とパスワードを入力できます。

    GHCRではPersonal Access Token(classic)を利用して認証できます。

    GitHub公式では、パッケージをダウンロードするための権限としてread:packagesが定義されています。

    AppRun GHCR
    ユーザー名 GitHubのユーザー名
    パスワード read:packagesを持つPersonal Access Token(classic)

    なお、トークンを発行したGitHubユーザー自身が対象Packageを読み取れる権限を持っている必要があります。

    うまく配備できないときに確認する場所

    コンテナイメージを取得できない

    • イメージ名とタグが正しいか
    • 対象イメージがGHCRに存在するか
    • PackageがPublicかPrivateか
    • Privateの場合は認証情報が正しいか

    Macで作ったコンテナを配備できない

    イメージのアーキテクチャを確認します。

    AppRun共用型はx86_64で動作するため、linux/amd64のイメージを利用します。

    アプリへアクセスできない

    AppRun側で設定したポートと、コンテナ内のアプリケーションが実際に待ち受けているポートが一致しているか確認します。

    新しいバージョンが作成されない

    最後にデプロイした構成と同じ内容を指定していないか確認します。

    AppRunでは、構成情報が同一の場合、新しいバージョンは作成されません。

    イメージサイズが大きい

    AppRun共用型で利用できるコンテナイメージのサイズ上限は2GiBです。

    Docker Hub・GHCR・さくらのコンテナレジストリはどう選ぶ?

    外部レジストリへの対応によって選択肢が増えましたが、さくらのコンテナレジストリが利用できなくなったわけではありません。

    レジストリ 選びやすいケース
    Docker Hub すでにDocker Hubでイメージを管理している場合や、対応する公開イメージを利用する場合
    GHCR GitHubとコンテナイメージの管理を組み合わせている場合
    さくらのコンテナレジストリ さくらのクラウドのサービスを利用してコンテナイメージを管理したい場合

    外部コンテナレジストリの個別設定やトラブルは、さくらインターネットのサポート対象外です。この点も選択時に確認しておきたいポイントです。

    外部レジストリ対応とは別に残るAppRun共用型の制約

    今回変更されたのは、利用可能なコンテナレジストリです。

    AppRun共用型そのものには、次の仕様があります。

    永続ストレージは提供されていない

    AppRun共用型では永続ストレージは提供されていません。

    インスタンスごとに利用できるディスクは256MiBの一時領域です。

    閉域ネットワークには接続できない

    データベースなどがパブリックネットワーク上に公開されていればAppRun共用型から接続できますが、閉域ネットワークでの接続はできません。

    HTTP・HTTPS以外は利用できない

    AppRun共用型で現在サポートされているのはHTTPとHTTPSです。WebSocketsなどはサポートされていません。

    独自ドメインはAppRun単体の機能としては提供されていない

    AppRun共用型単体には独自ドメイン機能はありません。

    公式FAQでは、さくらのウェブアクセラレータを経由する構成で独自ドメインを利用できると案内されています。

    ログ・メトリクスはモニタリングスイートと連携する

    AppRun共用型単体にはログ閲覧機能は提供されていません。

    モニタリングスイートのストレージと連携することで、標準出力・標準エラーのログや、リクエスト数、レイテンシ、CPU・メモリ使用率などを確認できます。

    CI/CD連携にはAPIを利用する

    AppRun共用型はAPIを利用してGitHub ActionsなどのCI/CDツールと連携できます。

    GitHubへpush
        ↓
    GitHub Actions
        ↓
    コンテナをビルド
        ↓
    GHCRへpush
        ↓
    AppRun API
        ↓
    AppRunで新バージョンを作成

    外部レジストリへの対応と、AppRunへの自動デプロイは別の機能として考える必要があります。

    まとめ

    AppRun共用型は2026年5月28日の仕様変更で、Docker HubとGitHub Container Registryに対応しました。

    これまで利用可能だったさくらのコンテナレジストリと合わせて、3種類のコンテナレジストリをデプロイソースとして利用できます。

    今回変わったこと

    • Docker HubのコンテナイメージをAppRunから利用できる
    • GHCRのコンテナイメージをAppRunから利用できる
    • Docker Hub・GHCRを使う場合、さくらのコンテナレジストリへの再登録を省ける
    • PublicだけでなくPrivateのコンテナイメージも認証情報を設定して利用できる

    今回の変更とは別に必要なこと

    • 自作アプリではコンテナイメージをビルドする
    • 対応レジストリへイメージをpushする
    • AppRun側でアプリケーションや新しいバージョンを作成する
    • CI/CDを自動化する場合はAppRun APIを利用する

    したがって今回のアップデートは、「AppRunがソースコードから自動デプロイするサービスへ変わった」というものではありません。

    AppRunがDocker Hub・GHCRからコンテナイメージを直接取得できるようになり、外部レジストリを利用している環境では、AppRunへ配備するまでに必要だったレジストリ間の登録工程を省けるようになった変更と整理するのが正確です。 ぜひ皆さんも使ってみてください。

    参考資料

    “`
  • さくらのクラウド シンプルAI(CR版)を申請から疎通まで最短で通す — 無償のOpenAI互換APIをcurlとPythonで試す

    さくらのクラウド シンプルAI(CR版)を申請から疎通まで最短で通す — 無償のOpenAI互換APIをcurlとPythonで試す

    ※本記事は2026年7月31日時点の情報です。公式マニュアルの記載をもとに執筆しています。仕様は変更される可能性があるため、実施前に必ず最新の公式マニュアルを確認してください。なお、コントロールパネルの画面キャプチャは掲載していません。実際の画面表示はご自身の環境でご確認ください。

    • この記事でできるようになること
      • さくらのクラウド「シンプルAI(Simple AI)」の利用申請(事前審査)を出し、承認後にAPIキーを発行して、curlとOpenAI SDK(Python)で疎通確認できる
      • CR版・SLA対象外という前提を踏まえて「どこまでの用途に使ってよいか」を自分で判断できる
      • 検証終了後に安全に撤退(APIキー全削除→プロジェクト削除)できる
    • 所要時間の目安
      • 手を動かす作業: 30分程度(申請フォーム入力〜疎通確認まで)
      • 待ち時間: 事前審査に「5営業日程度かかる場合」あり(公式マニュアル記載)。検証スケジュールはここを織り込んで組むこと
    • 前提(必要なもの・費用)
      • さくらのクラウドのアカウント(契約者メールアドレスに審査結果が届く)
      • IAMポリシーを設定できる権限
      • 費用: CR版の提供期間中は無償(公式マニュアル記載)。ただしCR版の提供期間がいつまでかはマニュアルに記載なし

    前提ボックス: 3つの用語だけ押さえる

    • シンプルAIとは: OpenAI互換APIを通して生成AIモデルを使えるさくらのクラウドのサービス。LLMモデルはすべてさくらインターネットがホスティングし、通信は顧客とさくらインターネット間で完結する
    • CR版とは: マニュアルには「CR版での提供」とだけ記載があり、定義の説明はない(一般に正式版前の提供段階を指す呼称)。確実に言える条件は「提供期間中は無償」かつ「品質保証(SLA)の適用対象外」という明記事項のみ。稼働率などの品質保証はなく、返金・補償の扱いは約款で要確認。本番システムの前提には置きにくい
    • エクストラサービスとは: 利用申請(事前審査)が必要なさくらのクラウドのサービス区分。申し込んで即使えるわけではない

    全体フロー(申請〜疎通〜撤退)

    1. 利用申請(Step 1): エクストラサービスに「シンプルAI」を追加
    2. 審査待ち(Step 2): 5営業日程度かかる場合あり。結果はメール通知
    3. IAMポリシー設定(Step 3): 「シンプルAI:シンプルAI管理者」ロールを付与
    4. APIキー発行(Step 4): キーの表示は一度きり
    5. 疎通確認(Step 5〜6): curl → OpenAI SDK(Python)
    6. 検証利用: チャット補完・埋め込み
    7. 撤退(Step 7): APIキー全削除 → プロジェクト削除

    Step 1: 利用申請(エクストラサービスの追加)

    シンプルAIはエクストラサービスのため、まず利用申請を行います。手順は公式マニュアル「利用手順」の記載に基づきます。

    1. さくらのクラウドホームで「さくらのクラウド」を選択する
    2. コントロールパネル右上の「オプション」を選択する
    3. 「エクストラサービス」を選択する
    4. 右上の「追加」ボタンをクリックする
    5. サービス一覧から「シンプルAI」を選択する
    6. 「エクストラサービス追加」画面で必要事項を入力する
    7. 「作成」ボタンをクリックする

    なお、申請時の入力項目の詳細(利用目的の記載粒度など)はマニュアルに具体の記載がないため、実際の画面に従ってください(マニュアル未記載・要確認)。

    Step 2: 審査結果を待つ(リードタイムに注意)

    • 審査には「5営業日程度かかる場合」があると公式マニュアルに明記されています
    • 審査結果はメールで契約者に通知されます
    • 利用可能になると、コントロールパネル左側メニューに「シンプルAI」が追加されます

    Step 3: IAMポリシーの設定

    承認後、シンプルAIを操作するユーザにロールを付与します。

    1. さくらのクラウドホーム左側メニューで「IAMポリシー」を選択する
    2. 右上の「アクセス権の付与」ボタンをクリックする
    3. 「アクセス権の付与」ページでプリンシパル名として対象ユーザを設定する
    4. 「シンプルAI:シンプルAI管理者」ロールを設定する
    5. 「ロールを追加する」ボタンをクリックする
    6. 「作成」ボタンをクリックする

    Step 4: APIキーの発行(表示は一度きり)

    1. さくらのクラウドホームで「さくらのクラウド」を選択する
    2. コントロールパネル左側で「シンプルAI」>「APIキー」を選択する
    3. 右上の「+作成」ボタンをクリックする
    4. 「APIキー追加」画面で必要事項を入力する
    5. 「作成」ボタンをクリックする
    6. 確認ポップアップで「追加」ボタンをクリックする
    7. 表示されたAPIキーを「クリップボードにコピー」し、シークレット管理の仕組み(環境変数・シークレットマネージャなど)に保存する

    重要: 「APIキーは再度表示されません」と公式マニュアルに明記されています。 コピーし損ねた場合は、そのキーを削除して再発行することになります(再表示の手段はマニュアルに記載なし)。

    なお、APIキーとさくらのクラウドの「プロジェクト」の紐付き(どのプロジェクト配下にキーが作られるか)の詳細はマニュアルの利用手順ページに明示がありません。撤退時の制約(後述)から、キーはプロジェクトに属する構造と読み取れますが、画面上の表示は実機で確認してください(マニュアル未記載・要確認)。

    Step 5: curlで疎通確認する

    公式マニュアルに掲載されているcurlコマンドがそのまま疎通確認に使えます。エンドポイントと提供モデルは以下です(2026年7月31日時点)。

    • ベースURL: https://simpleai.is1.api.sacloud.jp
    種別モデル名エンドポイント
    チャットモデルgpt-oss-120b/v1/chat/completions(従来のチャットAPI)、/v1/responses(機能が統合されたエージェント的なAPI)
    埋め込みモデルmultilingual-e5-large/v1/embeddings
    • モデルのライセンスは「提供するモデルのライセンス表示」を参照するようマニュアルに案内があります。商用検証の前に確認してください
    • OpenAI互換APIで一般的な /v1/models(モデル一覧取得)の提供有無はマニュアルに記載がありません(マニュアル未記載・要確認)

    チャットモデル(gpt-oss-120b)の疎通確認(公式マニュアル掲載のコマンド):

    curl https://simpleai.is1.api.sacloud.jp/v1/chat/completions \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer <Token>" \
      -d '{
        "model": "gpt-oss-120b",
        "messages": [
          {
            "role": "developer",
            "content": "You are a helpful assistant."
          },
          {
            "role": "user",
            "content": "Hello!"
          }
        ]
      }'
    

    埋め込みモデル(multilingual-e5-large)の疎通確認(公式マニュアル掲載のコマンド):

    curl https://simpleai.is1.api.sacloud.jp/v1/embeddings \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer <Token>" \
      -d '{
        "model": "multilingual-e5-large",
        "input": "こんにちは",
        "encoding_format": "float"
      }'
    

    <Token> の部分をStep 4で保存したAPIキーに置き換えて実行します。JSONのレスポンスが返れば疎通成功です。

    Step 6: OpenAI SDK(Python)で疎通確認する

    公式マニュアルに掲載されているコード例はcurlのみで、Python/OpenAI SDKのコード例はマニュアルに掲載されていません。以下はマニュアル記載のベースURL・モデル名と、OpenAI互換APIの一般的な接続方法から筆者が構成したコードです(マニュアル未記載・動作確認が必要)。

    # pip install openai
    import os
    from openai import OpenAI
    
    client = OpenAI(
        api_key=os.environ["SAKURA_SIMPLE_AI_API_KEY"],  # Step 4で発行したAPIキー
        base_url="https://simpleai.is1.api.sacloud.jp/v1",  # ベースURLはマニュアル記載。/v1の付与は要動作確認
    )
    
    response = client.chat.completions.create(
        model="gpt-oss-120b",  # マニュアル記載のチャットモデル
        messages=[
            {"role": "developer", "content": "You are a helpful assistant."},
            {"role": "user", "content": "こんにちは。自己紹介してください。"},
        ],
    )
    print(response.choices[0].message.content)
    

    Step 7: 撤退手順(必ず「キー全削除→プロジェクト削除」の順)

    検証を終えたら、次の順序で撤退します。順序を誤るとプロジェクトが削除できません(詳細は「詰まりポイント」参照)。

    1. コントロールパネルの「シンプルAI」>「APIキー」で、発行したAPIキーの詳細画面を開く
    2. 右上の「APIキーを削除」ボタンをクリックする(発行したすべてのキーについて繰り返す)
    3. すべてのAPIキーが消えたことを一覧で確認する
    4. その後、プロジェクトの削除など通常の撤退作業を行う

    参考: 提供モデルの公開情報から分かること

    シンプルAIのマニュアルにはモデル名しか記載がありませんが、提供されている2モデルはいずれも重み公開モデルであり、開発元の一次情報(モデルカード・論文)が存在します。以下はモデル一般の公開情報であり、シンプルAI上での性能・設定(量子化の有無、コンテキスト長の上限、推論パラメータの対応範囲など)を保証するものではありませんが、用途判断の参考になります。

    gpt-oss-120b(チャットモデル)

    • OpenAIが2025年8月に公開したオープンウェイトモデル。ライセンスはApache 2.0(商用利用可)
    • MoE構成で総パラメータ約117B、トークンあたりアクティブ約5.1B。モデルカード論文でのコンテキスト長は131,072トークン
    • モデルカード論文の公表値(reasoning effort=high): MMLU 90.0%、GPQA Diamond 80.1%(ツールなし)、多言語評価MMMLUの日本語 83.5%
    • 注意点(いずれも開発元の公表情報): harmonyレスポンスフォーマットでの利用が前提とされている。また、SimpleQA評価でのハルシネーション率78.2%という数値が論文に報告されており、事実性が重要な用途では検索(RAG)や人手確認との併用が前提になる
    • シンプルAI上で未確認のこと: reasoning effortの指定可否、コンテキスト長の上限、内部のフォーマット処理(マニュアル記載なし)

    multilingual-e5-large(埋め込みモデル)

    • Microsoftの研究者らが2023年に公開した多言語埋め込みモデル。ライセンスはMIT(商用利用可)。埋め込み次元1024、約100言語対応
    • 多言語検索ベンチマークMr. TyDiの公表値: 平均MRR@10 70.5、日本語 62.5(参考: 同条件のBM25は21.7)
    • 最大入力は512トークンで、超過分は切り捨て(モデルカード明記)。長文はチャンク分割が前提
    • プレフィックス必須(モデルカード明記): 検索用途ではクエリに query: 、文書に passage: を付けて埋め込む設計。なお、シンプルAIのマニュアル掲載のcurl例("input": "こんにちは")にプレフィックスはなく、API側で自動付与されるかの記載もありません。モデル本来の性能を出すには、利用者側でプレフィックスを付けて送るのが安全というのが筆者の判断です(シンプルAI側の仕様は要確認)
    • コサイン類似度が0.7〜1.0付近に集中するのは学習方式(低温度の対照学習)による想定内の挙動とされ、スコアの絶対値ではなく相対順位で判断すべき

    詰まりポイント3つ

    1. 事前審査のリードタイムを見込んでいない

    エクストラサービスの審査は「5営業日程度かかる場合」があります。「今日申し込んで今日試す」はできない前提でスケジュールを組んでください。デモや検証日程が決まっているなら、1週間以上前に申請しておくのが安全です。

    2. CR版のまま本番システムに組み込んでしまう

    CR版は無償ですがSLA適用対象外で、出力情報についても一切の保証がなされません。また、CR版の提供期間(いつまで無償か・正式版移行時にどうなるか)はマニュアルに記載がありません。無償だからと本番導線に組み込むと、提供条件の変更時に巻き込まれます。本番利用の判断基準は後述の「業務利用のライン引き」を参照してください。

    3. APIキーの削除忘れでプロジェクトが削除できない

    公式マニュアルに「プロジェクト削除時は事前にすべてのAPIキーを削除」する必要がある旨が明記されています。検証用プロジェクトを畳むときにAPIキーが残っていると削除がブロックされます。撤退はStep 7の順序で実施してください。

    復旧・ロールバック

    • APIキーを漏洩させた/コピーし損ねた場合: 該当キーを削除し、新しいキーを発行し直す。キーの再表示はできない(「APIキーは再度表示されません」)ため、削除→再発行が基本動作
    • 検証を中断・撤退する場合: アプリケーション側からシンプルAIの接続設定を除去したうえで、Step 7の手順(キー全削除→プロジェクト削除)を実施
    • 申請が承認されなかった場合の再申請手順: マニュアルに記載なし。サポートへの問い合わせで確認してください
    • エクストラサービス自体の解約(シンプルAIの利用をやめる)手順: 利用手順ページに明示の記載なし(マニュアル未記載・要確認)

    業務利用のライン引き

    「無償のOpenAI互換API」という響きだけで判断せず、マニュアルで確認できる事実からラインを引きます。

    観点マニュアルで確認できたことマニュアルに記載がないこと
    料金CR版の提供期間中は無償提供期間・終了時期・終了時の扱い
    品質保証SLA適用対象外稼働率の実績・メンテナンス頻度
    データの扱い入力情報の不利用・第三者不提供・AI学習に不使用データ保存の有無・保存期間
    通信経路顧客とさくら間で完結データセンター所在リージョンの明示
    出力利用者が自由に使用可(モデルの使用許諾条項の範囲内)。ただし無保証—
    性能—レートリミット・同時接続数・トークン上限
    禁止事項約款第9条の禁止行為が適用—

    このうえで、次のように整理できます。

    • 検証・社内利用: OKと判断しやすい。入力の学習利用なし・第三者提供なし・通信が顧客とさくら間で完結という条件が明記されているため。無償なのでコスト稟議も不要
    • 本番組み込み: 慎重に。SLAなし・出力無保証・CR版の期間未公表・レートリミット未公表という条件が重なるため。組み込むなら「止まっても業務が止まらない」補助的な位置づけに限定し、約款(特に第9条)を確認したうえで判断する

    さくら接続ポイント: シンプルAIの次はどこへつなぐか

    さくらインターネットの生成AI関連サービスは、おおまかに次の段階で捉えると導線が引きやすくなります(この段階整理は筆者による位置づけの整理です)。

    1. シンプルAI: 無償(CR版期間中)で試せるOpenAI互換API。検証の入口
    2. さくらのAI Engine: 従量課金で、RAGや音声系など、より広い機能を持つAI API群
    3. 高火力シリーズ: GPUを専有して自前でモデルを動かす段階

    ただし、シンプルAIとAI Engineの公式な使い分け指針は現時点で公表されていません。両者はOpenAI互換APIという点で重なるため、「無償検証はシンプルAI、機能・本番前提の検証はAI Engine」という上記の整理はあくまで筆者の見立てです。採用判断の際は各サービスの最新の提供条件を公式情報で確認してください。

    次にやること

    1. 埋め込みAPIで小さなRAGを組む: multilingual-e5-largeで手元ドキュメントをベクトル化し(モデルカードに従い query: /passage: プレフィックスを付与)、gpt-oss-120bと組み合わせた検索拡張の最小構成を試す
    2. レートリミットと応答性能を実測する: マニュアルに記載がないため、検証スクリプトで応答時間・連続リクエスト時の挙動を計測し、用途判断の材料にする
    3. /v1/responsesエンドポイントを試す: 「機能が統合されたエージェント的なAPI」とだけ記載されている新系統のAPIを実際に叩き、/v1/chat/completionsとの違いを確認する

    本記事執筆時点で未確認の事項(まとめ)

    公式マニュアル(2026年7月31日閲覧)に記載がなく、実測またはサポート問い合わせで確認が必要な事項の一覧です。

    • 申請フォームの入力項目の詳細(利用目的の記載粒度)
    • APIキーとプロジェクトの紐付きの画面上の見え方
    • Python SDKでの base_url(/v1付与)の正否
    • /v1/models(モデル一覧API)の提供有無
    • CR版の提供期間・終了時の扱い
    • レートリミット・同時接続数・トークン上限
    • 審査否認時の再申請手順、エクストラサービス自体の解約手順
    • データセンター所在リージョンの明示、データ保存の有無・保存期間
    • 埋め込みAPIでの query: /passage: プレフィックスの自動付与の有無
    • gpt-oss-120bのreasoning effort指定可否・コンテキスト長の上限

    参考リンク

    本記事の手順・サービス仕様は、以下のさくらインターネット公式マニュアル(いずれも2026年7月31日閲覧)を根拠にしています。

    • シンプルAI サービス基本情報 — サービス概要・CR版/無償・SLA対象外・データの取り扱い・エクストラサービス・プロジェクト削除時の注意
    • シンプルAI 利用手順 — 申請手順・審査期間・IAMポリシー設定・APIキー発行/削除手順・curlコード例
    • シンプルAI 操作ガイド — 提供モデル(gpt-oss-120b / multilingual-e5-large)・ベースURL・エンドポイント一覧
    • さくらのクラウド APIポータル — 2026年7月31日にブラウザで確認。ポータルにはAI Engine Inference API / AI Engine RAG APIなどのリファレンスが掲載されている一方、シンプルAI専用のAPIリファレンスは掲載されていない。シンプルAIのAPI仕様はマニュアルのcurl例とOpenAI互換仕様に依拠することになる

    「提供モデルの公開情報」セクションは、以下の開発元一次情報(いずれも2026年7月31日閲覧)を根拠にしています。

  • さくらのクラウドにCloudFrontの「あの404対策」はない — SPA deep linkの壁とAppRunゲートウェイという現実解

    さくらのクラウドにCloudFrontの「あの404対策」はない — SPA deep linkの壁とAppRunゲートウェイという現実解

    ReactのSPAをさくらのクラウドで配信すると、奇妙な体験をする。トップページから画面を切り替えていくぶんには完璧に動くのに、/chat/abc123 のようなURLをブラウザへ直接入れると404(ページが見つかりません)が返ってくる。さっきまで動いていた画面で、リロードを押しただけでも404。アプリは壊れていない。壊れているのは、URLと配信側の約束のほうだ。

    まず前提から書いておく。EastCloudでは、デジタル庁がOSSとして公開した政府向け生成AI「源内」を、国産のさくらのクラウド上で動かせるかを検証するプロジェクトを進めている。データを国内に置きたい組織にとって、政府製のAIアプリ資産が国産クラウドで動くかどうかは、実利のある問いだからだ。プロジェクトの全体像と「何が動いて、何が動いていないか」は前回の記事にまとめたので、未読の方はそちらから読んでもらえると、本稿の位置づけが掴みやすい。

    その検証で最初にぶつかったのが、冒頭の404だった。AWSなら定番の設定ひとつで済む話が、さくらのクラウドでは自明には解けない。本稿は、2026年6月の実機検証で確認できたこと・できなかったことと、最終的に採った構成の記録である。

    この記事の主役になる用語(知っている方は読み飛ばしてください)

    SPA(シングルページアプリケーション)
    Webアプリの作り方のひとつ。ページごとにHTMLファイルをサーバからもらうのではなく、最初に1枚の index.html とJavaScriptを受け取り、以後の画面切り替えはブラウザの中でJavaScriptが行う方式を指す。Reactなどで作られた今どきの管理画面やチャットアプリはたいていこの方式で、源内のWeb画面も例外ではない。

    deep link(直リンク)
    トップページではなく、アプリ内の特定の画面を指すURLへ直接アクセスすること。/chat/abc123 のような「会話画面そのもののURL」をブックマークする、同僚に共有する、開いたままリロードする——どれもdeep linkの利用にあたる。

    CloudFront
    AWSのCDN(コンテンツ配信サービス)。CDNの本業は、利用者の近くにファイルのコピー(キャッシュ)を置いて速く配ることだが、CloudFrontにはもうひとつ、後述する「SPA配信の要」になっている機能がある。

    SPAのdeep linkはなぜ404になるのか

    SPAでは、/chat/abc123 というURLに対応するファイルはサーバ上に存在しない。サーバにあるのは index.html とJavaScript・CSSの束だけで、「/chat/abc123 の画面」はブラウザの中でJavaScriptが組み立てている。

    だから、トップページから入ってリンクをたどるぶんには何も起きない。画面の切り替えはすべてブラウザ内で完結しているからだ。ところが、URLを直接開いたりリロードしたりすると、ブラウザは律儀にサーバへ「/chat/abc123 というファイルをください」と聞きに行く。サーバは正直に「そんなファイルはありません」と404を返す。JavaScriptが動き出す前の出来事なので、アプリ側にはどうしようもない。

    これを防ぐ方法は昔から決まっている。「実ファイルがないURLへのアクセスには、とりあえず index.html を返す」という約束を、配信側に持たせるのだ。index.html さえ届けばJavaScriptが起動し、URLを見て正しい画面を組み立ててくれる。この約束をSPA fallbackと呼ぶ。

    デジタル庁が公開しているオリジナルの源内Web(公式リポジトリ genai-web)もReact製のSPAで、/chat/:chatId や /history といった画面のURLを持つ。つまり、リロードやURL共有のたびに、必ずこの問題を踏む前提の作りになっている。

    オリジナルの源内Webは、この問題をどう解いているか

    これがAWSの上なら、答えは最初から用意されている。オリジナルの源内WebはAWSで動かす前提で設計されており、公開されているインフラ定義を読むと、ファイル置き場のS3にビルド済みファイルを置き、前段のCloudFrontが配信する構成になっている。そしてCloudFrontの「カスタムエラーレスポンス」という機能で、置き場が403や404を返したら /index.html を代わりに返す——しかもステータスコードは200にする——よう設定されている。

    要するに、エラーを握りつぶして全部SPAへ投げる。乱暴に聞こえるが、これがSPA配信の事実上の標準で、S3 + CloudFrontがSPAホスティングの定番になった理由のひとつでもある。実際、当社では源内WebをそのままAWS上で動かす検証も並行して行っているが、この仕組みは何も考えなくても機能する。定番すぎて、依存として意識されないのだ。AWSから離れようとして初めて、「あの404対策」が独立したひとつの機能要件だったことに気づく。

    当初考えた構成 — オブジェクトストレージ + ウェブアクセラレータ

    最初に組んだのは、静的配信の王道といえる構成だった。フロントエンドのビルド成果物(HTML・CSS・JavaScript)を、さくらのオブジェクトストレージへ置き、前段のウェブアクセラレータから配信する。オブジェクトストレージは「ファイル置き場」のサービスで、AWSのS3と互換のAPI(S3互換)を持つ。つまりS3向けの操作コマンドが、接続先の差し替えだけでそのまま使える。ウェブアクセラレータはさくらのCDNで、オブジェクトストレージのバケット(置き場)を配信元にできる。AWSのS3 + CloudFrontに対する置き換えとしては、もっとも素直な対応関係である。

    結論から言えば、この構成でやりたかったことのほとんどは動いた。実機で確認できた範囲は次のとおりである。

    確認したこと結果
    HTML / CSS / JSのアップロード可。aws s3 sync による一括アップロードも動く
    Content-Type(ファイル種別の申告)の付与可。text/html、text/css、text/javascript等を確認
    Cache-Control(キャッシュの効かせ方)の付与可。レスポンスヘッダでも確認
    公開 / 非公開の制御可。ACL(アクセス権設定)で制御できる
    一覧・取得・削除可
    ウェブアクセラレータ経由のHTTPS配信可。バケットを公開設定にせず、読み取り権限ベースで配信できる
    キャッシュの効き可。設定した保持時間が反映され、2回目以降はキャッシュから返る
    末尾が / のURLへのドキュメントインデックス可。index.htmlを補ってくれる

    そして、ひとつだけできなかったことがある。実在しない任意のURLへのアクセスは、素直に404になる。つまり、この記事の主題である deep link が通らない。

    ここは正確に書いておきたい。ウェブアクセラレータのドキュメントインデックスは「/ で終わるURLに index.html を補う」機能である。これは「フォルダを開いたら目次ファイルを見せる」という、Webの古い慣習に沿った振る舞いであって、「存在しないあらゆるURLを index.html へ戻す」というエラーハンドリングの話ではない。似ているようで別物だ。SPA fallbackに必要なのは後者であり、CloudFrontのカスタムエラーレスポンスに相当する設定は、検証時点のウェブアクセラレータには見当たらなかった。

    静的配信だけの構成図。オブジェクトストレージとウェブアクセラレータの組み合わせでは、トップページへのアクセスはindex.htmlが返るが、/chat/abc123のような実ファイルのないURLへの直接アクセスには404が返ることを示す
    図1: 当初の構成。トップページからの利用は成立するが、実ファイルのないURLへの直接アクセスには404が返る

    つまりこの構成は、「/ から入って画面内を遷移する」使い方なら成立するが、deep linkのあるSPAを丸ごと任せるには一歩足りなかった。

    ひとつ補足すると、ここで言っているのはあくまで「画面を配るためのファイル置き場」の話である。利用者がアップロードするファイルやチャット履歴のような、アプリのデータの保存は別の問題であり、今回の検証範囲には含めていない。S3互換には癖もあり、たとえばTerraformのbackendに使う場合の問題は以前の記事で扱われているが、フロントエンド配信の用途では引っかからなかった。

    現実解: AppRun上のゲートウェイに配信とルーティングを寄せる

    そこで、静的配信に任せる方針をやめ、構成を変えた。AppRunは、コンテナ(アプリ一式を箱詰めしたもの)を渡すとそのまま動かしてくれる、さくらのクラウドのアプリ実行サービスである。このコンテナへフロントエンドのビルド成果物を同梱し、Go言語で書いた薄いゲートウェイ——玄関口に立って、来たリクエストを行き先ごとに振り分ける小さなプログラム——が、配信とルーティングの両方を引き受ける。

    ゲートウェイの仕事は、リクエストのURLを見て分類することに尽きる。

    • 実在する静的ファイル(/assets/ 配下など)→ そのまま返す
    • 対応済みの画面ルート(/chat/:id、/history など)→ index.html を返す。SPA fallbackはここだけ
    • /api/*(画面ではなく、プログラム同士の通信窓口)→ APIとして処理する。エラーになってもJSONで返し、index.html へは逃がさない
    • /health(死活監視用)→ 稼働確認の応答を返す
    • 上記のどれでもないURL → 成功扱いにしない
    AppRun上のGoゲートウェイがURLを分類する構成図。実ファイルはそのまま返し、対応済みの画面ルートだけにindex.htmlを返し、/api/*はJSONで処理し、どれでもないURLはエラーにする
    図2: 採用した構成。ゲートウェイがURLを分類し、対応済みの画面ルートだけにindex.htmlを返す

    CloudFront方式との違いは、fallbackの範囲を「対応済みの画面ルート」に限定した点だ。「404ならなんでもindex.html」は手軽だが、APIのエラーや設定ミスまで画面側へ流れ込み、失敗が見えなくなる副作用がある。とくにAIアプリでは、裏側の失敗が画面上それらしく見えてしまう事故を避けたかった。

    ルートを明示的に分類する方式は、手間のぶんだけ「このアプリはどのURLを引き受けるのか」が設計として言語化される。壁を回避するための構成が、結果としてルート境界の棚卸しになったのは思わぬ収穫だった。

    逆に言えば、この構成を選んだ時点で、配信の正本はオブジェクトストレージではなくコンテナの中という割り切りをしている。CDNによる配信効率やキャッシュ戦略は別途設計が要るし、静的配信へ寄せたい場面ではfallback問題が残り続ける。万能の解ではなく、検証時点での現実解である。

    「ない」のは欠陥ではなく、設計思想の違い

    誤解のないように書いておくと、これはさくらのクラウドの落ち度という話ではない。「404のときに別のファイルを200で返す」というCloudFrontの挙動は、考えてみればかなり特殊なことをしている。エラーをエラーとして返すのは、配信サービスとしてはむしろ素直な設計だ。SPA fallbackはあくまでアプリ側の都合であり、それを配信側が肩代わりするか、アプリ側(今回ならゲートウェイ)が自分で引き受けるかは、役割分担の思想の違いと捉えるのが正確だと思う。

    そのうえで、静的配信側に任意URLのfallback設定が加われば、SPAは置き場とCDNだけで完結し、AppRunはAPIに専念できるようになる。選択肢が増えること自体は素直に歓迎したい。

    なお、この種の検証結果には賞味期限がある。今回の検証は2026年6月中旬のもので、さくらのクラウドは機能追加が活発だ。当社の別の検証でも、一度「構造的に不可能」と結論づけた制約が、後日の機能提供であっさり解けた例がある。この記事を読んでいる時点では状況が変わっているかもしれない。設計判断の前に、現行の公式ドキュメントとリリースノートを確認してほしい。

    まとめ

    • SPAは「1枚のindex.htmlとJavaScriptで全画面を描く」作りのため、実ファイルのないURLへの直接アクセス(deep link)では配信側の協力が要る
    • オリジナルの源内WebはCloudFrontのカスタムエラーレスポンスでこれを解いており、定番すぎて依存として意識されにくい
    • オブジェクトストレージ + ウェブアクセラレータの静的配信は、アップロード・Content-Type・キャッシュなど大半がそのまま動いた(S3互換操作を実機確認)
    • ただし任意URLのSPA fallbackだけは検証時点では確認できず、deep linkが通らなかった
    • 現実解として、AppRun上のGoゲートウェイでルートを分類し、対応済みの画面ルートだけにfallbackを限定した
    • これは欠陥ではなく設計思想の違い。AWSからの移行では、CloudFrontが何を肩代わりしてくれていたかを先に棚卸しするのが早道になる

    前回の記事で「壁1」として一行だけ触れたものの正体が、この404である。AWSで当たり前だったものは、離れてみて初めて輪郭が見える。移行の検証とは、結局その輪郭をひとつずつなぞる作業なのだと思う。

    よくある質問

    Q1. さくらのクラウドでReactなどのSPAをホスティングできるか

    できる。ただしURL直接アクセス(deep link)への対応に工夫が要る。2026年6月の検証時点では、オブジェクトストレージ+ウェブアクセラレータの静的配信だけでは任意URLのfallbackを実現できず、AppRun上のゲートウェイで対応した。

    Q2. さくらのオブジェクトストレージで静的サイトを公開できるか

    できる。S3互換APIでHTML・CSS・JavaScriptを配置し、公開設定またはウェブアクセラレータ経由での配信が可能である。Content-TypeやCache-Controlの付与も実機で確認できた。

    Q3. ウェブアクセラレータで404をindex.htmlに差し替えられるか

    検証時点(2026年6月)では、CloudFrontのカスタムエラーレスポンスに相当する機能は確認できなかった。ドキュメントインデックスは「/で終わるURL」への補完機能であり、任意URLのfallbackとは別物である。最新の仕様は公式ドキュメントで確認してほしい。

    Q4. SPAのdeep linkが404になる原因は何か

    SPAでは /chat/123 のようなURLに対応する実ファイルがサーバ上に存在しないためである。配信側に「実ファイルのないURLには index.html を返す」仕組み(SPA fallback)がないと、URL直接アクセスやリロードで404になる。

    Q5. AppRunでフロントエンドとAPIを同居させるときの注意点は何か

    SPA fallbackの範囲を対応済みの画面ルートに限定し、/api/* のエラーを index.html へ逃がさないことだ。APIの失敗が画面上の成功に見えてしまう事故を防げる。

    Q6. CloudFrontのカスタムエラーレスポンスとは何か

    配信元が403や404を返した際に、指定したファイル(SPAでは /index.html)を指定したステータスコードで返すCloudFrontの機能である。S3 + CloudFrontによるSPA配信は、事実上この機能を前提にしている。

    参考リンク

  • 【新機能を触る】さくらのクラウドの準拠スコアが低いときの確認手順|非準拠ルールと改善チェックリスト

    【新機能を触る】さくらのクラウドの準拠スコアが低いときの確認手順|非準拠ルールと改善チェックリスト

    さくらのクラウドでは、2026年5月21日から、セキュリティコントロールに「セキュリティ基準の準拠スコアUI表示」が追加されました。

    準拠スコアを確認すると、想定より低い数値が表示されることがあります。しかし、スコアだけを見ても、どのリソースや設定に問題があるのかは分かりません。

    準拠スコアが低い場合は、セキュリティ基準の詳細画面から非準拠の評価ルールを確認し、さらに評価結果から対象リソースと重大度を特定します。

    この記事では、準拠スコアが低いときに確認する場所と、公開されている評価ルールに基づく改善チェックリストを紹介します。

    ✅ この記事のゴール

    • 準拠スコアが低いときに確認する画面が分かる
    • 非準拠になっている評価ルールと対象リソースを特定できる
    • 重大度を基準に対応の優先順位を決められる
    • 設定変更、代替対策、対応不要のいずれかを判断できる

    💡 最初に結論

    準拠スコアが低いときは、次の順番で確認します。

    1. ダッシュボードで準拠スコアを確認する
    2. 「セキュリティ基準」で非準拠の評価ルールを確認する
    3. 「評価結果」で対象リソースと重大度を確認する
    4. 重大度の高い項目から対応する
    5. 設定変更後、次回の評価結果を確認する

    セキュリティ基準の準拠スコアとは

    セキュリティ基準の準拠スコアは、利用環境が、さくらのクラウドのベストプラクティスや設計指針にどの程度準拠しているかを可視化する指標です。

    セキュリティ基準には複数の「評価ルール」が含まれています。セキュリティコントロールが各評価ルールを実行し、その結果を集約して、基準ごとの準拠状況と準拠スコアを算出します。

    現在利用できるセキュリティ基準は「さくらのクラウド セキュリティ基本原則 v1」です。

    セキュリティ基本原則 v1は、次の5つの観点で構成されています。

    1. パブリックアクセスの制限
    2. ログの有効化と監視
    3. アクセス制御と認証
    4. 脅威検知と脆弱性管理
    5. データ保護と暗号化

    ⚠️ 準拠スコアは、システム全体の安全性を保証する点数ではありません

    準拠スコアは、セキュリティ基本原則 v1に含まれる評価ルールへの準拠状況を示すものです。OSやアプリケーションの脆弱性、認証情報の管理、バックアップ、運用ミスなど、評価対象外のリスクも別途確認する必要があります。

    準拠スコアを確認する前提

    準拠スコアを確認するには、対象プロジェクトでセキュリティコントロールを有効化しておく必要があります。

    すでにダッシュボードに準拠スコアが表示されている場合は、この手順を飛ばしてください。

    セキュリティコントロールを有効化する

    1. さくらのクラウドのコントロールパネルにログインします。
    2. 対象のプロジェクトを選択します。
    3. 左側のメニューから「イベントログ」を開きます。
    4. 画面右上の「セキュリティコントロール」をクリックします。
    5. 「セキュリティコントロールの有効化」をクリックします。
    6. 評価に利用するサービスプリンシパルを選択します。

    新しいサービスプリンシパルを作成して紐づけることもできます。

    ⚠️ 必要なIAMロール

    セキュリティコントロールに紐づけるサービスプリンシパルには、IAMポリシーで「セキュリティコントロールエージェント」ロールを付与する必要があります。

    準拠スコアが低いときに見る3つの場所

    準拠スコアが想定より低い場合は、次の3つの画面を順番に確認します。

    1.ダッシュボードで全体の状況を確認する

    セキュリティコントロールのダッシュボードでは、次の情報を確認できます。

    • 重大度別の異常件数
    • ステータス別の対応チケット件数
    • セキュリティ基準の準拠スコア

    ここでは、準拠スコアだけでなく、重大度の高い異常が発生していないかも確認します。

    2.「セキュリティ基準」で非準拠ルールを確認する

    次に、準拠スコアの判定に使用された評価ルールを確認します。

    1. セキュリティコントロールのメニューから「セキュリティ基準」を選択します。
    2. 「セキュリティ基本原則 v1」をクリックします。
    3. 「非準拠」タブを開きます。
    4. 非準拠になっている評価ルールを確認します。

    セキュリティ基準の詳細画面には、準拠状況と、準拠判定に使用される評価ルールの一覧が表示されます。

    非準拠になっている評価ルールが無効の場合は、「非準拠」タブから一括で有効化できます。

    💡 「無効」と「不合格」は分けて確認する

    評価ルール自体が無効になっている場合と、評価ルールを実行した結果が不合格になっている場合では、必要な対応が異なります。まず、評価ルールの有効・無効と、実際の評価結果を分けて確認しましょう。

    3.「評価結果」で対象リソースと重大度を確認する

    非準拠になっている評価ルールが分かったら、評価結果から対象リソースを確認します。

    1. セキュリティコントロールのメニューから「評価結果」を選択します。
    2. 「検出」で「不合格」を選択します。
    3. 必要に応じて重大度で絞り込みます。
    4. 確認したい評価結果をクリックします。
    5. 評価ルール、対象リソース、重大度、検出内容を確認します。

    評価結果は、次の条件で絞り込めます。

    • 検出:不合格・合格・失敗
    • 重大度:致命的・高・中・低・指定なし

    スコアではなく重大度を見て優先順位を決める

    対応の優先順位は、スコアを何点上げられるかではなく、評価結果の重大度を基準に決めます。

    重大度 状態の目安 対応方針
    高・致命的 任意コード実行やデータの引き出しにつながるおそれがある 可及的速やかに調査・対応する
    中 悪用された場合、アクセス権の奪取などに至る可能性がある 対応チケットで管理し、定期的に対応を検討する
    低 侵害へ直接つながる可能性は低い 必要性と影響を確認して対応する

    ✅ 優先順位の付け方

    1. 致命的・高の不合格を確認する
    2. インターネットへ直接公開されているリソースを確認する
    3. 保存データの暗号化状態を確認する
    4. ログや脅威検知が有効か確認する
    5. 中・低の項目を対応チケットで管理する

    非準拠ルール別の改善チェックリスト

    ここからは、「さくらのクラウド セキュリティ基本原則 v1」に含まれる評価ルールを、5つの観点に分けて確認します。

    1.パブリックアクセスの制限

    外部公開する必要がないサーバーやデータベースにパブリックIPアドレスが割り当てられていると、非準拠として検知される可能性があります。

    評価ルール 確認対象 確認内容
    server-no-public-ip サーバー サーバーにパブリックIPアドレスが付与されていないか
    dba-no-public-ip DBアプライアンス DBアプライアンスにパブリックIPアドレスが付与されていないか
    addon-datalake-no-public-access データレイク パブリックネットワークアクセスが有効になっていないか
    addon-dwh-no-public-access データウェアハウス パブリックネットワークアクセスが有効になっていないか

    改善チェックリスト

    • 外部公開する必要がないサーバーにパブリックIPが付いていないか
    • DBアプライアンスにパブリックIPが付いていないか
    • 共有セグメントへ直接接続する必要があるか
    • 専用スイッチとルーターを使った構成へ変更できないか
    • 外向き通信はNATゲートウェイ経由にできないか
    • パケットフィルタで不要なポートを閉じているか

    ⚠️ パブリックIPがあるだけで、直ちに危険とは限りません

    外部公開用のWebサーバーなど、設計上パブリックIPが必要な場合もあります。スコアを上げるためだけに削除せず、公開の必要性、パケットフィルタ、ロードバランサ、踏み台サーバーなどの代替策を確認してください。

    2.ログの有効化と監視

    評価ルール 確認対象 確認内容
    elb-logging-enabled エンハンスドロードバランサ syslog転送機能が有効になっているか

    改善チェックリスト

    • エンハンスドロードバランサのsyslog転送が有効か
    • syslogの転送先が用意されているか
    • 転送したログを確認できる状態になっているか
    • 異常を検知したときの通知・対応手順が決まっているか

    ログ転送を有効にするだけでなく、転送されたログを確認し、異常時に対応できる運用も準備しておきます。

    3.アクセス制御と認証

    評価ルール 確認対象 確認内容
    iam-member-operation-detected IAM 会員権限による操作イベントを検知する
    objectstorage-bucket-acl-changed オブジェクトストレージ バケットACLの変更を検知する

    改善チェックリスト

    • 会員権限による操作が意図したものか
    • 日常的な操作をユーザーやサービスプリンシパルへ移行できないか
    • サービスプリンシパルへ必要以上の権限を付与していないか
    • バケットACLを変更した担当者と目的を確認したか
    • ACL変更によって意図せず公開範囲が広がっていないか

    これらは、単純に設定を有効化すれば解消するルールではありません。誰が、いつ、どのような操作を行ったのかを確認します。

    4.脅威検知と脆弱性管理

    評価ルール 確認内容
    addon-threat-detection-enabled 対象サーバーに脅威検知・脆弱性検知エージェントが導入されているか
    addon-threat-detections Add-onによるセキュリティインシデントアラートが発生していないか
    addon-vulnerability-detections Add-onによる脆弱性の推奨事項が検出されていないか

    改善チェックリスト

    • Add-onの対象サーバーへ必要なエージェントが導入されているか
    • エージェントが正常に稼働しているか
    • 脅威検知アラートの内容を確認したか
    • 脆弱性に関する推奨事項を確認したか
    • 修正、緩和策、対応不要の判断を記録したか

    💡 Add-on関連ルールの扱い

    Add-onサービスに関連する評価ルールは、対象のAdd-onサービスが開通している場合のみ準拠スコアの算出対象になります。Add-onを契約していないことだけを理由に、必ずスコアが下がるわけではありません。

    5.データ保護と暗号化

    評価ルール 確認対象 確認内容
    disk-encryption-enabled ディスク ディスク暗号化機能が有効になっているか
    dba-encryption-enabled DBアプライアンス DBアプライアンスのディスク暗号化が有効か
    nosql-encryption-enabled NoSQL 暗号化されていないNoSQLが存在しないか
    objectstorage-bucket-encryption-enabled オブジェクトストレージ 評価対象サイトのすべてのバケットで暗号化が有効か

    改善チェックリスト

    • サーバーに接続されたディスクが暗号化されているか
    • DBアプライアンスのディスク暗号化が有効か
    • NoSQLの暗号化が有効か
    • オブジェクトストレージのすべてのバケットで暗号化が有効か
    • 暗号化に使用しているKMSキーを適切に管理しているか
    • 暗号化前に保存した既存データが残っていないか

    ⚠️ 既存ディスクは、あとから暗号化を有効化できません

    さくらのクラウドのディスク暗号化は、ディスクの新規作成時に有効化します。作成済みディスクへあとから暗号化を有効化したり、利用途中で無効化したりすることはできません。

    既存ディスクを暗号化したい場合は、KMSキーを用意し、暗号化を有効にした新しいディスクへのコピーやデータ移行を検討します。

    ⚠️ バケット暗号化を有効化しても、既存オブジェクトは自動で暗号化されません

    オブジェクトストレージで暗号化を有効化した場合、暗号化されるのは有効化後に新しく保存したオブジェクトです。すでに保存されているオブジェクトは、COPY操作または再アップロードによって現在の暗号化設定で保存し直す必要があります。

    非準拠でも、すぐに設定を変更しない方がよい場合

    セキュリティコントロールの評価結果は、リスクの可能性を示すものです。すべての環境に同じ構成を強制するものではありません。

    例えば、外部公開用サーバーへパブリックIPを割り当てている場合、その構成がシステム要件上必要なことがあります。

    すぐに設定を変更できない場合は、次の内容を整理します。

    • なぜ、その構成が必要なのか
    • 設定変更によるシステムへの影響はあるか
    • 代替構成へ変更できるか
    • パケットフィルタやアクセス制限などの代替対策があるか
    • 誰が対応不要またはリスク受容と判断したか
    • いつ再確認するか

    対応しないと判断した項目は、対応チケットのステータスを「対応不要」に変更し、判断理由を運用記録へ残しておくと管理しやすくなります。

    ✅ 非準拠を見つけたときの判断フロー

    1. 対象リソースと重大度を確認する
    2. 意図した構成か確認する
    3. 設定変更が可能か確認する
    4. 変更できない場合は代替対策を検討する
    5. 対応する、計画対応する、対応不要のいずれかを決める
    6. 対応チケットと運用記録へ残す

    設定を変更しても、スコアはすぐに変わらない

    セキュリティコントロールの評価は1日1回実行されます。

    実行時刻は固定されておらず、特定の時間帯に評価されることは保証されていません。そのため、設定を変更して画面を再読み込みしても、準拠スコアや評価結果がすぐに更新されるとは限りません。

    設定変更後は、次回の評価実行後に結果を確認してください。

    💡 設定変更後の確認手順

    1. 設定変更の日時と内容を記録する
    2. 次回の評価実行を待つ
    3. 評価結果が合格になったか確認する
    4. 準拠状況と準拠スコアを確認する
    5. 対応チケットを解決済みに更新する

    準拠スコアを見るときの注意点

    スコアの履歴は保存されない

    準拠スコアの算出結果は履歴として保持されません。画面に表示されるのは、最新の評価結果に基づくスコアのみです。

    過去のスコアとの比較や推移を確認したい場合は、定期的に画面を保存するなど、利用者側で記録する必要があります。

    運用記録の例

    • 確認日
    • 準拠スコア
    • 非準拠ルール数
    • 高・致命的の件数
    • 未対応チケット数
    • 前回から変更した設定

    評価ルールごとの点数や重みは公開されていない

    公式マニュアルでは、評価ルールの実行結果を集約して準拠スコアを算出すると説明されています。

    一方で、各評価ルールが何点に相当するのか、重大度によって重みが変わるのか、同じ非準拠リソースが複数ある場合にどう計算されるのかといった詳細な算出式は公開されていません。

    そのため、次のような判断はできません。

    • この設定を変更すれば必ず10点上がる
    • 重大度が高い項目ほど減点が大きい
    • 非準拠のリソースが1台増えるごとに一定点数が下がる

    また、準拠スコアの算出ロジックは将来的に変更される可能性があります。

    スコア100%だけを目的にしない

    準拠スコアを上げること自体が目的になると、システム要件上必要な設定まで変更してしまう可能性があります。

    準拠スコアは、問題を見つけるための入口として利用し、最終的には対象リソース、構成理由、重大度、代替対策を確認して対応を判断します。

    最終確認チェックリスト

    • □ ダッシュボードで準拠スコアを確認した
    • □ セキュリティ基準の「非準拠」タブを確認した
    • □ 非準拠になっている評価ルール名を確認した
    • □ 評価結果から対象リソースを確認した
    • □ 不合格・失敗のどちらなのか確認した
    • □ 重大度が高・致命的の項目を優先した
    • □ パブリックIPの必要性を確認した
    • □ ディスクやバケットの暗号化状態を確認した
    • □ ログ転送と監視の設定を確認した
    • □ IAMやACLの変更内容を確認した
    • □ Add-on利用時はエージェントと検知結果を確認した
    • □ 対応できない項目は代替対策を検討した
    • □ 対応内容または対応不要の理由を記録した
    • □ 次回評価後に準拠状況を再確認した

    まとめ

    さくらのクラウドの準拠スコアが低い場合は、スコアの数値だけを見て設定を変更するのではなく、非準拠になっている評価ルールと対象リソースを確認します。

    確認する順番は次のとおりです。

    1. ダッシュボードで準拠スコアと重大度別の件数を確認する
    2. セキュリティ基準の「非準拠」タブを開く
    3. 評価結果で対象リソースと重大度を確認する
    4. 高・致命的の項目から優先的に対応する
    5. 設定変更後、次回の評価結果を確認する

    準拠スコアは、システム全体の安全性を保証する点数ではありません。セキュリティ上の確認漏れを見つけ、日々の運用改善につなげるための指標として活用しましょう。

    次に読む

    • セキュリティコントロールを有効化する手順
    • さくらのクラウドでパケットフィルタを設定する方法
    • KMSキーを作成してディスクを暗号化する方法
    • 高・致命的な評価結果をシンプル通知で受け取る方法

    参考資料

    ※本記事の内容は2026年7月30日時点の公式情報を基にしています。サービスの画面、評価ルール、準拠スコアの算出方法は変更される可能性があります。最新情報は公式マニュアルをご確認ください。

  • 政府AI「源内」はさくらのクラウドで動くのか — OSS公開から3か月、国産クラウドでMVPを動かすまで

    政府AI「源内」はさくらのクラウドで動くのか — OSS公開から3か月、国産クラウドでMVPを動かすまで

    2026年4月24日、デジタル庁がガバメントAI「源内」のソースコードを公開した(当時の解説記事)。リポジトリを眺めながら考えていたのは、「これはAWSの外でも動くのか」という素朴な問いだった。源内はガバメントクラウド上のAWSを前提に構築されており、公開されたコードにもCDK、Cognito、DynamoDBといった依存がそのまま残っている。コードが読めることと、自分の環境で動かせることのあいだには、かなりの距離がある。

    EastCloudでは2026年6月、この距離を実測するために、源内のWebフロントエンドをさくらのクラウド上で動かす検証プロジェクトを社内で立ち上げた。先に結論を書いておく。エージェントを選び、実行し、さくらのAI Engineから回答が返ってくるという最小限の体験は、さくらのクラウドのマネージドサービスの組み合わせで成立した。ただし、源内の全機能が動いたわけではない。本稿では、何を動かし、何を意図的に後回しにし、どこでつまずいたかを記録する。

    前提 — これは公式の移植ではない

    最初に断っておきたい。ここで扱うのは、当社が社内で「源内 on Sakura」と呼んでいる検証実装であり、デジタル庁の公式プロジェクトでも、デジタル庁が認めた移植版でもない。公開されたOSSを、ライセンスの範囲で第三者が別のクラウドへ載せてみた、という位置づけである。

    ライセンス面は少し注意がいる。源内のWeb側リポジトリ genai-web はMITライセンスが中心だが、一部のLambdaやCDK関連ファイルはAmazon Software Licenseの対象になっている。取り込む範囲を決める際には、ファイル単位でヘッダを確認した。今回の検証では上流のv1.0.7を固定し、取り込んだ範囲・除外した範囲・当社で改変した範囲をコミットで分離して、どこまでが源内由来でどこからが改修かを後から説明できるようにしている。AWS依存の塊であるインフラ定義(CDK)は、そもそも持ち込んでいない。

    なぜさくらのクラウドで動かすのか

    理由は源内そのものの文脈にある。源内は、政府のAI基盤を特定ベンダーへの依存を抑えながら育てるという流れの中にいて、国産LLMの選定もOSS公開もその一環と読める。一方、受け皿となる国内インフラの側では、さくらのクラウドがガバメントクラウドの対象クラウドサービスとして正式採択された(経緯はこちらの記事)。

    つまり「政府製のAIアプリケーション資産」と「国産のガバメントクラウド対応インフラ」が、それぞれ別の理由で揃いつつある。なら実際に載せてみればいい、というのが今回の動機である。なお、EastCloudはさくらインターネットのパートナーとして日常的にさくらのクラウドを扱っているが、本稿は検証の記録であり、動いたものは動いた、動かなかったものは動かなかったとそのまま書く。

    源内のAWS依存を数えるところから始めた

    移行でやりがちな失敗は、AWSのサービス名を国産クラウドのサービス名へ1対1で読み替えて、そのまま持ち込もうとすることだ。今回はまず、源内のWeb側が実際に何へ依存しているかを棚卸しし、そのうえで「初期の最小構成に必要なもの」と「今は置き換えないもの」を切り分けた。主要な依存と今回の扱いは次のとおり。

    AWS側源内での役割今回の扱い
    S3 + CloudFrontフロントエンド配信オブジェクトストレージ+ウェブアクセラレータを検証したうえで、初期構成ではAppRun同梱配信を採用(後述)
    API Gateway + LambdaAPIの入口とバックエンド処理AppRun上のGo製ゲートウェイ / APIへ責務ごと置き換え
    Cognitoユーザー認証持ち込まない(Cognitoは今回使っていない)。代わりに検証用の共有アクセスゲートを別途用意(個別アカウント管理は範囲外)
    DynamoDBチャット履歴などの永続化使わない。履歴永続化そのものを初期範囲から除外
    Bedrockモデル実行さくらのAI Engineをプロバイダアダプタ経由で利用
    Secrets Manager / KMSシークレット保護さくらのシークレットマネージャ / KMSを正本に
    CloudWatchログ・監視AppRunの標準ログでリクエストIDを突き合わせて動作・障害を確認。ダッシュボードやアラート等の監視設計は未着手

    表にすると整然として見えるが、実際の判断はもう少し泥臭い。たとえばLambdaは「Lambdaの代替探し」をすると失敗する。HTTPの同期APIなのか、キュー処理なのか、スケジュール実行なのかで置き換え先は変わるからで、今回はHTTP同期APIだけを対象に、AppRun上の常駐Goプロセスへ寄せた。キューやスケジュールの置き換えは、それを必要とする機能に手を付けるときに個別に考える。

    最小構成のかたち

    今回の構成はこうなった。

    源内 on Sakura MVPの構成図。利用者からReact UI、Goゲートウェイ、形式変換、Runtime、Sakura Providerを経てSakura AI Engineへ至るリクエストの流れと、回答が返る経路、モジュール責務境界を示す
    MVPの構成。リクエストは左から右へ流れ、回答は下段の経路で利用者まで戻る

    設計上こだわった点が3つある。

    第一に、AIの呼び出しをサーバサイドへ閉じたこと。ブラウザからAI Engineを直接叩かず、APIキーもフロントエンドへ出さない。エージェント定義のうちシステムプロンプトのような実行時情報はサーバ側だけが持ち、画面には表示用の情報だけを渡す。

    第二に、失敗を成功に見せないこと。プロバイダが未設定なら「未設定」というエラーで止める。AI Engine側でエラーが返れば、サンプル回答やそれらしいダミーで取り繕わず、安全なエラーとして返す。この種の検証では一般に、ダミー応答を本物の成功と取り違えたまま進んでしまう事故が起きやすい。今回は、そうならないことを失敗系のテストで確認しながら進める方針を最初に決めた。

    第三に、追跡IDの境界を決めたこと。障害調査にはリクエストの追跡IDが要る。ただ、AIプロバイダ側の内部IDをそのままブラウザへ返すと、外部サービスの内部情報を利用者へ露出することになる。今回はゲートウェイが発行するリクエストIDだけをクライアントへ返し、プロバイダ側IDとの対応はサーバのログに閉じた。

    認証について補足しておく。今回の「共有アクセスゲート」は、検証環境に鍵をかけるための入口であって、ユーザー認証ではない。個別アカウントも、テナントも、権限管理も、監査証跡も、ここからは何も主張できない。Cognitoの置き換えは、この検証の範囲外として明確に残してある。

    動いたもの

    最終的に、次の一連の流れがさくらのクラウド上で動いた。

    • ブラウザでアクセスし、共有アクセスゲートを通過する
    • エージェントの一覧と詳細を表示する
    • テキスト生成系のエージェントを選んで実行する
    • さくらのAI Engineが生成した回答が画面に返る

    成功パターンだけでなく、失敗パターンも確認した。プロバイダ設定を意図的に壊した状態で実行すると、フェイクの成功応答に化けることなく、エラーとして返ってくる。地味だが、この失敗系の確認こそ検証の本体だと思っている。

    動かしていないもの

    ここを曖昧にすると「源内がさくらで完全に動いた」という誤解が独り歩きするので、動かしていないものを明記する。

    • チャット履歴・実行履歴の永続化(データベースを使っていない)
    • RAG、ファイルアップロード、画像生成などの拡張機能
    • ユーザー別の認証・テナント・権限・管理画面
    • 利用量・コスト管理、監査ログの永続化
    • 本番運用を前提とした監視・アラート・運用手順

    つまり動いたのは「源内の最小の背骨」であって、源内互換の完成品ではない。背骨が通ることと、全身が動くことは別の話である。ただ、この距離感そのものが、移行を検討する人にとっては有用な情報になるはずだ。

    つまずいた壁 — 3つだけ挙げる

    検証で越えた壁のうち、ほかの人も踏みそうなものを3つ記録しておく。

    壁1. SPAのdeep linkが404になる

    源内のフロントエンドはReact RouterのSPAで、/chat/:id のようなURLへの直接アクセスに対して、配信側が index.html を返す仕組みを前提にしている。AWSではCloudFrontのカスタムエラーレスポンスが担っているこの挙動が、さくらの静的配信には見当たらなかった。今回はAppRun上のゲートウェイでルートを分類して解決した。ここは論点が多いので、続編の記事で検証内容ごと掘り下げる。

    壁2. シークレットの注入

    シークレットマネージャを秘密情報の正本にしたが、AppRun(共用型)のアプリケーションからシークレットマネージャの値を直接参照する方法は、検証時点では確認できなかった。今回は検証限定の暫定運用として、同じ値をAppRun側へ手動登録する二重管理にした。二重管理は更新漏れの温床になるので、長く続けたい形ではない。ここはAppRunからシークレットマネージャを直接参照できる公式対応を待ちたいところで、それまでは、APIやIaCで両者の同期を自動化して更新漏れを防ぐのが現実的だと考えている。

    壁3. どこまで隠すか

    AIプロバイダの生のエラー本文をそのまま返すと、内部情報が漏れる。かといって全部を握りつぶすと調査ができない。公開してよいエラーコードとメッセージを許可リストで定め、それ以外はサーバログ側で追う、という整理に落ち着いた。

    なお、この種の検証結果には賞味期限がある。上記はいずれも2026年6月中旬から下旬にかけての実機検証に基づくもので、さくらのクラウドは機能追加のペースが速い。実際、当社の別の検証では、一度「構造的に不可能」と結論づけた制約が、その後の機能提供で解けた例もあった。重要な判断の前には、必ず現行の公式ドキュメントを確認してほしい。

    さくらのクラウドに期待したいこと

    検証を終えて、要望を2つに絞るならこうなる。1つは、静的配信側での任意ルートfallback。存在しないURLへのアクセスを指定ドキュメントへ返せれば、SPAはオブジェクトストレージとウェブアクセラレータだけで完結し、AppRunはAPIに専念できる。もう1つは、AppRunからシークレットマネージャへの直接参照。この2つが揃うと、AWSで当たり前だった構成との段差がだいぶ埋まる。

    一方で、擁護もしておきたい。AppRunにフロントエンドとゲートウェイを同梱する構成は、回り道のようでいて、どのルートを画面へ返しどのルートをAPIとして扱うかが設計として明示される利点があった。そして何より、コンテナレジストリにイメージを置き、AppRunへ載せ、AI Engineへつなぐという流れは素直で、最小構成のMVPまでは想像より短い距離で到達できた。

    まとめ

    • 源内のWebフロントエンドは、さくらのクラウド(AppRun + AI Engine + シークレットマネージャ等)の上で、エージェント実行の最小体験まで動いた
    • 動かしていない領域(履歴・RAG・認証・運用堅牢化)は多く残っており、「動いた」と「置き換えられた」は別物である
    • AWS依存はサービス名の読み替えではなく、責務単位で棚卸ししてから置き換える
    • 検証結果には日付を付ける。クラウドの制約は動く

    源内のOSS公開を「読む」ところから「動かす」ところへ進めてみて、参照実装としての政府OSSという設計の意味が、少しだけ体感として分かってきた。続編では、今回さらりと流したSPA deep linkの壁を、検証で確認できた事実ベースで掘り下げる。

    よくある質問

    Q1. 政府AI「源内」とは何か

    デジタル庁が内製で開発・運用している政府職員向けの生成AI利用環境である。2026年4月にWeb側の genai-web とアプリ側の genai-ai-api がGitHubで公開され、第三者もライセンスの範囲で利用できる。

    Q2. 源内のソースコードは商用利用できるか

    中心はMITライセンスであり商用利用できる。ただし一部のファイルはAmazon Software Licenseの対象なので、利用する範囲をファイル単位でヘッダ確認したい。

    Q3. 源内はAWS以外のクラウドでも動くか

    そのままでは動かない。Cognito・DynamoDB・CloudFrontといったAWS前提の依存を棚卸しし、責務単位で代替へ置き換える必要がある。本記事の検証では、さくらのクラウド上でエージェント実行の最小構成が動作した。

    Q4. さくらのクラウドで源内を動かすには、どのサービスを使うか

    本検証では、AppRun(コンテナ実行)、さくらのAI Engine(モデル実行)、シークレットマネージャ、コンテナレジストリを組み合わせた。チャット履歴の永続化やユーザー別認証は、検証範囲に含めていない。

    Q5. さくらのAI Engineとは何か

    さくらインターネットが提供する生成AIの実行基盤で、APIから各種モデルを呼び出せる。本検証では、AWSのBedrockが担っていたモデル実行の置き換え候補として、サーバサイドのアダプタ経由で利用した。

    Q6. 「源内 on Sakura」はデジタル庁の公式プロジェクトか

    違う。EastCloudが社内検証のために使っている呼び名であり、デジタル庁とは関係のない非公式の検証実装である。

    Q7. 源内をさくらのクラウドで動かすときの一番の壁は何か

    2026年6月の検証時点では、SPAのdeep link(URL直接アクセス)への対応と、AppRunからのシークレット直接参照の2点だった。前者はAppRun上のゲートウェイで解決し、後者は検証限定の暫定運用で回避した。

    参考リンク

  • 【Claude.ai】Free では Cowork が使えない理由、そしてセキュリティ要件が強い組織が慎重になるべき理由

    【Claude.ai】Free では Cowork が使えない理由、そしてセキュリティ要件が強い組織が慎重になるべき理由

    イントロダクション:なぜ「どちらでもいい」では済まないのか

    • Claude.ai と Claude Cowork は同じ Claude の上にある 2 つの実行形態
    • 「どちらが優れているか」ではなく「どの仕事をどのモードで走らせるか」が決定軸
    • 組織のセキュリティ成熟度と予算によって、最適な選択が大きく変わる
    • 特に以下の 2 つのポイントで、選択が実質的に制約される
    • 無料プランユーザーには選択肢がない
    • ガバナンス要件が強い企業にとっては「便利さ」だけでは判断できない

    Free では Cowork が使えない理由:価格設計から見える意図

    Cowork の位置づけはなぜ Pro 以上限定なのか

    • Cowork は「バックグラウンド実行と持続性」を売り物にしている
    • 複数ステップの自律実行
    • ローカルファイルやブラウザ操作の継続処理
    • 毎朝や毎週の定期タスク化
    • これらすべてが Anthropic サーバー上のリソースを消費
    • Free プランの限界と Cowork の関係
    • Free では Monthly message limits が設定されており、無制限利用に対応できない
    • Cowork の background execution は本質的に「放置して走らせる」= 使用量予測が難しい
    • 無料ユーザーに無制限に実行させるわけにはいかない設計
    • 実務的な含意
    • Cowork の価値は「反復性」と「自動化」にある
    • 単発の探索や分析なら Claude.ai で十分
    • 組織的に導入すれば、Pro / Team / Enterprise 費用の正当性が出てくる

    価格表の読み方:「買うのではなく、モード転換する」

    プラン価格Claude.aiCowork含意
    Free$0✓✗対話による実験・探索のみ
    Pro$20/月✓✓Chat から自動化への移行点
    Max$100-200/月✓✓ヘビーユースと先行機能
    Team$20-125/席/月✓✓組織管理とコラボレーション
    Enterprise$20/席/月 + API従量✓✓統制・監査・カスタマイズ
    • 個人利用での判定ポイント
    • 月に 1-2 度だけ資料作成に使う → Free または無料試用で足りる
    • 週に複数回、定型業務があって自動化したい → Pro が pay off
    • 毎日、複数案件を並行する → Max か Team を検討

    Claude.ai vs Cowork:「対話型」と「委譲型」の本質的な違い

    何が「実行モード」の違いなのか

    • Claude.ai(Chat 中心):「あなたが握る対話ループ」
    • 人間がプロンプトを入力 → Claude が回答
    • 評価・修正判断は人間が都度実施
    • モデルやeffort の切り替えが可能
    • Projects、Memory、Artifacts で思考プロセスを蓄積
    • 用途:要件定義、ブレスト、評価軸の発見、プロンプト調整
    • Claude Cowork:「Claude に任せた実行ループ」
    • ユーザーは目的と制約を定義
    • Cowork が複数ステップを自律で実行
    • ローカルファイル、コネクタ、ブラウザ操作も含む
    • 定期実行、バックグラウンド処理、サブタスク分割が可能
    • 用途:反復業務、ファイル処理、レポート自動化、定期タスク

    単なる機能差ではなく「人間とのインタラクション設計」の違い

    • Claude.ai:人間の判断を軸に、AI が提案・修正を繰り返す
    • 「この解釈でいい?」「別のアプローチもある?」という往復が価値
    • 例:記事の見出し候補を 3 案出させて、1 つ選ぶ→修正→再検討
    • Cowork:AI の判断を軸に、人間が必要な時だけ介入する
    • 「毎朝 7 時に昨日のメール・Slack をまとめて、ドラフトを残す」
    • 「フォルダ内の全ファイルから比較表を作る」
    • 人間は承認ポイントでだけ判断する

    セキュリティ・監査要件との向き合い方:「便利さと統制」のトレードオフ

    Cowork が持つガバナンス上の弱点

    • 現在の Cowork は「監査対象外」の状態にある
    • 監査ログ(Audit Logs)に Cowork アクティビティが記録されない
    • Compliance API の対象外
    • Enterprise でも「Chat の会話は監査できるが、Cowork タスクは監視できない」という状況
    • エンドポイント可視化(EDR)も効かない
    • Cowork はリモートセッション(Anthropic のサンドボックス)で実行される
    • ローカル Claude Desktop を経由してファイルに到達しても、その処理は Anthropic 側で発生
    • EDR やローカル監視ツールで「Cowork が何をしたか」を捕捉できない
    • データ処理の場所が端末外
    • Gmail、Drive、Calendar の情報を Cowork で集める場合、Anthropic のサーバーで処理
    • ファイルの読み書きも Anthropic 側で発生
    • 社内ネットワークルール(オンプレミス限定など)を適用しにくい

    どのような組織が「慎重になるべき」なのか

    • Cowork 導入前に確認すべき要件
    • 金融・医療・法務など、規制業種か
    • 監査日程が決まっており、全システムの操作ログが必須か
    • 社内データが「絶対に Anthropic サーバーを経由してはいけない」ルールか
    • EDR や SIEM に完全可視性があることが要件か
    • 慎重になるべき段階的判定
    • 社内機密のない、外部ツール(Slack、公開サイト)のみ → Cowork は比較的導入しやすい
    • 社内データを扱うが、非個人情報・非営業秘密 → Cowork は限定導入(承認設計必須)
    • 顧客データ・個人情報・規制対象情報を扱う → Cowork は避けるか、API / Managed Agents へ迂回

    Enterprise でも「Cowork は別立て」のリスク設計が必要

    • Enterprise の Compliance API、監査ログ、CME K などは Chat と API に対するもの
    • Cowork 活動を同じレベルで統制するには、現時点では OpenTelemetry などの外部監視が必須
    • つまり、Enterprise のセキュリティ実装が充実していても、Cowork 導入には追加の設計コストがかかる

    実務的な使い分けチェックリスト

    こんな時は Claude.ai を選ぶべき

    • [ ] やりたいことの「ゴールがまだ曖昧」
    • [ ] 同じ依頼を何通りか試して、反応差を見たい
    • [ ] プロンプトやモデル設定を調整しながら進めたい
    • [ ] 人間の判断・評価が随所に必要
    • [ ] 出力は 1-2 回の往復で足りる
    • [ ] ローカルファイル操作や定期実行は不要
    • [ ] 監査・EDR 可視性が絶対条件

    Claude.ai はプロンプト発見の場

    こんな時は Cowork を選ぶべき

    • [ ] 完了条件が明確に定義できる
    • [ ] 複数のファイル、メール、チャット、Web を組み合わせる
    • [ ] 毎週・毎日など、同型の処理が繰り返される
    • [ ] 人間の介入は承認ポイント数か所だけで十分
    • [ ] ローカルファイル整理、ブラウザ操作、レポート化が中心
    • [ ] バックグラウンド実行や定期タスク化が価値を生む
    • [ ] セキュリティ・監査要件が「導入可能な範囲」に収まる

    Cowork はプロンプト運用の場


    導入シナリオ別ガイド:「考える工程」と「仕上げる工程」の分け方

    シナリオ 1:新しい記事や企画を考える場合

    段階 1:Claude.ai で構成と評価基準を作る

    • 記事のトーン、見出しの粒度、ターゲット読者を複数案で試す
    • Project instructions で「この記事のルール」を定義
    • Skills で「評価ルーブリック」を保存

    段階 2:Cowork で量産・最適化する(オプション)

    • 同じテーマで複数の記事が必要な場合、Skill 化したプロンプトを Plugin へ
    • 定期的に似た企画が発生するなら、Scheduled Task へ

    シナリオ 2:営業向け日報・ブリーフの自動作成

    Claude.ai では不向き:人間が毎朝起動して、メール・カレンダーを自分で読んでプロンプトを書く手間

    Cowork が最適:

    • Gmail、Calendar、Slack、Google Drive コネクタで情報自動収集
    • 毎朝 6 時に自動実行
    • ドラフトを確認用フォルダに残す
    • 承認して Slack 投稿(またはしない)
    • 結果:人間の時間コスト 90% 削減

    シナリオ 3:社内ローカルデータから報告書を作る場合

    要件確認が必須:

    • データが個人情報・規制対象でないか → Cowork OK
    • 処理結果を外部に出さないか → Cowork OK
    • 監査ログが絶対必須か → Cowork 要検討 / API 検討

    対応案:

    • 監査不要・内部参考用 → Cowork で OK
    • 監査必須 → Claude API(Messages API)+ ログ集約
    • 本番システム組み込み → Claude Platform の Managed Agents

    セキュリティ要件ごとの段階的導入パス

    低セキュリティ要件:スタートアップ・個人事業主

    • 推奨:Pro プラン + Cowork フル活用
    • 価格:$20/月
    • できること:全コネクタ、全自動化機能
    • 監査・統制は不要

    中セキュリティ要件:小〜中堅企業(非規制業種)

    • 推奨:段階導入
    1. まず Claude.ai(Chat)で基本操作を習得
    2. 非機密の Slack・公開 Web 情報のみで Cowork を試す
    3. 社内データが増えたら、アクセス制御・承認設計を追加
    4. 必要に応じて OpenTelemetry 監視を導入
    • 価格:Team Standard ($20-25/席/月) または Enterprise(要相談)

    高セキュリティ要件:金融・医療・法務など

    • 推奨:API / Managed Agents を優先検討
    1. Chat と API(Messages API)でプロトタイプ
    2. ログ・監査が必須なら Managed Agents($0.08/セッション)
    3. Cowork は「非機密情報・低リスク業務」に限定
    4. ガバナンス層を別途構築
    • 価格:Enterprise(座席 + API従量)
    • 追加費用:セキュリティ実装・監視設計

    よくある誤解と整理

    「Cowork はもっと機能が多い」は正確でない

    • Claude.ai でも、ファイル生成(Excel、PowerPoint、PDF)ができる
    • Claude.ai でも Web search、コネクタが使える
    • 差は「人間が繰り返し起動する必要があるか」だけ

    「Cowork は本番向け」は半分正確

    • 本番システムなら API または Managed Agents が最適
    • Cowork は「個人・チーム向けの自動化」が本来の用途
    • 監査・カスタマイズが必須なら、むしろ API へ寄せるべき

    「Enterprise なら全部大丈夫」は勘違い

    • Enterprise は Chat・API については監査対応
    • Cowork 活動の監査ログ対応はまだ
    • 要件があれば OpenTelemetry や外部 SIEM と連携する設計が必要

    まとめ:「Free では使えない理由」と「慎重になるべき理由」の本質

    Free では Cowork が使えないわけ

    • インフラコスト:バックグラウンド実行とストレージにかかるコストが無料では吸収できない
    • 使用量予測の困難性:定期実行される Cowork は月間メッセージ上限の管理が不可能
    • ビジネスモデル:持続性と自動化は「Pro 以上で価値が出る機能」として位置づけられている

    セキュリティ要件が強い組織が慎重になるべき理由

    • 現時点では監査ログに載らない:Compliance API 対象外、EDR 不可視化
    • 処理が Anthropic サーバーで実行される:端末管理・オンプレミス限定ルールの適用が難しい
    • 段階的な統制設計が必須:「便利だから」だけでは導入判定できない

    結局どう使い分ければいいのか

    1. プロンプト発見・モデル調整:Claude.ai
    • 試行錯誤、要件整理、評価軸の作成
    • Project instructions と Skills で「型」を保存
    1. 確立したプロンプトの運用:Cowork
    • 定期実行、ファイル処理、複数ステップの自動化
    • セキュリティ要件が許可する業務に限定
    1. 本番システム統合:Claude Platform(API / Managed Agents)
    • 監査ログ、カスタマイズ、組み込み
    • セキュリティ要件が厳格な組織はここから始める

    つまり、Free はお試し版ではなく「対話型利用に特化した段階」であり、Cowork は「Chat で発見したプロンプトを自動化に乗せるための次のステップ」という整理が最も正確です。

  • プロンプト発見からCowork運用へ──「型作り」と「実行」の分業

    プロンプト発見からCowork運用へ──「型作り」と「実行」の分業

    「結局、どう使い分ければいいのか」という問い

    Claude.aiとClaude Cowork。同じClaudeなのに、なぜ両方が必要なのか。そもそもどう違うのか。

    この問いに対するもっとも実用的な答えは、使うときのあなたの立場の違いにあります。曖昧な問いを詰めているのか。明確な仕事を任せるのか。その一点で、選ぶツールが変わります。

    本記事では、プロンプトエンジニアの視点から、Claude.aiで「型を作り」、Coworkで「型を実行する」ための使い分けを解説します。Anthropic公式の位置づけを踏まえながら、実務的な判断フローを示します。


    Claude.aiとCoworkの本質的な違い

    一行で言うと

    • Claude.ai:「考える・試す・詰める」ための対話面
    • Claude Cowork:「任せる・回す・仕上げる」ための実行面

    Anthropic公式の定義

    Anthropic自身は、次のように役割を分けています。

    • Claude Chat(Claude.ai):研究、ブレスト、執筆、分析のための対話体験
    • Claude Cowork:複雑なタスクをバックグラウンドで委譲し、継続実行するための環境

    重要なのは、これは「機能差」ではなく「モード差」だということです。どちらも同じClaudeですが、人間が対話ループを握るか、Claudeが実行ループを持つかで使い分けます。


    Claude.aiを選ぶべき局面

    こんなときはClaude.ai

    • ゴールがまだ曖昧で、問いの立て方から詰めたい
    • 同じ依頼を複数の言い方で試して、反応差を観察したい
    • モデルやeffortを切り替えながら挙動を見たい
    • 会話履歴、Projects、Memory、Artifactsを使って「考える場」を育てたい
    • プロンプトの「型」そのものを発見・評価したい

    Claude.aiの強み

    • モデル・effortの切り替えがUI上で簡単:Sonnet、Opus、Haikuを試し分けたり、推論深度(low/medium/high/xhigh/max)を調整したりできる
    • Projects&Instructions:自分の評価基準、文体、判断基準をプロジェクト単位で保存・再利用できる
    • Memory機能:一度作った「型」の背景や評価軸を記憶させておき、次の仕事に引き継げる
    • 人間が最終チェックするのが前提:試行錯誤の途中で「このゴール設定、実は間違ってた」という気づきも拾える

    プロンプト発見の実例

    たとえば営業向け記事のトーン設計なら:

    1. Claude.aiで複数案を往復する
    2. Project instructionsに「反論の拾い方」「数字の使い方」を沈める
    3. 複数の記事でそのinstructionsを使って再現性を確認する
    4. ここまでやってはじめて「型が完成した」と言える

    この工程全体が、Claude.aiの得意な領域です。


    Coworkを選ぶべき局面

    こんなときはCowork

    • 完了条件が明確に決まっている
    • ローカルフォルダ、Gmail、Slack、カレンダーなど複数のデータ源をまたぐ
    • ユーザーが張り付いて逐次対話するより、途中確認だけで進めたい
    • 毎週・毎朝・案件ごとに同型の処理が何度も発生する
    • ローカルファイル整理、ブラウザ操作、レポート化のような「仕事の後工程」が多い

    Coworkの強み

    • 複数ステップの自律実行:ユーザーが外出中や別の作業中でもタスクが進む
    • ローカルファイル+ブラウザへの到達:Claude Desktopを経由してローカルフォルダを読み書きでき、ブラウザ操作もできる
    • Scheduled Tasks:毎朝6時に自動実行、毎週月曜に実行、といった定期タスクが可能
    • Plugins&Skills&Connectors:Gmail、Google Drive、Slack、Microsoft 365などが統合できる
    • 途中承認ポイントの設定:「ここで人間に確認を求める」という指示をプロンプトに織り込める

    実行の実例

    たとえば「毎朝の商談前ブリーフ自動生成」なら:

    1. Gmail、Calendar、Slack、Google Driveから案件情報を集める
    2. 重要な変更点だけ抽出する
    3. リスク、未解決事項、次アクションをまとめる
    4. A4一枚のブリーフを作成し、送信はせず確認用ドラフトで保存する
    5. これを毎朝6時に実行する

    このような一連の作業は、人間が毎日やるには重い、でも完全に自動化するわけではなく、最後は人間が目を通したいという典型的なCowork用途です。


    実務的な使い分けチェックリスト

    Step 1:ゴールは明確か?

    • 曖昧 → Claude.aiで要件定義と評価基準を先に作る
    • 明確 → Step 2へ

    Step 2:複数ステップ+複数データ源か?

    • いいえ → Claude.aiで実行、または単発利用で十分
    • はい → Step 3へ

    Step 3:ローカルファイル・ブラウザ・コネクタが必要か?

    • いいえ → Claude.aiまたはAPIでも対応可
    • はい → Step 4へ

    Step 4:監査ログやEDR可視性が必須か?

    • 必須 → 組織のセキュリティ要件を先に確認し、限定導入を検討
    • 不要 → Coworkで本格導入可

    Step 5:毎回同型で何度も発生するか?

    • はい → Scheduled Task化、Skill化、Plugin化を検討
    • いいえ → 単発Coworkタスクとして実行

    Step 6:最後に本番システムへ組み込みたいか?

    • はい → Claude Platform API or Managed Agentsへ移行を検討
    • いいえ → Claude.ai+Coworkの併用を継続

    「三段階の進化」で理解する

    第1段階:Claude.ai(プロンプト発見)

    目的:仕事の「型」を作る

    • 曖昧な問いから仕様を詰める
    • 評価基準を言語化する
    • Instructionsやメモリに保存する

    典型的な期間:数日〜数週間

    第2段階:Claude Cowork(プロンプト運用)

    目的:型をスケール実行する

    • 定義した指示をScheduled TaskやPluginに落とす
    • 複数ステップ・複数データ源を統合
    • 毎回同型の処理を自動化する

    典型的な期間:毎日〜毎週の継続利用

    第3段階:Claude Platform API(本番統合)

    目的:システムへの組み込み

    • Managed Agentsで状態をもつエージェント実行
    • Messages APIでステートレス制御
    • 組織全体のガバナンス・監視・課金管理

    典型的な利用:部門配置、事業統合、SaaS連携


    「出力物の種類」で分けてはいけない

    よくある誤解

    「資料を作るのはCowork、テキストはClaude.ai」という分け方は不正確です。

    Claude.aiでも:

    • Excel、PowerPoint、Word、PDFを生成できます
    • Artifactsを使ってHTMLやコードを作成できます
    • ファイルをダウンロードできます

    Coworkだけが出力できるわけではありません。むしろ、何度も同型の資料を作る、複数ソースから自動で情報を集めて資料にする、といった場面でCoworkが活躍するのです。

    正しい分け方

    軸Claude.aiClaude Cowork
    人間の関与対話ループを握る実行ループをClaudeに持たせる
    サイクル1回の質問と回答複数ステップの連続実行
    データ源手動アップロードやコネクタ統合されたConnectors+ローカルファイル
    継続性1チャットセッション内スケジュール実行、複数ユーザーでの共有
    変化への対応人間が都度修正Pluginやinstructionsの更新で全体に反映

    実践テンプレート

    Claude.aiで「型を作る」ときのテンプレート

    あなたはプロンプト設計レビュー担当です。
    
    【タスク】
    [やりたい仕事を1文で]
    
    【前提】
    対象読者:[誰向けか]
    入力データ:[どんなデータが来るか]
    制約:[何ができないか]
    
    【まずやってほしいこと】
    1. このタスクで曖昧な点を3つまで特定する
    2. 成功条件を箇条書きで定義する
    3. 最小構成のプロンプト案を作る
    4. よくある失敗ポイントを挙げる
    5. 改善版を2案出す
    
    【出力】
    - 成功条件
    - 初稿プロンプト
    - 失敗要因分析
    - 改善版A(~の場合に最適)
    - 改善版B(~の場合に最適)

    Coworkで「型を実行する」ときのテンプレート

    このタスクをCoworkで最後まで実行してください。
    
    【目的】
    [最終成果物と目的]
    
    【入力ソース】
    - ローカルフォルダ:[フォルダ名]
    - Connectors:Gmail / Drive / Slack など
    - 参照URL:[指定があれば]
    
    【途中で私に確認が必要な判断】
    - メール送信や対外共有
    - ファイル削除や上書き
    - 重要な解釈判断
    
    【禁止事項】
    - [何をしてはいけないか]
    
    【完成条件】
    - [何が成果物か]
    - [フォーマットは]
    - [含めるべき内容]
    - 不確実な点は「要確認」と明記

    ガバナンス・セキュリティ上の注意点

    Cowork導入で気をつけること

    現時点での制限事項:

    • Cowork活動は監査ログ・Compliance APIの対象ではありません
    • EDRによる端末の可視化が効きません
    • 代替策はOpenTelemetry監視のみです

    責任分界:

    • ローカルファイル処理はClaude Desktop経由ですが、実行はAnthropic側で行われます
    • つまり、端末内で完結しない可能性があります

    適用できる組織 vs. 慎重検討が必要な組織:

    組織の特性Cowork導入
    創造的な知的生産中心✅ 即導入しやすい
    ガバナンス・監査要件が軽い✅ 即導入しやすい
    医療・金融・規制業種⚠️ 限定導入、要相談
    EDR・SIEM監視が必須⚠️ 要確認、フォーカスエリア限定
    データ保有地の厳格指定⚠️ 要確認(US-only optionあり)

    対応策:

    • Enterprise契約で可視化・制御オプションを確認する
    • Coworkは「きわめて生産性の高い業務」に限定導入する
    • Chat&APIから段階的に始める

    価格と導入パターン

    個人利用:Claude.aiで十分?それともCowork必要?

    プラン月額Claude.aiCowork
    Free$0✅❌
    Pro$20✅✅
    Max 5x$100✅✅
    Max 20x$200✅✅

    結論:個人なら、Coworkを「買う」のではなく「Pro以上に上げるとついてくる」と考えましょう。

    組織利用:Team&Enterprise

    プラン座席料機能
    Team Standard$20/人/月Chat + Cowork + Code
    Team Premium$100/人/月大幅に多い使用量
    Enterprise$20/人/月 + 従量課金完全カスタマイズ

    Enterprise契約時の重要点:

    • 座席料は基本アクセス権
    • 実際の使用量(Chat、Code、Cowork、API)は別途従量課金
    • 監視、制御、Compliance APIはこのレベルで初めて提供される

    最新の動き(2026年7月時点)

    ホーム統合とWeb/Mobile拡張

    2026年7月、AnthropicはChatとCoworkのホームを統合し、Web・Mobileでも実行できるようにしました。これは「別の製品」ではなく、「Claudeの中でモードを自由に切り替える」段階へ移行したことを意味します。

    Plugins&Skills の拡張

    • Coworkで使えるPluginsが増加
    • Skills はClaude.ai&Cowork両対応に
    • 個人の工夫が組織配布可能な「型」に高度化

    セキュリティ・運用の充実

    • Analytics APIで使用状況の可視化
    • OpenTelemetry対応で詳細監視可能に
    • Compliance連携でセキュリティツール統合

    「分業」という発想

    Claude.aiとCoworkは競合ではなく分業です。

    • Claude.ai:プロンプトを発見し、型を作り、型を評価する場
    • Claude Cowork:作った型を実行し、スケールさせ、継続運用する場
    • Claude Platform API:型を本番システムに組み込む場

    大事なのは「どちらが優れているか」ではなく、あなたの仕事のどの局面でどちらを使うかを意識することです。

    曖昧な問いを詰めている局面ではClaude.ai。明確な型ができて何度も使う局面ではCowork。本番環境に組み込む段階ではAPI。この使い分けが、AIを知的生産の本当のパートナーにする第一歩です。