みなさんこんにちは。 エンタープライズ 第一本部の鈴木です。 この記事では、Feature Flag(フィーチャーフラグ)を用いた開発手法についてまとめていきます。Feature Flagは昔からある開発手法の一つですが、調査する中で面白い手法だと思ったため、改めてまとめたいと思います。 1.はじめに 2.メリット/デメリット 2-1.メリット リリースサイクルとデプロイの分離 安全なデプロイ 本番環境での容易な検証と実験 2-2.デメリット コードベースの乱雑化とテスト(CI)の複雑化 未使用のFeature Flagがコードベースに残ることで、技術負債を抱える可能性がある 3.Feature Flagを用いた開発のライフサイクル 4.開発のプラクティス 未使用のFeature Flagの定期的な削除 Feature Flagの命名と整理 決定点と決定ロジックを分離する 5.まとめ 6.参考文献 1.はじめに まずはじめに、Feature Flagについて説明します。 Feature Flagとは、新たなコードをデプロイすることなく、実行時に特定の機能をオンまたはオフにするソフトウェア開発手法です。 フィーチャートグルやフィーチャースイッチなどとも呼ばれることがあります。 以下に簡単なTypeScriptの実装を掲載しています。 // app/page.tsx const featureFlag = true ; export default function Home () { return ( { featureFlag ? ( < div > < p > 🎉 新機能が有効になっています !</ p > </ div > ) : ( < div > < p > 🚧 新機能は無効になっています 。</ p > </ div > ) } ); } このように、特定の機能やコードブロックが実行されるかどうかを条件文にして、それをフラグによってオンまたはオフを切り替えます。 この例では分かりやすいように featureFlag という変数をハードコードしていますが、通常は設定ファイルやデータベース、管理サービスなどで保持します。 上記の通り、概要自体はとても単純ですが、Feature Flagを開発に取り入れることで得られるメリットは多くあります。 次章では、Feature Flagを開発に取り入れることで得られるメリット/デメリットについてまとめます。 2.メリット/デメリット 2-1.メリット リリースサイクルとデプロイの分離 Feature Flagを採用することの1番のメリットは、リリースサイクルとデプロイの分離ができることだと思います。 Feature Flagによって、実装したコードをデプロイするタイミングと、その機能をユーザーに提供するタイミングを分離することができます。 言い換えると、機能リリースタイミングに依存せずに開発チームは任意のタイミングでコードをデプロイすることが可能になります。 デプロイの独立性が高まることで、開発チームは迅速に短いスパンでコード変更をメインブランチにマージしたり、本番環境にデプロイしたりしやすくなります。 また、ユーザーへの機能リリースは、任意のタイミングでFeature FlagをONにすることで、コードのデプロイに依存せずにリリースが可能になります。これによりリリースのタイミングとコードデプロイを合わせなくても良くなります。 安全なデプロイ Feature Flagによって安全に本番環境へデプロイすることができます。 開発者はユーザーが新しく開発した機能を利用できない状態でデプロイすることができます。 また、Feature Flagは「 キルスイッチ 」としても機能します。仮に本番環境で新機能を有効化して問題が発生した場合、問題のある機能をピンポイントで、 ロールバック なしに迅速に無効化することができます。 以上から、機能リリースのリスクを抑えつつ、安全に本番環境へデプロイすることができます。 本番環境での容易な検証と実験 Feature Flagによって本番環境を用いて、以下のような検証がしやすくなります。 ①本番環境の トラフィック やデータ量を用いた動作検証 通常、検証環境では本番同等の トラフィック やデータ量を完全に再現して検証することができないため、本番環境で予想外のインシデントが発生する可能性があります。検証用ユーザー限定でFeature Flagを有効化すれば、本番環境の トラフィック やデータ量など実運用環境でシステムを検証することができます。 ② カナリア リリースによる検証 カナリア リリースとは、新バージョンと旧バージョンのアプリケーションを並行稼働させ、新バージョンを段階的に少数のユーザーに提供し、問題がないことを確認してから全体にリリースする手法です。炭鉱で カナリア を用いて有毒ガスを検知していたことに由来します。 一部のユーザーでのみFeature Flagを有効化してリリースすることで、新機能のリリースの影響が全ユーザーに及ぶリスクを回避しながらリリースすることができます。 仮に問題が発生した場合は、Feature Flagを無効にすることで迅速に ロールバック が可能となります。また、リリース後に問題が発生しない場合は、Feature Flagを有効にするユーザーの割合を増やすことで比較的安全に全体へのリリースが可能となります。 ③A/Bテストによる検証 Feature Flagによって、本番環境で新機能と既存機能を比較し、データに基づいて意思決定を行うことができます。 例えば、ユーザーの半分は新機能を有効化し、残りは無効化にします。そして本番環境で特定のメトリクス(アプリの使用率、コンバージョン率など)やユーザーフィードバックを収集します。それらを分析して、新機能を完全にリリースするか、改善するか、削除するかなど、実データに基づいた精度の高い意思決定をすることができます。 2-2.デメリット コードベースの乱雑化とテスト(CI)の複雑化 Feature Flagを採用すると、条件分岐(if文)の実装が増えることになります。 これによってコードベースが乱雑になり、冗長な実装となり得ます。 また、条件分岐が増えることでテスト(CI)の複雑性が高まります。単純に新機能と旧機能(もしくは新機能がない状態)をそれぞれ検証する必要が生じます。複数のFeature Flag同士で依存関係がある場合は、テストケース数が指数関数的に増加するため、設計時に注意する必要があります。 未使用のFeature Flagがコードベースに残ることで、技術負債を抱える可能性がある Feature Flagの実装でコードベース上に不要なコードが残ることにより、技術負債を抱えることがあります。 適切にFeature Flagが管理されて、検証後にはきちんと削除すれば問題はありません。しかし、検証期間が長期にわたったり、削除漏れがたびたび起こったりすると不要なコードが残り続けることになります。 3.Feature Flagを用いた開発のライフサイクル Feature Flagを用いた開発のライフサイクルの一例は以下のとおりです。 Feature Flagを含む機能実装・検証 コードベースでFeature Flagを定義して、機能を実装する。 Feature Flagを定義ファイルや管理システムに設定する。 検証環境などで動作検証する。 本番環境へデプロイ、Feature Flagの有効化 開発したコードを本番環境にデプロイする。 任意のタイミングでFeature Flagを有効化して機能をリリースする。この時、リリース戦略に合わせて新機能を有効にするユーザーの割合やターゲットグループを設定する。 動作やパフォーマンスの検証 新機能の動作に問題がないことを確認する。 主要な指標(コンバージョン率、ユーザーエンゲージメントなど)や、ユーザーからのフィードバックを収集する。収集した情報を分析することで、実装した機能を完全にリリースするか改善するかの判断材料にする。 Feature Flagの削除 機能が完全にリリースされたり、廃止されたりした場合、技術負債を防ぐためにFeature Flagを削除する。 コードベースのみでなく設定ファイルや管理システムからも削除する。 4.開発のプ ラク ティス Feature Flagを開発に導入する際、以下の点に気をつける必要があります。 未使用のFeature Flagの定期的な削除 「2.メリット/デメリット > 2-2.デメリット」に記載したとおり、Feature Flagを削除しないでコードベースに残したままにすると、技術負債を抱え続けることになります。 対策としては、以下が考えられます。 機能実装の バックログ に「Feature Flagの削除」を含める。 Feature Flagに有効期限を持たせる。例えば少し乱暴ではあるが、期限切れのFeature Flagを用いたCIは失敗するように設定するなどが考えられる。 Feature Flagの 命名 と整理 ファイル名やクラス名などと同様に、Feature Flagにも一貫した 命名規則 を確立しておくことが重要です。 曖昧な 命名 をしたFeature Flagが乱立すると、何の機能に対するフラグかわからなくなります。結果的にリリース時の設定ミスにより意図しない機能が有効化されてしまったり、不要なFeature Flagがコードベースに残ってしまったりすることが考えられます。 各フラグについて、一貫した 命名 で、目的と想定動作を文書化して管理しておくことが重要です。 決定点と決定ロジックを分離する 少し実装寄りの話になりますが、Feature Flagによる機能の有効/無効をチェックする場所(決定点)と、Feature Flagの状態を決定する場所(決定ロジック)を分離するのが良いとされています。 例えば以下の実装を見てみましょう。 // featureFlags.ts (決定ロジック) export type FeatureFlagName = "isNewFeature1Enabled" | "isNewFeature2Enabled"; type FeatureFlagStates = Record<FeatureFlagName, boolean>; // 例: 設定ファイルやAppConfigのような管理サービスなどから取得した値 const featureFlagConfig: FeatureFlagStates = { isNewFeature1Enabled: true, isNewFeature2Enabled: false, }; // 決定ロジック export function isFeatureEnabled(flag: FeatureFlagName): boolean { // 引数で指定されるフラグ名に設定されたBoolean型を返却する。 return featureFlagConfig[flag]; } // app/page.tsx(決定点) import { isFeatureEnabled } from "./featureFlags" ; export default function Home () { return ( { isFeatureEnabled ( "isNewFeature1Enabled" ) && ( < div > 🎉 新機能1が有効です </ div > ) } { isFeatureEnabled ( "isNewFeature2Enabled" ) && ( < div > 🎉 新機能2が有効です </ div > ) } ); } このように決定点と決定ロジックを分離することで以下のメリットがあります。 ①メンテナンス性が向上する。 決定点と決定ロジックを分離することで、フラグの判定基準が変わってもフラグの利用箇所を修正する必要がありません。 そのため、フラグの利用箇所を探して一律変更する必要がなく、決定ロジックのみ修正すれば良くなります。 ②テストが容易になる。 決定点と決定ロジックを分離することで、それぞれ単体でのテストが可能となります。 仮に決定点と決定ロジックが同時に記述されていた場合、テストケースが複雑になり、ロジック変更の際に ソースコード やテストケースの修正に労力がかかります。そのため デザインパターン の「依存性の注入」の原則の通り、決定点と決定ロジックは分離して管理するのが良いと考えられます。 5.まとめ 今回はFeature Flagについて、概要からメリット・デメリット、そして開発に取り入れる際のプ ラク ティスをまとめました。 Feature Flagについて調査する前は、単に「if文で新機能を有効/無効にするだけでしょう」と雑に理解していましたが、いざ調べると多くのメリットがあることがわかりました。 特に、リリースサイクルとデプロイの分離が実現できることはとても魅力的と感じました。 一方で実際にプロジェクトに導入する場合は、開発サイクルの改善やプロジェクト内の教育など、それなりの労力がかかります。そのため、プロジェクトに導入したときのメリット・デメリットをきちんと整理したうえで判断していくのが大切だと思いました。 この記事には載せていませんが、理解を深めるためFeature Flagを利用したデモアプリを構築してみました。 今後記事にまとめる予定のため、興味がある方はそちらも読んでいただけるとありがたいです!最後まで読んでいただきありがとうございました。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 6.参考文献 What are feature flags? - optimizely.com How to Use Feature Flags in Azure DevOps for Seamless Feature Management - www.featbit.co Feature Toggles (aka Feature Flags) 執筆: @suzuki.takuma 、レビュー: @handa.kenta ( Shodo で執筆されました )
はじめに こんにちは、クロス イノベーション 本部エンジニアリングテク ノロ ジー センターの徳山です。 この記事は、2025年5月 20日 に公開されたばかりの Terraform MCP Server を GitHub Copilot in VS Code ( 以降、Copilotと記載 ) で使用してみた体験談です。Terraform MCP Server の導入前のコード生成状況から導入内容、導入後のコード生成結果までを紹介します。 Terraform MCP Server は、 LLM (大規模 言語モデル ) の AIエージェントへ Terraform のプロバイダーとモジュールの検出やプロバイダーのリソース詳細情報取得などの機能を提供する MCP サーバです。 Terraform MCP Server の導入前の Copilot は、Terraform の AzureRM には存在しない架空のプロパティを提案してきていましたが、導入後はシャキッと AzureRM にもとづくコードを提案してくれるようになりました。 1. Terraform MCP Server 導入前 Copilotへの依頼内容 Copilot に今回依頼する内容は、こちらの azurerm_logic_app_workflow のサンプルコードへワークフロー定義を追加してもらいたいというものです。 サンプルコード Copilot へ依頼した結果 ( Terraform MCP Serverがないとき ) Copilot へ依頼すると以下のコードが提案されましたが、 definition というプロパティは terraform の AzureRM に存在しないためにコード上でエラーになっています。 提案されたコード エラー内容 2. Terraform MCP Server を導入 Terraform MCP Serverは、先日2025年5月 20日 にHashicopから公開された MCP サーバです。 今回は Building the Docker Image locally にしたがって Docker Image で導入しました。 導入手順の make docker-build の後、 VS Code で mcp . json へ以下のとおり記載し、 MCP サーバが停止していれば起動します。 mcp . json Terraform MCP Server 起動 Copilot Chat を開いて Agentモードで Tools を確認した結果は以下のとおりで、Terraform MCP Serverが利用できる状態であることを確認できます。 Agent Tools (一覧の下の方がTerraform MCP Server) 3. Terraform MCP Server 導入後 azurerm_logic_app_workflow のサンプルコードへのワークフロー定義の追加を再度依頼しましたが、導入後でも導入前と同等のコードを再び提案してくるため、少しプロンプトを工夫して Copilot に AzureRM を参照してもらうようにしました。 依頼した際に Copilot が resolveProviderDocID や getProviderDocs の使用許可を求めてきてくれたら許可し、それで terraform の AzureRM を参照してくれるようになりました。 当記事の作成にあたって何度かプロンプトを試した中では、「terraformの公式情報を参照して」や「AzureRMの情報を参照して」などと具体的な条件を Copilot へ示すと話が早いように思います。 導入後に依頼1 : 別の Tools をまだ使用して期待とは異なる回答 導入後の依頼2 : Terraform MCP Server の resolveProviderDocID や getProviderDocs を使用し始めてコード生成 実際に生成されたコード ( Terraform MCP Server があるとき ) resource "azurerm_logic_app_workflow" "daily_trigger" { name = "daily-trigger-workflow" location = azurerm_resource_group.eode_datapf.location resource_group_name = azurerm_resource_group.eode_datapf.name workflow_schema = "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#" workflow_parameters = jsonencode({ "definition" = { "triggers" = { "Recurrence" = { "type" = "Recurrence" "recurrence" = { "frequency" = "Day" "interval" = 1 "startTime" = "2025-05-22T01:00:00Z" } } } "actions" = { "Trigger_Container_App_Job" = { "type" = "Http" "inputs" = { "method" = "POST" "uri" = azurerm_container_app_job.generate_tpcds_refresh_data.manual_trigger_url "headers" = { "Content-Type" = "application/json" } } } } "contentVersion" = "1.0.0.0" } }) } 上記の生成されたコードでは、コード上のエラーは発生していません。 このまま terraform apply するとエラーになってしまう内容ではありますが、存在しないプロパティを生成してくることはひとまずなくなりました。 さいごに Terraform MCP Server を導入することで GitHub Copilot の生成内容の精度向上を体験できました。 導入後も導入前と同様に definition という間違ったプロパティを提案することがあるのですが、これは GitHub Copilot for Azure の Tools を使用してAzureの公式ドキュメントを参照している影響と推察しています。 根拠は、Copilot の稼働時に @azure get code gen best practices という GitHub Copilot for Azure の Tools を利用しているログが確認できることと、 Azure公式情報のこちらのページ のとおり Azure Logic Apps のワークフロー定義には definition が存在しているためです。 当然のことではありますが、目的や用途に応じて MCP サーバや Agent の Tools を適切に選別して切り替えることが重要であるとあらためて感じました。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 執筆: @shikarashika 、レビュー: @nakamura.toshihiro ( Shodo で執筆されました )
こんにちは。コーポレート本部 サイバーセキュリティ推進部の耿です。 2025年3月に tj-actions や reviewdog など有名な サードパーティ アクションを巻き込んだ サプライチェーン 攻撃が発生しました。 GitHub や GitHub Actions の仕様を熟知したうえで悪用した、非常に巧妙な攻撃手法です。 ( 詳細 ) GitHub Actions の action の利用は、自組織の GitHub リポジトリ で第 三者 が書いたコードの実行を許すことに他なりません。その便利さと引き換えに一定のセキュリティリスクを孕んでいることを意識し、正しく対策を考えることが重要です。 今回発生したような侵害への防止策として、 GitHub Actions の action を利用する場合のバージョン指定はバージョンタグではなく、フルコミットハッシュ(SHA)を利用して「ピン留め」すること( 参考 )が、より一層推奨されるようになっています。Gitのコミットハッシュは、 リポジトリ 内のオブジェクトを階層的に SHA-1 ハッシュ化したものなので、コードが書き換わるとコミットハッシュも勝手に変わります。つまりコミットハッシュでバージョン指定することにより、実行されるコードを事実上固定することができます。 しかし、コミットハッシュによるバージョン指定だけで話を終えるのは不十分です。運用まで考えたときに、コミットハッシュで指定したバージョンの更新方法にも気を配らないと、全くリスク低減にならない可能性があります。 GitHub Actions の action をバージョン更新する際の運用負荷とセキュリティリスク低減のバランスについて考えてみます。 (おさらい)フルコミットハッシュ(SHA)によるバージョン指定 バージョン更新の課題 解決策1:セキュリティアップデート以外は更新を自動化しない 解決策2:セキュリティアップデート以外は自動更新を一定期間待機する 自動更新の待機期間をどれぐらいにするべきなのか? (おさらい)フルコミットハッシュ(SHA)によるバージョン指定 様々なところで言われていることなので詳細は省きますが、 GitHub Actions の action に付けられたGitタグは書き換え可能なので、バージョンタグでバージョン指定すると、実行されるコードは可変です。 ❌ - uses : actions/checkout@v4 アクションのREADMEや技術記事などでバージョンタグによる例が記載されていても、自分で利用するときにはフルコミットハッシュに書き換えるようにしましょう。 ✅ - uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 バージョン更新の課題 フルコミットハッシュでバージョン指定をしても解決されない課題があります。どのようにバージョン更新を行うかという課題です。 特に多くの GitHub Actions の action を使っている場合や、多くの リポジトリ を管理している場合は、バージョンの更新を手作業で実施するのは手間がかかります。手間を減らすために、Dependabot や Renovate を利用して更新を自動化することがよく行われています。(Dependabot と Renovate は、フルコミットハッシュでバージョン指定していても更新のPRを作成できます。) ここで留意しておきたいのは、更新を自動化することにより、 新しいバージョンが侵害されていた場合には影響を受けやすくなってしまう ということです。今回 tj-actions/changed-files が侵害を受けた件でも、バージョンタグが(悪意のあるコミットを指すように)更新されたことを検知し、多くの リポジトリ で動いている Renovate がバージョン更新の PR を出していました( 参考 )。さらに、 GitHub Actions のワークフローでよく使われる push の イベントトリガー では、更新されたブランチ(つまり更新された新しいバージョン)のワークフローファイルが実行されます。つまり自動作成された PR をマージせずとも、PR が自動作成されただけで侵害されたバージョンが自分の リポジトリ 上で実行される可能性があるということです。 まとめると、以下の攻撃が成立し得ます: 利用している GitHub Actions の action が侵害され、リリースされる。あるいは更新された新しいバージョンに 脆弱性 が含まれる DependabotやRenovateがバージョン更新を検知し、PRを作る push イベントをトリガーに実行されるワークフローでは新しいバージョン(侵害されたバージョン or 脆弱性 のあるバージョン)の GitHub Actions の action が実行する 自分の リポジトリ が被害を受ける GitHub Actions の action の更新の自動化には気を遣わなければならないと考えています。 解決策1:セキュリティアップデート以外は更新を自動化しない 自動化せずにアップデートを手作業で行えばリスクは低減できますが、運用負荷が上がってしまいます。 特に GitHub Actions のセキュリティアップデートを自動化しない場合、対応までの時間が伸びてしまいます。 両者のバランスを考えたときに、(一定のセキュリティリスクが発生することを承知の上で)「セキュリティアップデートのみを自動化し、それ以外のアップデートは自動化しない」方針が考えられます。 セキュリティアップデートのみの自動化は次の方法で実現できます。 Dependabotの場合 Dependabot Version UpdatesではなくDependabot Security Updatesを利用する Renovateの場合 脆弱性 のみ自動更新するように設定する( 参考 ) セキュリティアップデート以外を自動化せずに更新する部分については、完全に手作業でコミットハッシュをコピー&ペーストしていくのは大変なので、ローカルツールの pinact などでコミットハッシュを更新するのも良いでしょう。 解決策2:セキュリティアップデート以外は自動更新を一定期間待機する Renovateには、セキュリティアップデート以外の更新をすぐにせずに指定期間待機してからPRを作成する機能があります。一定期間待機することで、その間に攻撃や 脆弱性 が検知・解決されることを期待するという考え方です。 Renovateの場合: minimumReleaseAge パラメータ https://docs.renovatebot.com/configuration-options/#minimumreleaseage Dependabot Version Updatesにも、最近のアップデートで同じような機能がベータ版として出ています。ただし現時点ではまだ GitHub Actionsはサポートされていないようです。使えるようになったら試してみたいと思います。 Dependabotの場合:cooldown パラメータ(今後に期待) https://github.com/dependabot/dependabot-core/issues/3651 (2025/7/10追記)Dependabotのcooldownパラメータが正式リリースされましたので、 解説記事 を公開しました。 自動更新の待機期間をどれぐらいにするべきなのか? これは答えが出ない問題です。 GitHub Actions の action による悪さを「100%」回避するには次のどちらかしかないと思っています。 GitHub Actions の action をそもそも利用しない GitHub の公式 action( actions/checkout など)が侵害されるリスクも考慮し、利用しないとすると、「 GitHub ActionsによるCI/CDを実施しない」こととほぼ同義になると思います GitHub Actions の action のバージョン更新をするときに「コードの内容を全て読み」、「動きを完全に理解」したうえで更新する このどちらも現実的ではないのは明らかです。 GitHub Actions の action を利用することの便利さを享受するには、一定のリスクを受容するしかないと考えています。待機期間の判断も同じです。今回の侵害の件では tj-actions に対する侵害は数日で対応されましたが、 reviewdog に対する侵害の対応には1週間以上かかったようです。どれぐらいの期間を置けば侵害や 脆弱性 が検知され、受容できる程度までリスクが低減するかは程度問題でしかありません。 リポジトリ の重要度と運用の手間で判断することになるでしょう。 それでもあえて個人的な考えを述べるならば、1週間程度は少なくとも待ちたい気持ちがあります。(根拠はなく、ただの個人的な感覚であることを強調しておきます。) お読みいただきありがとうございました。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 執筆: @kou.kinyo 、レビュー: @nakamura.toshihiro ( Shodo で執筆されました )
初めまして。エンタプライズ第一本部の佐藤です。 前回は MCP サーバーの立ち上げ方の記事を作成しましたが、今回はこのサーバーに接続するClientを用いて接続側の実装をするという試みです。 前回記事はこちら 【初心者向け】2年目エンジニアが実践したMCPサーバー構築ガイド2025 既出の内容かつ不正確な部分もあるかもしれませんが、私の個人的な検証記録として残しておきたいという目的でこの記事を作成します。 最近 MCP サーバーが盛り上がってますが、サーバーへ接続する方法も知りたかったので本記事を作成します。 前回の記事では以下の図の赤枠の部分を実装しました。 上側の水色の矢印部分にあたるツール呼び出し部はClaudeDesktopに内包されていたので、前回はこの部分のロジックを意識せずにツールを実行できるかという部分を検証していました。 さて、ClaudeDesktopから呼び出せるのも良いのですが、通信規格を統一したというところの良さを実感しつつ、なぜツールが選択できているのかを詳しく見ていきます。 では、例のごとく MCP QuickStartの For Client Developers を参考にClientの実装を行いましょう。 まずは環境構築です。 上から順に、 作業 ディレクト リの作成 仮想環境を有効化 仮想環境に必要な依存関係を追加 main.pyを削除(client.pyで作業するため) client.pyを作成 という操作をしています。 client.pyが今回、コードを作成する部分です。 # Create project directory uv init mcp-client cd mcp-client # Create virtual environment uv venv # Activate virtual environment # On Windows: .venv\Scripts\activate # On Unix or MacOS: source .venv/bin/activate # Install required packages uv add mcp anthropic python-dotenv # Remove boilerplate files rm main.py # Create our main file touch client.py 次はAnthropicの API キーを取得して.envファイルに書いておきます。 ファイルの作成 # Create .env file touch .env この.envファイルを編集して以下の記述を追加。 your key hereの部分は API キーを記載します。 API キーの取得方法はこちらで、 APIのページ に遷移して、StartBuildingを押下し、GetAPIkeysを選択します。 Create Keyを選択して、任意の名前をつけてAddを押下。 次のポップアップでキーが出るのでコピーしてください。 【注意】この API キーは厳重に保管し、使用しなくなった場合は削除をしてください。流出すると思わぬ課金の原因になります。 ANTHROPIC_API_KEY=<your key here> 次に以下のコマンドで.gitignoreにこのファイルを追加します。 構成管理に含めないことで API キーがリモートレポジトリに保存されないようにします。 echo ".env" >> .gitignore 以上で環境構築は終了です。 次にclient.py内で作業を行っていきます。 import asyncio from typing import Optional from contextlib import AsyncExitStack from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client from anthropic import Anthropic from dotenv import load_dotenv load_dotenv() # load environment variables from .env class MCPClient : def __init__ (self): # Initialize session and client objects self.session: Optional[ClientSession] = None self.exit_stack = AsyncExitStack() self.anthropic = Anthropic() async def connect_to_server (self, server_script_path: str ): """Connect to an MCP server Args: server_script_path: Path to the server script (.py or .js) """ is_python = server_script_path.endswith( '.py' ) is_js = server_script_path.endswith( '.js' ) if not (is_python or is_js): raise ValueError ( "Server script must be a .py or .js file" ) command = "python" if is_python else "node" server_params = StdioServerParameters( command=command, args=[server_script_path], env= None ) stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params)) self.stdio, self.write = stdio_transport self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write)) await self.session.initialize() # List available tools response = await self.session.list_tools() tools = response.tools print ( " \n Connected to server with tools:" , [tool.name for tool in tools]) ここまでがサーバーとの接続を担う部分です。標準入出力を用いるようにしています。 async def process_query (self, query: str ) -> str : """Process a query using Claude and available tools""" messages = [ { "role" : "user" , "content" : query } ] response = await self.session.list_tools() available_tools = [{ "name" : tool.name, "description" : tool.description, "input_schema" : tool.inputSchema } for tool in response.tools] # Initial Claude API call response = self.anthropic.messages.create( model= "claude-3-5-sonnet-20241022" , max_tokens= 1000 , messages=messages, tools=available_tools ) ここまでで入力された質問に関する解析を行っています。 具体的には関数(ツール)の説明文と引数の型の情報をもつ使用可能なツールをLLMに渡しています。 図のようなイメージでツール情報と質問文をLLMに投げちゃってます! # Process response and handle tool calls final_text = [] assistant_message_content = [] for content in response.content: if content.type == 'text' : final_text.append(content.text) assistant_message_content.append(content) elif content.type == 'tool_use' : tool_name = content.name tool_args = content.input # Execute tool call result = await self.session.call_tool(tool_name, tool_args) final_text.append(f "[Calling tool {tool_name} with args {tool_args}]" ) この部分でさっき使えるツール情報と質問文を投げた結果を用いています。 イメージは以下の図で天気の質問なら、天気取得ツールを使った方が良いですねとなっているということです。 ここでresultに使用すべきツールとして”use_tool”フラグがついた関数を呼び出した結果を格納し、LLMに渡すメッセージの一部として格納しています。 assistant_message_content.append(content) messages.append({ "role" : "assistant" , "content" : assistant_message_content }) messages.append({ "role" : "user" , "content" : [ { "type" : "tool_result" , "tool_use_id" : content.id, "content" : result.content } ] }) # Get next response from Claude response = self.anthropic.messages.create( model= "claude-3-5-sonnet-20241022" , max_tokens= 1000 , messages=messages, tools=available_tools ) final_text.append(response.content[ 0 ].text) return " \n " .join(final_text) ここで最初の質問文である「今日の天気は?」と利用した天気取得ツールからのレスポンス「晴れ」を用いて、回答を出力します。 イメージは以下の図の通りです。 ここまでで、LLMへのリク エス トは2回しています。 まとめると、1つのツールを呼びだすにはツールの判定、質問文と結果のセットで回答生成というプロセスを背後で行うということです。 async def chat_loop (self): """Run an interactive chat loop""" print ( " \n MCP Client Started!" ) print ( "Type your queries or 'quit' to exit." ) while True : try : query = input ( " \n Query: " ).strip() if query.lower() == 'quit' : break response = await self.process_query(query) print ( " \n " + response) except Exception as e: print (f " \n Error: {str(e)}" ) async def cleanup (self): """Clean up resources""" await self.exit_stack.aclose() async def main (): if len (sys.argv) < 2 : print ( "Usage: python client.py <path_to_server_script>" ) sys.exit( 1 ) client = MCPClient() try : await client.connect_to_server(sys.argv[ 1 ]) await client.chat_loop() finally : await client.cleanup() if __name__ == "__main__" : import sys asyncio.run(main()) 最後に、先ほどの回答生成プロセスの実体であるprocess_query関数で回答を生成するようにしています。 これでサーバーを起動する側の準備が整いました。 前回の続きでサーバーを立てていればweather.pyが利用できるはずなので、こちらを指定してclient.pyでweather.pyを起動します。 #pathは自分の環境に設定してください uv run client.py path/to/weather.py このコマンドを実行すると、以下のようにコンソールでLLMを使用でき、 MCP サーバーにも接続できています。 実際に使用可能なツールとして、add、get_alerts、get_forecastの3つが表示されました。 Queryの後に「 サクラメント の天気は?」のように適当な指示文を渡すと回答が生成されます。 この検証を応用してインタフェースを変えることもできそうですね! 以上で作業を終わります。 ここまで読んでくださり、ありがとうございました! 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @sato.yu 、レビュー: @nakamura.toshihiro ( Shodo で執筆されました )
はじめに 初めまして。 エンタープライズ 第一本部、2年目の佐藤悠です。 Datadogは様々な環境でのモニタリングが可能で、監視対象の統合に向いておりオンプレミスと クラウド 環境のハイブリッドの場合や複数 クラウド の組み合わせなど、インテグレーションの多様さで柔軟に対応できるのが強みであると思います。 個人的には使いやすくて、デザインが好きなので気に入っています。 この記事ではAmazonLinuxのマシンイメージを使用したEC2 インスタンス のメトリクスを、手順のスクショや図解をもとに ダッシュ ボードに表示するところまで実施します。 作業手順 無料トライアルを開始します。 以下のサイトにアクセスし、画面中央にある無料トライアルボタンを押下します。 https://www.datadoghq.com/ 以下の画面で必要事項の入力が求められるので、これを埋めます。 一応、リージョンが日本になっていることを確認してください。 入力後サインアップのボタンを押下することで以下のアンケートの画面に遷移します。 全て任意の内容なので実施はお任せします。画面下部までスクロールしNextのボタンを押下します。 遷移先では以下の画面になります。 今回は AWS 上のマシンイメージがAmazonLinuxのEC2 インスタンス を立ち上げて監視対象にします。 左側の Linux を選択して、コマンドをコピーしておきます。 では、 AWS でEC2を立ち上げます。 今回はコマンドをEC2上で実行する必要があるので、セッションマネージャー(以降:SSM)でEC2に接続する設定も同時に行います。 インスタンス 名などは任意のものを使用しますが、OSに関しては指定します。 インスタンス タイプもデモなので最も小さいサイズのものにしています。 ネットワーク設定はSSMを使用するため、アウトバウンドの443ポートを許可しています。 Datadogの ネットワークトラフィック の資料を参考にするとAgentを使用する ユースケース に限定すれば、アウトバウンドの443ポートの解放のみで動作します。 ネットワーク設定に関する詳細はリンク先の資料をご確認ください。 次に、以下の部分の高度な設定を編集して、SSMに必要なロールを持つ インスタンス プロファイルをアタッチします。 ない場合には赤枠の部分から作成します。 遷移先の画面でロールの作成を押下して以下の画面に遷移します。 ラジオボタン で ユースケース を選択して、System Manager用のロールを作成出来ればOKです。 ここで任意のロール名をつけて先ほどのEC2 インスタンス の画面で インスタンス プロフィールに作成したものを選択すれば、準備完了です。 プロフィールが表示されない場合は少し時間をあけてリロードボタンを押下すれば出ます。 インスタンス が立ち上がったことを確認し、作成した インスタンス IDを押下し、 インスタンス 概要の画面で右上の接続ボタンを押下します。 タブの切り替えでセッションマネージャーを選択し、接続を押下します。 (接続ボタンがグレーになっているときは、ネットワークの設定、ロール、またはポリシーの設定ができていない場合が多いです) インスタンス に接続後は CUI の画面で先ほどのDatadogで表示されていたコマンドを実行します。 このままコピー&ペーストして実行でOKです。 これでDatadogのエージェントがEC2 インスタンス にインストールできました。 現時点での構成を図にして解説します。 今回はデモなので図のような構成になっています。 実際にはEC2をプライベートサブネットに配置し、NAT ゲートウェイ を使用して外部と通信するのが望ましいですが、コストの関係で実施していません。 では、Datadog画面左下のIntegrationsにカーソルを合わせ赤枠のView Agentsを押下して実際にデータが取得できているかを確認しましょう。 遷移先でView Agentsを選択し表示を見ると以下のとおりでAgentをインストールしたEC2 インスタンス がDataDogと接続できていることが確認できました。 以下の画像で考えると インスタンス IDがHOSTNAMEと一致しているかで確認できます。 次に画面左側のツールの赤枠、Infrastructureを押下します。 ここで遷移した先に、監視対象のEC2 インスタンス が表示されています。 右赤枠のどこでもいいので押下すると詳細な表示を確認することができます。 表示される インスタンス に関する詳しいメトリクスは以下のようになっています。 ここで取得した内容を ダッシュ ボードに表示します。 これは環境ごとの ダッシュ ボードを作成し、一元管理することによって見通しが良くなることが期待できます。 以下の画像のように、開発・ STG ・PRODのように分離することが実際の運用ではありそうですね。 では実際に作成します。 左側ツール赤枠にカーソルを合わせNew Dashboard を押下します。 以下の表示で名前と Dashboard の概観を決定します。 以下の画面に遷移したら右側上赤枠の検索窓でHOSTと検索し、右下赤枠のHosts Overviewを押下します。 以下の画面で左側赤枠のPowerpack filtersで先ほどのhostを選択します。 右下のconfirmを押下して Dashboard の ウィジェット に追加します。 画面のようにモニタリング内容を Dashboard に追加することができました。 モニタリングしているCPUの使用率を高めて、画面に反映されるか確認します。 EC2 インスタンス に接続して以下のコマンドを実行します。 sudo yum install stress stress -c 1 CPUに負荷をかけるstressをインストールして、実際にCPUに負荷をかけます。 この結果がすぐにモニターに反映されUsageが上昇しました。 これでEC2 AmazonLinuxを監視し、選択した内容を ダッシュ ボードに追加することができましたね! まとめ 複雑化し続ける クラウド アーキテクチャ ーをDatadogで一元管理! 14日間はホスト数に制限はありますが、全ての機能が無料で使えます。 以降は機能に制限はかかりますが検証用には使えるのでありがたいですね! 無料期間のスタート ダッシュ に本記事を参考にしていただければ幸いです。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @sato.yu 、レビュー: @yamada.y ( Shodo で執筆されました )
こんにちは。金融IT本部 経営管理 ソリューション部の藤樫です。 現在、金融機関への ERP パッケージの新規導入案件に携わっています。 私は2023年10月に 電通 総研(旧ISID)へ中途入社し、ちょうど1年半が経過しました。 今回は転職の経緯や入社して感じたことをお話したいと思います。 転職活動について 前職はユーザー系 SIer 企業で、 ERP の保守を担当していました。 IT系の業界や仕事が好きで、転職後も ERP を用いた システム開発 に携わりたい、という想いがあったため 同業で ERP を扱っている募集に絞り、転職活動を開始しました。 初めて面接を受けた企業が 電通 総研だったのですが、面接が対話形式で進んだのが驚きでした。 (もっとお堅い場を想像していました) 人事の方をはじめ、現場の方から役職の方までとてもフランクに接してくださり ユーモアを交えながら進めてくださったのが好印象でした。 入社の決め手 社員の皆さんの人柄が1番の決め手となりました。 また面接で経歴だけでなく、人となりまで見た上で選考していただいたこと、 内定承諾前にカジュアル面談をしていただき、最後までフォローが手厚かったことも良かった点でした。 選考の過程で、 電通 総研の皆さんと一緒に働きたいという想いが強くなり、 電通 総研への入社を決めました。 入社前に不安だったこと ①業界の違い 学生時代は情報系の専攻で、前職は電力業界であったため、金融業界は初めてでした。 そのため業界知識のキャッチアップから始める必要がありました。 ②製品の違い 前職はSAPを扱っており、今扱っている Oracle ERP Cloudは初めてでした。 同じ ERP でも製品が違うと思想や仕組みが全く異なるため、これもまた0からの勉強が必要であり ちゃんと貢献できるようになるのか不安を感じていました。 ③職種の違い 前職では親会社の保守業務を担当していたため、新規導入案件には携わったことがありませんでした。 システム開発 のフローは机上の知識しかなく、実務は経験がないため、前述の①②に加え さらに不安となる要素の1つでした。 入社後のギャップ 選考中のフォローがかなり手厚かったため、ギャップはほとんどありませんでした。 前述の入社前の不安事項も、部の皆さんのサポートのおかげで、徐々に解消されました。 1つ挙げるとすれば、“働きやすさ”です。 これはいい意味でのギャップなのですが、想像以上に働きやすい環境であると感じています。 詳細は後述の「現在の働き方」でお話します。 入社前後における環境の変化 転職を機に初めて上京したため、職場だけでなく、居住環境も大きく変わりました。 住むエリアを決める際、入社前にも関わらず、部の皆さんがアド バイス してくださったおかげで 通勤時間や住みやすさを考慮した、納得のいく部屋に住むことができ、無事東京生活をスタートすることができました。 また勤務スタイルにも変化がありました。前職は全員が同じ拠点に出社し毎日顔を合わせて働いていましたが、 現在は、各自が 臨機応変 に出社勤務と在宅勤務を選択できます。 またお客様先への移動の前後などは、サテライトシェアオフィスでの勤務も認められています。 働きやすい反面、顔を合わせる機会が少ないため、最初は部や仕事に馴染めるのかとても不安でした。 ただ入社後も、部員全員との1on1や、全員と対面できるようランチ会を複数回企画していただく等 コミュニケーションを取りやすくするための、様々な工夫をしていただきました。 そのため環境には割と早い段階で慣れることができたと感じています。 会社や事業部でも、中途入社者・女性社員・若手社員の座談会があったりと コミュニティが多数あるため、中途入社でも人脈を広げやすい環境かと思います。 現在の働き方 普段は、基本的に案件業務を行っており、これまで要件定義~テスト工程まで携わってきました。 具体的には、お客様との仕様の合意形成や設計業務・開発チームの取りまとめ等を実施しています。 特に、ユーザーと直接やり取りできるポジションに憧れていたので、 電通 総研に入社して 希望の業務に従事することができ、やりがいや充実感を持って仕事ができています。 案件以外では、このような記事の執筆作業だったり、新人の OJT ・中途入社者のフォロー等を行っています。 勤務場所は、前述の通り選択肢が幅広く、自宅・ サテライトオフィス ・お客様先等、 仕事内容や体調に合わせて柔軟に選択可能で、メリハリをつけて働くことができています。 長期休暇のタイミングでは、ワーケーション勤務制度を活用し、地方にある実家からリモートワークをすることもあります。 忙しい時でも公私ともに充実させることができるため、とても働きやすい環境であると感じています。 デスクワークで 疲労 が溜まった時には、社内のマッサージルームを利用し、凝りの解消や息抜きをしています。 (社員価格で格安なので、すごくオススメです) またプライベートの話になりますが、ディズニーが好きなので グッズを買ったりパークへ行ったりすることを楽しみに、日々励んでいます。 最後に ここまで読んでいただきありがとうございました! 電通 総研では、新卒・キャリア採用問わず共に働いてくれる仲間を募集しています。 私の所属する部は、中途社員と新卒社員が半々で、女性も半数近くいます。 また経験値や年次に関わらず、やりたいことが実現できる環境が整っています。 もし 電通 総研にご興味があれば、応募をご検討いただければと思います! 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @togashi.ayana 、レビュー: @miyazawa.hibiki ( Shodo で執筆されました )
こんにちは、クロス イノベーション 本部エンジニアリングテク ノロ ジー センターの小澤英泰です。 本記事では GitHub Codespacesを活用する中で学んだ、複数のDev Containerの設定がある リポジトリ において、起動するDev Containerを指定する方法を紹介します。 はじめに 複数のDev Containerの設定方法 ローカルマシンでのDev Containerの起動 GitHub CodespacesでのDev Containerの起動 Default Codespaces configration とは? 問題 解決策1 解決策2 さいごに はじめに 前提知識となるDev Containerや GitHub Codespacesの概要は本記事では省略します。 適宜、過去に弊社社員が発表の記事や動画を参照してください。 テックブログ:GitHub Codespace を使った開発環境のメリットをまとめてみた TECH PLAY の記事:開発効率向上・フレキシブルな働き方・セキュリティの確保──ストレスフリーな開発体験を「GitHub Codespaces」で実現するポイント解説 TECH PLAY のアーカイブ動画:開発効率向上も、フレキシブルな働き方も、セキュリティの確保も、GitHub Codespacesで実現!-ストレスフリーな開発体験のカギ- 複数のDev Containerの設定方法 複数のDev Containerを設定するには、 リポジトリ の .devcontainer 配下はどのような ディレクト リ構成になるでしょうか。 例えば、 VSCode のドキュメント Connect to multiple containers では、下記の構成を採っています。 📁 project-root 📁 .git 📁 .devcontainer 📁 python-container 📄 devcontainer.json 📁 node-container 📄 devcontainer.json 📁 python-src 📄 hello.py 📁 node-src 📄 hello.js 📄 docker-compose.yml .devcontainer 配下に設定ごとの ディレクト リ python-container と node-container を作成し devcontainer.json を置いています。 上記の構成にならって、複数のDev Containerの設定をしました。 . ├── .devcontainer ├── DevContainerA │ └── devcontainer.json └── DevContainerB └── devcontainer.json .devcontainer/DevContainerA/devcontainer.json の中身 { " name ": " DevContainerA ", " image ": " mcr.microsoft.com/devcontainers/base:ubuntu " } .devcontainer/DevContainerB/devcontainer.json の中身 { " name ": " DevContainerB ", " image ": " mcr.microsoft.com/devcontainers/base:ubuntu " } それではローカルマシンと GitHub Codespaces上の2つのパターンでDev Containerの起動方法を確認しましょう。 ローカルマシンでのDev Containerの起動 ローカルマシンでのDev Containerの起動手順を確認します。 VSCode の コンテナーで再度開く を選択すると、設定したDev Containerの一覧が表示され、起動対象のDev Containerを選べます。 GitHub CodespacesでのDev Containerの起動 GitHub CodespacesでのDev Containerの起動手順を確認します。 VSCode の Create New Codespace... を選択後、起動対象のブランチを選択すると、Dev Containerの一覧が表示されます。 ローカルマシンの場合と異なり、 GitHub Codespacesの場合は、一番上に Default Codespaces configration が表示されています。Default Codespaces configrationとは、一体何者なのでしょうか。 Default Codespaces configration とは? Default Codespaces configration を日本語では 既定の開発コンテナー構成 と呼びます。 既定の開発コンテナー構成とは、 GitHub が用意したDev Containerです。下記の特徴があります。 GitHub によって既定の Linux イメージからコンテナーが作成されます。 この Linux イメージには、 Python 、Node、 PHP 、 Java 、Go、 C++ 、 Ruby 、.NET Core/ C# などの一般的な言語のランタイム バージョンが多数含まれています。 これらの言語の最新または LTS リリースが使用されます。 JupyterLab や Conda など、データ サイエンスと 機械学習 をサポートするツールもあります。 既定の開発コンテナー イメージには、Git、 GitHub CLI 、yarn、openssh、 vim などの他の開発者ツールやユーティリティも含まれています。 詳細は 既定の開発コンテナー構成の使用 を参照してください。 また、Default Codespaces configrationが表示されるのは、 .devcontainer 直下に devcontainer.json がない場合の GitHub の仕様です。 .devcontainer/devcontainer. json または .devcontainer. json が存在する場合は、codespace を作成するときに使用可能な構成ファイルの一覧でそれが既定の選択になります。 どちらのファイルも存在しない場合は、既定の開発コンテナー構成が既定で選択されます。 詳細は codespace の作成時における既定の構成の選択 を参照してください。 問題 VSCode から GitHub Codespacesを起動する場合はDev Containerの一覧が表示され起動対象のDev Containerを選べるため、一見問題はなさそうです。しかし、ブラウザの github .comから GitHub Codespacesを起動する場合に注意が必要です。 リポジトリ を開き Code をクリックし Codespacesタブ を開きます。 + ボタン または Create codespace on main をクリックすると、自動で既定の開発コンテナー構成で起動します。 起動対象のDev Containerを選ぶことはできません。 起動対象のDev Containerを選ぶには、 ・・・ ボタン から New with options... をクリックします。遷移先の画面で他のオプションも含め選択することができます。 毎回、 New with options... から起動するのは面倒です。油断して + ボタン または Create codespace on main から起動し、 npm run dev などのコマンド実行の失敗後にミスに気づき残念な気持ちにもなります。再作成には時間も費用もかかるので改善しましょう。 解決策1 ディレクト リの構成を変更します。 DevContainerA 配下の devcontainer.json を .devcontainer 直下に移動することでデフォルトのDev ContaienerをDevContainerAの設定とすることができます。 変更前の構成 . ├── .devcontainer ├── DevContainerA │ └── devcontainer.json └── DevContainerB └── devcontainer.json 変更後の構成 . ├── .devcontainer │ ├── DevContainerB │ │ └── devcontainer.json │ └── devcontainer.json 変更後はDefault Codespaces configrationが消え、デフォルトでDevContainerAが選択されます。 VSCode から起動する場合もDefault Codespaces configrationが消えています。 なお、 ディレクト リ構成を変更してもローカルマシンでのDev Containerの起動方法に影響はありません。 解決策2 ディレクト リ構成を変えない場合は、READMEに GitHub Codespaces 作成ページへのリンクを置くことで問題を回避できます。設定するURLは Share a deep link から確認できます。 Markdown タブを開くと、READMEに埋め込む値をコピーできます。 [](https://codespaces.new/Hideyasu-Ozawa/multi-dev-container) 上記コピーした値をREADMEに貼り付けると、バッジが表示されます。 バッチをクリックするとオプションを選択する画面に飛びます。 各オプションの値もクエリパラメータを変更することで簡単にカスタマイズできます。バッチに設定したURLを下記に変更します。 https://github.com/codespaces/new/Hideyasu-Ozawa/multi-dev-container?skip_quickstart=true&machine=standardLinux32gb&repo=934587189&ref=branchName&devcontainer_path=.devcontainer%2FDevContainerB%2Fdevcontainer.json&geo=UsEast) バッチをクリックすると、ブランチにbranchName、Dev ContainerにDevContainerB、RegionにUS East、Machine typeに4-coreを設定した状態で開きます。 READMEに配置したバッチから GitHub Codespacesを作成することで、Dev Containerに既定の開発コンテナー構成を使うミスを回避できるようになりました。 さいごに 本記事では、複数のDev Containerの設定がある リポジトリ において、 GitHub Codespacesで起動するDev Containerを指定する方法を紹介しました。 ローカルマシンと GitHub CodespacesでDev Containerを起動する際の仕様が異なることには注意が要りますが、解決策1の ディレクト リ構成を変更しつつ、解決策2のREADMEにリンクを置くことで、 GitHub Codespacesの起動時の体験をより良くすることができました。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @ozawa.hideyasu 、レビュー: Ishizawa Kento (@kent) ( Shodo で執筆されました )
こんにちは。 エンタープライズ 第一本部 戦略ソリューション 1 部の英です。 普段はWebアプリや スマホ アプリの案件などを担当しています。あと、趣味でAIを勉強しています。 OpenAIから新しいCodexが発表されたのでさっそく遊んでみます。 https://help.openai.com/en/articles/11096431-openai-codex-cli-getting-started 1.環境構築 2.インストール 3.デモアプリを作る 4.デモアプリで遊んでみる 5.デモアプリで遊んでみる(再) 6.デザインを整える 7.テストコードを書かせてみる 8.テストコードを追加してみる さいごに 1.環境構築 詳細は割愛しますが、手元で以下を行ってください。 筆者の環境は Windows です。 VSCode のインストール Node.jsのインストール(npmにパスを通す) API キーを発行する(OpenAIのDeveloperページで作成できる) 2.インストール VSCode で新規のターミナルを開き、以下を実行します。 npm実行の際に、権限系で止められたら各自で追加してください。 npm install -g @openai/codex 次に以下を実行します。 codex これで動かせます。早い。 3.デモアプリを作る さて、さっそくアプリを作ってみましょう。 そうですね。 「愚痴を吐いたらAIが励ましてくれるようなサービス」なんてどうでしょうか。 ア イデア の引き出しで放置していたのですが、ここで消費してみようと思います。 Codexに以下のプロンプトを送信してみます。 Node.js + Express を使って、愚痴を投稿すると複数の仮想キャラクター(陽キャ・理系・スパルタ・癒し系)が ChatGPT API を使って日本語で励ましのコメントを返してくれるWebアプリを作ってください。UIはEJSで構築し、すべて日本語表示にしてください。 ChatGPTのAPIキーはenvファイルにセットする仕組みとしましょう。 モデルはgpt-4o-miniなんてどうでしょう? 思考が始まりました。かわいいですね。 mkdirのコマンドを叩きたいと要求してきました。許可してみます。 実行できなくて困ってますね。かわいいですね。 すごい手前で躓いているので情報を足してみます。 package. json を作成していいかと聞かれました。「Y」で肯定しておきます。 ファイルが作られました。 次はnode_modulesの ディレクト リとenvファイルの作成を提案してきました。「Y」で肯定しておきます。 READMEの作成を提案してきました。「Y」で肯定しておきます。 やっと中身のコーディングに入りました。index.jsの提案が来ました。「Y」で肯定しておきます。 このペースでスクショを載せていると長くなりそうなので、CodeXが考えに詰まるまでスキップしますね。 4.デモアプリで遊んでみる Yを10回くらい押したらアプリができたようです。 以下は最後の出力で、このアプリの実行方法を教えてくれています。手順に従ってみます。 エラーを吐きました。もう一度Codexを開いて、この事実を伝えます。(全文コピペでOK) デバッグ 方法を考え始めました。しばらく提案を受けましょう。 「Y」を5回くらい叩くと、バグ修正が終わったみたいです。 5.デモアプリで遊んでみる(再) 再度実行するとうまく起動しました。 さっそく localhost にアクセスしてみます。 気になっていたのですが、 CSS は書いていない(そもそも命令していない)ので単純なHTMLが表示されています。 上手くいきました。 急に4人から励まされるとびっくりしますね。 ちなみに、ChatGPT API へのプロンプトは以下のように設計されていました。 const personas = [ { key: 'yo', name: '陽キャ', system: 'あなたは陽キャのキャラクターです。明るく元気な言葉でユーザーを励ましてください。' }, { key: 'rikei', name: '理系', system: 'あなたは理系のキャラクターです。論理的で落ち着いた言葉でユーザーを励ましてください。' }, { key: 'sparta', name: 'スパルタ', system: 'あなたはスパルタのキャラクターです。厳しくも的確な言葉でユーザーを励ましてください。' }, { key: 'iyashi', name: '癒し系', system: 'あなたは癒し系のキャラクターです。優しく温かい言葉でユーザーを励ましてください。' }, ]; 6.デザインを整える シンプルなHTMLだとちょっとダサすぎるので、いまっぽいデザインに書き換えてみましょう。 デザイン修正だけなのに「Y」を10回くらい叩かされました。 以下に理由を書いていますが、CodeXに文脈を伝えるのが少し面倒でした。 この辺は GitHub Copilotの方が操作性は高いと感じます。 7.テストコードを書かせてみる 自動生成の ソースコード はテストコードとセットで作成するべきだと個人的には考えています。 今回もテストコードを書かせてみます。 先ほどの CSS の作成の時もそうでしたが、CodeXが現状を把握をするのにすごく時間がかかります。 以下のプロンプトはかなり有効だったのでお試しあれ。 テストコードが提案されました。 テストに実行方法も記載してくれているので実行してみます。 コケました。 Codexに伝えて、原因を探ります。 修正が完了したため、再テストしてみます。 GETとPOSTの2本のテストに通過しました。 8.テストコードを追加してみる テストコードが少なすぎるので、Codexに愚痴をこぼします。 愚痴をこぼしたあとのページの確認がテストコードに追加されました。 submitのPOSTも含めてテストに通過しました。めでたしめでたし。 さいごに さて、今回はCodexの検証を行いましたが、コンテキストの渡し方以外は特に不便な点はありませんでした。 反省点としては、スタート地点でデザインについても言及するべきだったな・・・、と。 今回の検証でかかったコストは$2~$3くらいでした。 無駄なキャッチボールが多かったので、初期のプロンプトを最適化すればもっと安く済むと思います。 これからも AWS やAI関連の検証記事をたくさん書いていきます。 ↓ のスターを押していただけると嬉しいです。励みになります。 最後まで読んでいただき、ありがとうございました。 エンタープライズ 第一本部では一緒に働いてくださる仲間を募集中です。以下のリンクからお願いします。 私たちは一緒に働いてくれる仲間を募集しています! 中途採用-エンタープライズ第一本部 新卒採用-エンタープライズ第一本部 執筆: 英 良治 (@hanabusa.ryoji) 、レビュー: @nakamura.toshihiro ( Shodo で執筆されました )
初めまして。 エンタープライズ 第一本部、2年目の佐藤悠です。 最近話題の MCP サーバーを構築して、外部情報との連携をするという挑戦をします。 既出の内容かつ不正確な部分もあるかもしれませんが、私の個人的な検証記録として残しておきたいという目的でこの記事を作成します。 想定読者はジュニアレベルのエンジニアが MCP サーバーとは何か?どのように構築するか?を実例と共に知りたいという際に読むのがちょうど良いと思っています。 目次 MCPとは? アーキテクチャ概要 テスト実行 追加の検証 まとめ 参考文献 MCP とは? 提供元のAnthropicにおける説明[ 1 ]は以下の通りです。 The Model Context Protocol is an open standard that enables developers to build secure, two-way connections between their data sources and AI-powered tools. 私の理解ではAI Agentが外部情報を取得する際の接続部の話だと思っています。 つまりは、 MCP サーバーを用いることでAI Agentと外部データリソース間での安全なコネクタの規格整備をしたということです。 統一規格が提供されているのでAI Agentに手軽に機能を載せたり、精度を向上させたりできるようになり、 MCP を中心にエコシステムが盛り上がりを見せているという現状の分析をしています。 2025年3月27日にはChatGPTのAgent SDK にも MCP をサポートするといったような旨の発表がありました。 このように異なるAI Agentで様々なデータソースを利用できるようになると、自由度や拡張性が高まりAI Agentの発展につながると感じますし、この潮流に乗りたいとも感じさせます。 以上が MCP の概観で、本記事を作成するモチベーションです。 アーキテクチャ 概要 本記事では、はじめに公式が提供しているQuickStart[ 2 ]と全く同じ構成でサーバーを作成してみました。 簡単な構成図は以下のとおりです。 ClaudeDesktopのインストールとサインインをあらかじめしておきます。 このアプリから MCP サーバーにアクセスし、天気の情報を取得するような構成です。 具体的には以下のツールを MCP サーバーに配置します。 get-alerts 指定された地域で現在出ている警報を取得する get-forecast 指定された地点の天気予報を取得する 私の環境は Windows なので、参考資料のその手順に従い実行したコマンドを載せています。 以下のコマンドを PowerShell で実行します。 uvをインストールし、 Python プロジェクトを用意します。 powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 次に作業 ディレクト リを作成し、移動。 仮想環境を作成して依存関係をインストール。 最後に Python のファイルを作成するコマンドを実行します。 # Create a new directory for our project uv init weather cd weather # Create virtual environment and activate it uv venv .venv\Scripts\activate # Install dependencies uv add mcp[cli] httpx # Create our server file new-item weather.py 以降の作業は、ここで作成したweather.pyを編集します。 ファイルの先頭に以下のコードを追加。 from typing import Any import httpx from mcp.server.fastmcp import FastMCP # Initialize FastMCP server mcp = FastMCP( "weather" ) # Constants NWS_API_BASE = "https://api.weather.gov" USER_AGENT = "weather-app/1.0" The FastMCP class uses Python type hints and docstrings to automatically generate tool definitions, making it easy to create and maintain MCP tools. ここの注釈にPyhtonの型ヒントとドキュメントで、このツールを定義しますとあります。 この部分の理解は実装後にできました。最後に解説します。 次に外部情報を取得する部分を実装しています。 #これがリクエスト処理 async def make_nws_request (url: str ) -> dict [ str , Any] | None : """Make a request to the NWS API with proper error handling.""" headers = { "User-Agent" : USER_AGENT, "Accept" : "application/geo+json" } async with httpx.AsyncClient() as client: try : response = await client.get(url, headers=headers, timeout= 30.0 ) response.raise_for_status() return response.json() except Exception : return None #これがフォーマッタ def format_alert (feature: dict ) -> str : """Format an alert feature into a readable string.""" props = feature[ "properties" ] return f """ Event: {props.get('event', 'Unknown')} Area: {props.get('areaDesc', 'Unknown')} Severity: {props.get('severity', 'Unknown')} Description: {props.get('description', 'No description available')} Instructions: {props.get('instruction', 'No specific instructions provided')} """ これは以下のツール内の処理で外部に情報を取得しにいく際と取得したデータ整形に使用しています。 get_alertsはUS state codeを期待しています。 これをURLのパスに加えることで、その地域の情報を API で取得できるという寸法です。 get_forecastも緯度・経度で同様の処理をリク エス トしていますね。 @ mcp.tool () async def get_alerts (state: str ) -> str : """Get weather alerts for a US state. Args: state: Two-letter US state code (e.g. CA, NY) """ url = f "{NWS_API_BASE}/alerts/active/area/{state}" data = await make_nws_request(url) if not data or "features" not in data: return "Unable to fetch alerts or no alerts found." if not data[ "features" ]: return "No active alerts for this state." alerts = [format_alert(feature) for feature in data[ "features" ]] return " \n --- \n " .join(alerts) @ mcp.tool () async def get_forecast (latitude: float , longitude: float ) -> str : """Get weather forecast for a location. Args: latitude: Latitude of the location longitude: Longitude of the location """ # First get the forecast grid endpoint points_url = f "{NWS_API_BASE}/points/{latitude},{longitude}" points_data = await make_nws_request(points_url) if not points_data: return "Unable to fetch forecast data for this location." # Get the forecast URL from the points response forecast_url = points_data[ "properties" ][ "forecast" ] forecast_data = await make_nws_request(forecast_url) if not forecast_data: return "Unable to fetch detailed forecast." # Format the periods into a readable forecast periods = forecast_data[ "properties" ][ "periods" ] forecasts = [] for period in periods[: 5 ]: # Only show next 5 periods forecast = f """ {period['name']}: Temperature: {period['temperature']}°{period['temperatureUnit']} Wind: {period['windSpeed']} {period['windDirection']} Forecast: {period['detailedForecast']} """ forecasts.append(forecast) return " \n --- \n " .join(forecasts) 最後にサーバーの初期化と実行を記述します。 この部分の意味は直接 スクリプト が実行された際に、標準入出力を通信手段に使うという意味です。 if __name__ == "__main__" : # Initialize and run the server mcp.run(transport= 'stdio' ) これで MCP サーバーの準備は終わりました。 次にClaudeがこのサーバーにアクセスできるようにします。 code $env:AppData\Claude\claude_desktop_config.json 以上のコードを PowerShell で実行します。これは単純にClaude Desktopの設定ファイルを書くために VScode を開くだけのものです。 開いたら以下の設定を記述。 { "mcpServers" : { "weather" : { "command" : "uv" , "args" : [ "--directory" , //ここは実際のweather.pyまでの絶対パスを記述する "/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather" , "run" , "weather.py" ] } } } さっきまで編集していたweather.pyを実行するようにClaude側に指示しています。 これで標準入出力を待つサーバーが立ち、回答のための情報をどのツールで取得するかを選ぶ準備がClaudeでもできました。 それではテストです! テスト実行 以下の画像の赤丸で囲った部分のハンマーアイコンが MCP サーバーに配置されたツールの数を示しています。 手順に沿っていれば2個のはずです。私は追加したので3の表示です。 私は実装直後はここで変更が反映されていませんでした。 以下のスクショのように、一度左上のメニューからファイル→終了(または表示→再読み込み)で戻ってくると反映されていました。 またメニューから開発者の機能を有効にすると MCP サーバーのログを見ることができるようになります。 他の原因で動作しなかった場合は、このログを参考に修正を加えると良いと思います。 反映されたら、ハンマーアイコンをクリックすると使用できるツールが表示されます。 では、ようやくですが参考資料に従って以下のプロンプトでテストを実行します。 What’s the weather in Sacramento? What are the active weather alerts in Texas? まずは一つ目。日本語でも指示が可能かも含めて検証しました。 What’s the weather in Sacramento? ツールを使用していいかの許可を聞くポップアップが出ます。 おお!無事 サクラメント の天気を取得できました。 次に二つ目。ちゃんと英語でも検証します。 What are the active weather alerts in Texas? 同様にツール実行のポップアップが出て、回答が生成されました。 何気なく使用していますが、ツールの引数に緯度・経度/US state codeを求めているのに回答生成できるの凄いですね!LLMが情報補完をしているのでしょう。 追加の検証 さらにツールを作ってみる実験をしました。 コードは以下のとおりです。 @ mcp.tool () def add (a: int ,b: int ) -> int : """例の処理といえばこれです. 引数: 数字:文章中の二つの数字 """ return a + b 今までの書き方を参考に、処理を追加しました! 「例の処理」のように背景情報が必要なものはLLMは通常回答できません。 このツールの追加で足し算が実行出来たら、追加の検証は成功です。 出来ました!足し算はLLMでも回答できますが、「例の処理」の理解はできないですからね! ちゃんとツール実行許可のポップアップも出現しました。 ここの注釈にPyhtonの型ヒントとドキュメントで、このツールを定義しますとあります。 この部分の理解は実装後にできました。最後に解説します。 最後に追加実装部分を例に上記の内容を解説します。 関数宣言の後に以下のテキストを追加していますね。 """例の処理といえばこれです. 引数: 数字:文章中の二つの数字 """ ここでしか、「例の処理」は記述していません。 つまり、関数の説明をテキストですれば、ツールを選択可能な状態にできるということですね。 型ヒントの部分も def add(a:int,b:int) -> int: のように記述することで、図中のプロンプトの後半、意味不明な数値の並び 例の処理を頼む 10 20 を解釈できていそうです。 検証は以上です。 まとめ MCP がなぜ盛り上がっているのかを実装してみて理解しました。 今のうちに詳しくなっておきたいですね! 参考文献 [1] https://www.anthropic.com/news/model-context-protocol [2] https://modelcontextprotocol.io/quickstart/server#installing-prerequisites-macos 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @sato.yu 、レビュー: @miyazawa.hibiki ( Shodo で執筆されました )
こんにちは。クロス イノベーション 本部 クラウド イノベーション センターの柴田です。 re:Invent 2024 で Amazon EKS Auto Mode の一般提供が発表されました。この記事では Auto Mode を利用する際に気をつけるべきことをご紹介します。 ℹ️ この記事の内容は 2025 年 2 月 22 日時点のものです。最新の情報は Amazon EKS の公式ドキュメント をご参照ください。 Amazon EKS Auto Mode とは Amazon EBS CSI driver OSS 版との主な違い OSS 版と併用できる OSS 版からリソースを移行できない Auto Mode のノード以外では利用できない Amazon VPC CNI plugin OSS 版との主な違い AWS Load Balancer Controller OSS 版との主な違い 設定項目が異なる OSS 版と併用できる OSS 版からリソースを移行できない .spec.loadBalancerClass のデフォルト値が eks.amazonaws.com/nlb になる 補足:Service, Ingress がどの controller によって処理されるか Service Ingress Karpenter OSS 版との主な違い 設定項目が異なる ノードの AMI は AWS によって管理される ノードは起動から最長 21 日経過すると終了する Pod からノードのインスタンスメタデータやインスタンスプロファイルを利用できない その他 他のコンピュートリソースと併用できる 組込みの NodeClass, NodePool は編集できない コスト 終わりに 参考資料 Amazon EKS Auto Mode とは Amazon EKS Auto Mode では以下のアドオンに相当する機能がマネージドサービスとして提供されます。 Amazon EBS CSI driver Amazon VPC CNI plugin AWS Load Balancer Controller CoreDNS Karpenter kube-proxy EKS Pod Identity Agent これにより クラスタ 管理者はこれらのアドオンの保守・運用から開放されます。 ℹ️ この記事では各アドオンの解説はしません。各アドオンの詳細はそれぞれの公式ドキュメントをご参照ください。 Amazon EBS CSI driver OSS 版との主な違い Auto Mode は Amazon EBS CSI driver と以下の違いがあります。 1 The block storage capability of EKS Auto Mode is different from the EBS CSI Driver. Static Provisioning If you want to use externally-created EBS volumes with EKS Auto Mode, you need to manually add an AWS tag with the key eks:eks-cluster-name and the value of the cluster name. Node Startup Taint You cannot use the node startup taint feature to prevent pod scheduling before storage capability readiness Custom Tags on Dynamically Provisioned Volumes You cannot use the extra-tag CLI flag to configure custom tags on dynamically provisioned EBS volumes You can use StorageClass tagging to add custom tags. EKS Auto Mode will add tags to the associated AWS resources. You will need to update the Cluster IAM Role for custom tags. For more information, see Custom AWS tags for EKS Auto resources. EBS Detailed Performance Metrics You cannot access Prometheus metrics for EBS detailed performance OSS 版と併用できる Auto Mode と Amazon EBS CSI driver は併用できます。 OSS 版からリソースを移行できない 既存の PersistentVolume の管理を Amazon EBS CSI driver から Auto Mode へ移行できません。 Auto Mode のノード以外では利用できない Auto Mode が管理する PersistentVolume を利用するためにはノードで Auto Mode の CSI driver の node plugin が動いている必要があります。そのため該当する PersistentVolume を利用する Pod は Auto Mode のノードで実行する必要があります。 同様に Amazon EBS CSI driver が管理する PersistentVolume を利用するためにはノードで Amazon EBS CSI driver の node plugin が動いている必要があります。 Amazon EBS CSI driver の node plugin の DaemonSet は Auto Mode のノードでは実行されません。そのため該当の PersistentVolume を利用する Pod は Auto Mode 以外のノードで実行する必要があります。 Amazon VPC CNI plugin OSS 版との主な違い Auto Mode は Amazon VPC CNI plugin と以下の違いがあります。 2 EKS Auto Mode does not support: Security Groups per Pod (SGPP). Custom Networking. The IP Addresses of Pods and Nodes must be from the same CIDR Block. Warm IP, warm prefix, and warm ENI configurations. Minimum IP targets configuration. Enabling or disabling prefix delegation. Other configurations supported by the open-source AWS CNI. Network Policy configurations such as conntrack timer customization (default is 300s). Exporting network event logs to CloudWatch. AWS Load Balancer Controller OSS 版との主な違い 設定項目が異なる 以下のリソースは AWS Load Balancer Controller と設定項目(フィールドや annotation)が異なります。 Service Ingress IngressClassParam TargetGroupBinding 詳細は以下のドキュメントをご参照ください。 Create an IngressClass to configure an Application Load Balancer - Amazon EKS Use Service Annotations to configure Network Load Balancers - Amazon EKS OSS 版と併用できる Auto Mode と AWS Load Balancer Controller は併用できます。 OSS 版からリソースを移行できない 既存の Service, Ingress の管理を AWS Load Balancer Controller から Auto Mode へ移行できません。 .spec.loadBalancerClass のデフォルト値が eks.amazonaws.com/nlb になる Service の .spec.loadBalancerClass が未指定の場合、 Auto Mode は mutating webhook によってこの値を eks.amazonaws.com/nlb に設定します。これには以下の影響があります。 AWS Load Balancer Controller にも 類似の mutating webhook があります。両者を有効にしている場合、正常に機能するのは片方のみです。 .spec.loadBalancerClass を未指定のままにできないため、新規に CLB を作成できません。 補足:Service, Ingress がどの controller によって処理されるか Service .spec.loadBalancerClass の値が eks.amazonaws.com/nlb の場合、 Auto Mode によって NLB が作られます。 以下のいずれかの場合、 AWS Load Balancer Controller によって NLB が作られます。 .spec.loadBalancerClass の値が service.k8s.aws/nlb の場合。 service.beta.kubernetes.io/aws-load-balancer-type annotation の値が nlb-ip または external の場合。 .spec.loadBalancerClass が未指定の場合、レガシー クラウド プロバイダーによって CLB が作られます。 3 ※前提として .spec.type の値が LoadBalancer であるとします。 Ingress .spec.ingressClassName に指定した IngressClass の .spec.controller の値が eks.amazonaws.com/alb の場合、Auto Mode によって ALB が作られます。 .spec.ingressClassName に指定した IngressClass の .spec.controller の値が ingress.k8s.aws/alb の場合、 AWS Load Balancer Controller によって ALB が作られます。 Karpenter OSS 版との主な違い 設定項目が異なる 以下のリソースは AWS Load Balancer Controller と設定可能な項目が異なります。 NodeClass NodePool 詳細は以下のドキュメントをご参照ください。 Create a Node Class for Amazon EKS - Amazon EKS Create a Node Pool for EKS Auto Mode - Amazon EKS 具体的な設定項目は kubectl explain コマンドでも確認できます。 ノードの AMI は AWS によって管理される Auto Mode では NodeClass の .spec.amiSelectorTerms (ノードの AMI に関するフィールド)を設定できません。Auto Mode のノードの AMI は AWS によって管理されます。 Auto Mode のノードの AMI には以下の特徴があります。 Bottlerocket OS を採用。 SSH や Session Manager によるノードへのログインは不可。 ただし kubectl debug node コマンドの実行は可能。 AWS が新しい AMI をリリースすると Karpenter がそれを検出して、 PodDisruptionBudget や NodeDirsuptionBudget を考慮しつつ、自動的に各ノードを新しいものに置換します。 トラブルシューティング の際は node monitoring agent を使ってノードのログを収集できます。詳しい方法は Retrieve node logs for a managed node using kubectl and S3 をご参照ください。 ノードは起動から最長 21 日経過すると終了する Auto Mode では NodePool の spec.template.spec.expireAfter spec.template.spec.terminationGracePeriod の合計は 504h 以下でなければなりません。つまり各ノードは起動から最長 21 日経過すると自動的に終了します。 Pod からノードの インスタンス メタデータ や インスタンス プロファイルを利用できない Auto Mode では NodeClass の spec.metadataOptions (ノードの MetadataOptions に関するフィールド)を設定できません。 Auto Mode のノードの MetadataOptions は以下のようになります。 " MetadataOptions ": { " State ": " applied ", " HttpTokens ": " required ", " HttpPutResponseHopLimit ": 1 , " HttpEndpoint ": " enabled ", " HttpProtocolIpv6 ": " disabled ", " InstanceMetadataTags ": " disabled " } HttpPutResponseHopLimit が 1 なので Pod からノードの インスタンス メタデータ や インスタンス プロファイルを利用できません。Pod に IAM role を割り当てる必要がある場合は代わりに以下のいずれかを利用する必要があります。 EKS Pod Identity IAM roles for service accounts その他 他にも Auto Mode は Karpenter と以下の違いがあります。 4 EKS limits the maximum number of pods on a node to 110. This limit is applied after the existing max pods calculation. For more information, see Choose an optimal Amazon EC2 node instance type. EKS Auto Mode automatically formats and configures NVMe local storage on supported instance types. For nodes with multiple NVMe drives, EKS sets up a RAID 0 array. This automation eliminates the need for manual formatting and RAID configuration of local NVMe storage in EKS clusters. Amazon EKS Auto Mode does not support AWS Fault Injection Service. For more information, see Managing Fault Injection Service experiments in the AWS Resilience Hub User Guide. You do not need to install the Neuron Device Plugin on EKS Auto Mode nodes. If you have other types of nodes in your cluster, you need to configure the Neuron Device plugin to not run on auto mode nodes. For more information, see Control if a workload is deployed on EKS Auto Mode nodes. 他のコンピュートリソースと併用できる Auto Mode は他のコンピュートリソース( Managed Node Group や Fargate など)と併用できます。 組込みの NodeClass, NodePool は編集できない Auto Mode には以下の組込みの NodeClass, NodePool があります。 NodeClass default NodePool system general-purpose これらの設定は変更できません。異なる設定の NodeClass, NodePool を利用したい場合は独自の NodeClass, NodePool を作成する必要があります。 コスト Auto Mode のノードに対して追加料金が発生します。金額は EC2 インスタンス の料金の約 12% 程度のようです。詳細は以下のドキュメントをご参照ください。 Amazon EKS Pricing | Managed Kubernetes Service | Amazon Web Services 終わりに この記事では Amazon EKS Auto Mode を利用する際に気をつけるべきことをご紹介しました。 Auto Mode を有効にすることで クラスタ 管理者はいくつかのアドオンの保守・運用から開放されます。積極的に利用を検討したいですね。 最後までお読みいただき、ありがとうございました。 参考資料 Automate cluster infrastructure with EKS Auto Mode - Amazon EKS EKS Auto Mode - Speaker Deck 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @shibata.takao 、レビュー: @nagamatsu.yuji ( Shodo で執筆されました ) Create a storage class - Amazon EKS ↩ Learn about VPC Networking and Load Balancing in EKS Auto Mode - Amazon EKS ↩ 実際には Auto Mode の mutating webhook の影響で .spec.loadBalancerClass を未指定のままにすることはできません。 ↩ Create a Node Class for Amazon EKS - Amazon EKS , Create a Node Pool for EKS Auto Mode - Amazon EKS ↩
こんにちは! グループ経営ソリューション事業部の 米久 保です。 私がマネージャーを担当するグループにて、ワークショップ形式で組織目標づくりをした話を書きます。 背景 マッキンゼーの7S ワークの進め方 ステップ1. Shared Valueを書き出す ステップ2. 6つのSを書き出す ステップ3. Shared Valueをすり合わせる ステップ4. Shared Valueを作文する ステップ5. 組織目標を考える ステップ6. メンバーと共有する やってみた感想 まとめ 参考文献 背景 多くの日本企業で導入されている目標管理手法の MBO は、「マネジメントの父」と呼ばれるP.F. ドラッカー 氏が提唱した考え方で、「Management by Objectives and Self-control」の略です。組織として成果を上げるためには、共通の目標(Objectives)を組織全体で共有することと、メンバーの「自律的な貢献」が重要です[1]。 Self-control の部分が鍵で( MBO という略語に含まれないが故にしばしば抜け落ちてしまうのですが)、これがなければ MBO は形骸化し、上から押し付けられた目標をこなすという受動的なものになるリスクがあります。 個々人の目標は、所属する組織の目標にリンクしている必要があります。上位にあたる組織目標が、メンバーにとって 納得し共感できる ものであって初めて個人目標は意味のあるものとなり、それを達成したいという強いモチベーションが生まれます。 そのような「 腹落ちする組織目標 」をつくるために、マネージャーの私とリーダー二名、計三名でワークショップを開催しました。 マッキンゼー の7S マッキンゼー の7S (McKinsey 7S)は、組織の競争力強化を目的とし、組織の効率性を分析する用途で使われるモデルです。『エクセレント・カンパニー』の著者であるトム・ピーターズ氏らが、 マッキンゼー で コンサルタント をしていた1979年に開発しました[2]。 今回は企業レベルでの分析ではなく、目標づくりを目的としてチームの現状把握に用いるため、次の表のように解釈をしました。 要素 説明 Strategy 戦略 組織の強みと弱み。何をやり、何をやらないか。 Structure 組織構造 チーム構造と役割分担、コミュニケーション。 System システム プロセス、ルール、ツールなどの仕組み。 Shared Value 共通の価値観 チームの方向性を定め、活動の原動力となるもの。ミッションやバリュー。 Skill スキル チームとしてのスキル(組織能力)、個々人のスキル(技術力、ソフトスキル)。 Staff 人材 人材育成と成長、採用計画。 Style 組織風土 文化の醸成。 7Sのうち、「Strategy」「Structure」「System」を「ハードなS」、「Shared Value 」「Skill」「Staff」「Style」を「ソフトなS」と呼びます。一般的にはハードなSが重要視されがちですが、ソフトなSに対しても同等に注意を注ぎバランスを取ることが重要だとピーターズ氏は説きます。 ワークの進め方 では実際にどのような流れでワークを進めたかをご紹介しましょう。 ステップ1. Shared Value を書き出す まず、Shared Value を考える上でのネタ出しとして、 組織からどんなことを期待されているだろうか? 自分たちはどうありたいか? を思い思いに付箋に書き出していき、共有を行いました。 生データを公開することはできないのですが、たとえば「ビジネスのことを考えられるエンジニア集団になりたい」というような意見が出ました。 ステップ2. 6つのSを書き出す ハードなS(Strategy、Structure、System)、ソフトなS(Skill、Staff、Style)の順で、各要素についてのワークを以下の手順で行いました。 As Isのレーンに、現状の課題(黄色の付箋)と、うまくいっており継続し強化したいこと(水色の付箋)を書き出す ディスカッションをしながら、あるべき姿や方向性、目標を検討してTo Beのレーンに書き出す(水色の付箋) たとえば、Strategy(組織の強みと弱み。何をやり、何をやらないか)については、「高品質でバグが少ない」一方で「全体感を把握している人は一部のベテランのみで属人化している」という現状課題認識に基づき、「人に依存せず高品質を実現する仕組みづくり」を目指す、といった具合です。 ステップ3. Shared Value をすり合わせる ステップ1で書き出した「組織からの期待」「自分たちの想い」、およびステップ2で6つのSそれぞれに対して書き出したTo Beの内容を眺めながら意見交換をしました。掘り下げを行ったり、新たな気づきがあれば付箋を足したりします。 次のステップで ステートメント を作文する前準備として、Shared Value に含めたいキーワード候補を書き出していきました。 ステップ4. Shared Value を作文する ステープ3で書き出したキーワードを使い、 ステートメント としてShared Value を作文する作業を行いました。 メンバーの心に刺さり、共感を得て、モチベーション向上につながるような文章 を目指してあれこれ考えました。 最終的に我々のグループのShared Value ステートメント は以下となりました。 卓越した技術力と 人間力 で開発組織を牽引し、プロダクトビジネスを持続的に成長させることで業績拡大に貢献する ステップ5. 組織目標を考える ステップ4までの作業は、「腹落ちする組織目標」をつくるための前準備でした。次に、半年や一年といったタイムボックスにおける具体的な達成目標を定めます。 OKR (Objectives and Ker Results)という目標設定 フレームワーク (参考文献[1]によるとOKRは MBO の実践手法の一つとされる)の利用も検討しましたが、今回は以下の理由で見送りました。 我々のグループのメンバーは現在担当する業務が多岐にわたっており、共通のObjectives/Key Resultsを定めるのが難しい Key Resultsを 定量 的に表現するものが難しいものも多い 主要な活動(例「開発基盤のエンハンス・保守」)と、活動におけるトピック(例「次期バージョンのリリース」)で括り、それぞれについて責任を担うリーダーが以下を記入します。そして、他のリーダーが質問やコメントをして内容をブラッシュアップしました。 WHY(背景、意義) その活動/トピックを行う意義は何か 周囲や上位の組織にとって、どのような効果があるか 我々のグループにとって、どのような効果があるか WHAT(ゴール、達成すべきこと) どのような状態になっていれば、目標が達成できたと言えるか 定量 的に表現可能であれば、その達成目標値 ポイントは、 WHY(背景、意義)の内容がShared Value ステートメント で表現される価値観に繋がっていること です。それによって目標に対する納得感やモチベーションが高まります。 ステップ6. メンバーと共有する メンバー全員を集めて、作成した組織目標(Shared Value ステートメント と、活動・トピック毎の達成目標)を共有しました。あわせて、各リーダーは配下のメンバーに期待する目標内容(どのような役割で、どのような働きをしてほしいか)を文章化して共有を行いました。 やってみた感想 比較的長く一緒にやっているメンバー同士だったので、持っている価値観は共通する部分が多いと感じていましたが、 ワークを通して 言語化 することで相互理解をより深めることができた と思います。逆に、「思ったより◯◯の性向が強いんだな」というような気づきもありました。 組織目標は納得感があるものに仕上がったと思います。実際、その後メンバーが設定した各自の個人目標はしっかりと組織目標にリンクしており、チームとして同じ方向を向いていると実感しました。 今回はリーダーのみでワークショップを行いましたが、大規模なグループではないので、メンバー全員でやってみてもよいかなと思いました。 目標は設定して終わりではありません。 達成に向けて、ふりかえりなどによって高頻度に目標と向き合う 必要があります[3]。そのあたりもチームで取り組んでいきたいと考えています。 まとめ 本記事では、「 マッキンゼー の7S」モデルを用いた、ワークショップ形式による組織目標づくりをご紹介しました。ツールそのものよりも、 共に目標を作っていくプロセスによってチームの向かうべき方向を揃えていく という行為に意味があると思います。目標設定に悩みを持つマネージャーやチームリーダーにとって少しでも参考になれば幸いです。 記事末に 参考文献としてリストアップした書籍はどれも大変良い本ですので、是非参考になさってください。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 参考文献 [1] 坪谷 邦生 著 『図解 目標管理入門 マネジメントの原理原則を使いこなしたい人のための「理論と実践」100のツボ』 ディスカヴァー・トゥエンティワン (2023) [2] トム・ピーターズ 著 久保美代子 訳 『新エクセレント・カンパニー AIに勝てる組織の条件』 早川書房 (2020) [3] 小田中 育生 著 『 アジャイル チームによる目標づくりガイドブック OKRを機能させ成果に繋げるためのアプローチ』 翔泳社 (2024) 執筆: @tyonekubo 、レビュー: @nakamura.toshihiro ( Shodo で執筆されました )
はじめまして。 エンタープライズ 第二本部、1年目の藤城龍之介です。 本記事では、ITほぼ未経験の状態から 応用情報技術者試験 において入社半年で上位約0.1% に食い込んだ体験談と 10の戦略 を紹介します。 私が実際に行った学習方法や反省点も含めて、応用情報の戦い方を記しますのでぜひ参考にしていただければと思います。 なお、本記事では 応用情報技術者試験 を取り上げていますが、 その他の資格試験の対策に活用できるところもある かと思いますので、応用情報以外を受験する方もご一読いただければ幸いです。 目次 当時の私のスペックと状況 応用情報技術者試験の概要 勉強方法 スケージュールと勉強時間 使用した教材 インプット アウトプット(午前試験) アウトプット(午後試験) 試験直前 2日前 前日 試験本番 試験前 午前試験 昼休憩 午後試験 所感 結果 まとめ 10の戦略まとめ 最後に 当時の私のスペックと状況 ITほぼ未経験(電気系の理系大卒) 社会人1年目 IT系資格 保有 なし 理系科目は割と得意 暗記はかなり苦手 私が応用情報を受けようと思ったのは、ただ資格を取りたいというわけではなく、自社の研修とは別に自身でもIT系の知識をつけていきたいと思ったからです。 そこで、ITに関する体系的かつ使える知識を得られそうな応用情報を受験することにしました。(基本情報か応用情報が取得必須資格だったのもあるが...) 資格は取ることを目標にするのもいいですが、知識が体系的にまとめられており、効率よく知識を習得するのに最適だと考えています。 また、自身の知識を増やし、理解を深めることを目的に取り組むと気持ちも入りやすくなると思います。 応用情報技術者試験 の概要 応用情報技術者試験 は午前試験と午後試験があり、 どちらも60点以上 で合格です。 なお、午前試験で60点以上取らないと、午後試験は採点されないそうです。 午前試験 試験時間 9:30 ~ 12:00(150分) 出題形式 多肢選択式(四肢択一) 出題数 80問 午後試験 試験時間 13:00 ~ 15:30(150分) 出題形式 記述式 出題数 11問(解答は5問:1問必答、4問選択) 試験科目 1. セキュリティ(必答) 2. 経営戦略系 3. アルゴリズム 4. システム アーキテクチャ 5. ネットワーク 6. データベース 7. 組み込みシステム 8. システム開発 9. プロジェクトマネジメント 10. システムマネジメント 11. システム監査 勉強方法 それではここから勉強方法について紹介します。 スケジュールと勉強時間 入社と同時(4月)に勉強を開始しましたが、すぐにペースが落ちました。 結局7月末まではダラダラと勉強を続けていたため、この期間は平均するとおそらく1日あたり1時間くらい勉強していました。 8月になってさすがにマズいと思い、平日3時間、休日5時間くらいの勉強に切り替えました。 休日少なくない?と思った方もいると思いますが、趣味などに時間を使ったりして適度なリフレッシュをすることで勉強時間内にしっかりと集中することができました。 戦略①:適度なリフレッシュで勉強時間の効率を上げる → 特に休日は1:1くらいの割合でリフレッシュする というわけで、結局学習時間としては 約400時間 ほど取りました。 しかし、今思えば4~7月の勉強ではほとんど身に付いていない気がするので、実際には 約300時間 くらいだと思います。 もっと後から勉強開始して集中して取り組めていたら良かったと考えています。 戦略②:勉強開始は集中力を保てる期間を見据えてから → 応用情報は3, 4か月前がオススメ 使用した教材 使用した教材は3つで、以下で紹介する3つのフェーズごとに使い分けておりました。 書籍 令和06年【春期】【秋期】 応用情報技術者 合格教本 2024 応用情報技術者 午後問題の重点対策 Webサイト 応用情報技術者過去問道場 インプット(~ 9月中旬) インプットで使ったのは 合格教本 で、暗記が苦手な私は以下のようにインプットしました。 ちなみに、私はテク ノロ ジ系の知識が欲しかっただけなので、この教材のマネジメントとストラテジは飛ばしました。 → 後のアウトプットで何とかなりました ・1周目:理解できないところがなくなるようにノートに書きながら読む ⇒ 丸暗記ではなく、原理や考え方などを他の要素と結び付けながら理解することで暗記量をできるだけ減らしました。 ・2周目:自身が書いたノートを読み返して復習 → 理解できていないところは再度書きながらチェックする ⇒ 1周だけでは完璧に理解できないので、分かりづらいと感じたところはインターネットも併用しながらさらに理解を深めました。 ・3周目:さらにノートで復習 → 暗記するしかないところを覚える ⇒ とにかく丸暗記するという行為が嫌いなので、2周してできるだけ丸暗記の量を減らし、最後の最後で暗記するしかないところを覚えました。 このように、体系的に繋げて理解することを念頭に学習を進めることで、丸暗記の量を減らすことができる上、内容も十分に理解することもできました。 当初の目的であった、体系的かつ使えるITの知識を得ることができたと思います。 暗記が得意な方も、応用情報の範囲は莫大で丸暗記するにはかなりの根気がいると思いますので、ぜひ「繋げて理解する」ことを念頭に勉強していただければと思います。 戦略③:丸暗記をやめて体系的に「繋げて理解する」ことに専念する → 繋げて理解することで、使える知識へと昇華できる、かつ最終的に時短にもなる アウトプット(午前試験 / 9月下旬) インプットで9月中旬くらいまで使い、ここでやっとアウトプットに入りました。 まずは午前試験対策です。 9月末を使い、 過去問道場 で午前試験の過去問を3年分(6回分)、解きました。 ここで意識したことは以下の3点です。 1. 試験方式を確認し、慣れること 2. 知識の抜け漏れを補完し、インプットで得た知識を確認すること 3. マネジメントとストラテジ(インプットをしなかった科目)について知ること まず意識することは、試験で問題がどのような形式で出て、どのような時間配分で解けばいいのかを確認することです。 これは6回分もやれば十分につかめると思います。 次に、知識の抜け漏れを補完することです。( これが重要! ) インプットで入れたものは100%定着するわけではないので、ここでさらに思い出すことによって知識を補完・確認していきます。 また、試験では多少 合格教本 に書いていないことも出題されるので、そこについてはインプットフェーズのように新たに知識を入れていきます。 なお、マネジメントとストラテジについてはここで問題を解くことで十分に解けるようになりました。 * 欲しい知識には個人差があるので、おすすめしているわけではありません。 戦略④:アウトプットはあくまで試験の形式の確認と知識の補完・確認 → インプットで得た知識を確認すると共に抜け漏れをなくす 過去問はたくさん解いた方が良いとは思いますが、IT業界の知識は日々アップデートされていくのでそこまで古い過去問に手を出す必要はないと思います。 再度になりますが、実際にやってみて6回分も解けば十分だと思いました。 戦略⑤:過去問を解くのは適度に終わらせて良い → 6回分で十分 アウトプット(午後試験 / 10月上旬) 10月に入り、午後試験の対策を始めました。 午後試験は1回分が長く、自分で問題を厳選するのが面倒だったため、 午後問題の重点対策 を使って、どのような問題が出るのか掴むことにしました。 基本的には、解く問題をある程度先に絞ってからその分野だけ過去問を解いて慣れていくことがオススメです。 午後試験は4問が選択問題で、6問は解かない問題になるので、時間が十分にある方以外は選択する問題を絞って勉強するのが効果的だと思います。 私は以下のように午後問題を絞りました。 確実に解く問題は2, 3問決めておき、問題文を見て決める問題を1, 2問に絞っておくと学習も本番も余裕ができます。 あくまで私の特性(長文を読むことが苦手)とこれまでの学習方法に対する選定方法なので、自身の特性と学習状況に応じて選定してみてください。 〇:確実に解く問題 △:本番の問題文読んでから決める問題 ✕:絶対に解かない問題 △ → ✕:問題集を解いてみた結果、絶対解かないように変更した問題 科目 選択 説明・選定理由 1. セキュリティ 必須 午前の知識がある前提で、問題を読めば解ける 2. 戦略系 ✕ 文章が長く、知識も浅い 3. アルゴリズム 〇 変数の説明をしっかり読み、具体例や図を用いて明確化すれば解ける 4. システム アーキテクチャ △ → ✕ 計算問題が多く、ミスもしやすい傾向があった 5. ネットワーク △ 記述が難しいことがあるが、ある程度の得点源になる 6. データベース △ いかついER図などが出てきてタイパが悪い回がある 7. 組み込みシステム 〇 知っているモノが出ることが多く、事例が理解しやすい 8. システム開発 〇 事例を理解することに専念すれば、あとは自社の研修内容で解ける 9. プロジェクトマネジメント ✕ 文章が長く、知識も浅い 10. サービスマネジメント ✕ 文章が長く、知識も浅い 11. システム監査 △ → ✕ 文章が長い このように、事例の文章も長く、インプットをしなかったマネジメント、ストラテジ系以外の問題(6問)を解いて検証し、自分にあったものをスタメンとしました。 できるだけ絞ることで、勉強の効率が大幅に上がるのに加え、本番で問題を読んで迷って時間を食うこともないので、学習の段階から絞って勉強するのはかなりオススメです。 戦略⑥:午後問題は思い切って絞る → 確実に解く問題を2, 3問に絞り、重点的に学習する 試験直前 2日前 試験2日前は、アウトプットに使っていたノートを見ながら復習をしました。 どのような問題でミスしたかを再確認することで、もう一度記憶を整理し、定着させました。 前日 前日はインプットに使っていたノートで復習をしました。 学んだことを確認し、知識の結びつきを再度整理することで、本番に向けて準備を整えることができたと思います。 それ以外の時間は趣味に充て、頭を休めました。 戦略⑦:試験直前は復習するだけ → 直前に詰め込もうとしても焦りでインプットできないため、やったことを復習し、あとは自由に過ごす 試験当日 試験前 会場は行ったことがない駅の近くの専門学校でした。 朝早かったこともあり、集合時間の 1 時間前くらいに会場の最寄り駅まで行き、集合時間ギリギリまで近くの公園で朝ご飯を食べながらノートで最終確認をしていました。(教室は空気が重く不自由だったのでこの選択は正解だった…) ちなみに、持って行った教材は自分がインプットとアウトプットで使ったノート4冊です。 戦略⑧:試験日の朝は周りの空気に呑まれないように → 自分でその環境を作り出すことが大事 午前試験 午前試験では分からない問題はとにかく後回しにして、まず一通り解き終わることを目標にしました。 結局大幅に時間が余ったため、分からなかった問題も含めて 3 回くらい見直しをすることができました。 昼休憩の時間に 過去問道場 のサイトで解答速報が出るので、それに備えて問題に自分の解答を書き込んでおくことも大切です。 早く解き終わったら退出できるので、昼休憩を有効に使いたい人は退出するのもオススメです。 昼休憩 昼休憩時は、朝と同様の公園で昼ご飯を食べながら、解答速報を見て答え合わせをしました。 合格ラインに乗っていたので、心置きなく午後試験に臨むことができたと思います。 昼休憩は多少の復習もしましたが、公園で少し体を動かすことでかなりのリフレッシュになりました。 戦略⑨:昼休憩は頭を休める → 体を動かしたりして気分転換をする 午後試験 午後試験は立てた戦略通り、確実に解く問題である、以下の問題を先に解きました。 1. セキュリティ 3. アルゴリズム 7. 組み込みシステム 8. システム開発 しかし、この年は組み込みシステムがとても難しく感じ、ここだけは一旦問題用紙に解答を書き込んでネットワークとデータベースを解くことにしました。 問題文を読み始めると、想定よりもネットワークが簡単だったため、その後の解答にかなりの余裕ができ、ネットワークとデータベース、組み込みシステムを全て解いて比較することができました。 結果的には、想定よりも簡単だったネットワーク、少しでも点が取れる見込みのあった組み込みシステムを解答として提出しました。 所感 過去問をあまり多く解いていないこともあり、見たことのない問題が多かったですが、繋げて理解することにフォーカスして勉強した結果、当日も考えながら解答を導出できたと思います。 また、午後試験で多少の想定外のトラブルがありましたが、落ち着いて別の解答を進めることで最終的には時間に余裕ができたため、この方法を取ってよかったと思っています。 戦略⑩:試験時に分からない問題は後回し → 分かる問題から解き進めることで時間と心の余裕を確保する 結果 結果は… 無事合格できました! 午前が85点、午後が90点です。 得点分布をみると、午前は上位約3%、午後は上位約0.1%でした。 IT ほぼ未経験からここまで得点を上げることができたのも、理解に専念したからだと思っています。 特に午後は過去問が出ることはないので、どれだけ理解しているかがものを言うと思います。 そのため、午前よりも午後の方が得点が高い結果となったのだろうと思っています。 まとめ 10の戦略まとめ ここまでで紹介した10の戦略をまとめておきます。 人によって合う合わないがあるかと思いますが、参考にしていただければ幸いです。 ● スケジューリング 戦略①:適度なリフレッシュで勉強時間の効率を上げる → 特に休日は1:1くらいの割合でリフレッシュする 戦略②:勉強開始は集中力を保てる期間を見据えてから → 応用情報は3, 4か月前がオススメ ● 学習 戦略③:丸暗記をやめて体系的に「繋げて理解する」ことに専念する → 繋げて理解することで、使える知識へと昇華できる、かつ最終的に時短にもなる 戦略④:アウトプットはあくまで試験の形式の確認と知識の補完・確認 → インプットで得た知識を確認すると共に抜け漏れをなくす 戦略⑤:過去問を解くのは適度に終わらせて良い → 6回分で十分 戦略⑥:午後問題は思い切って絞る → 確実に解く問題を2, 3問に絞り、重点的に学習する ● 試験直前 戦略⑦:試験直前は復習するだけ → 直前に詰め込もうとしても焦りでインプットできないため、やったことを復習し、あとは自由に過ごす ● 試験当日 戦略⑧:試験日の朝は周りの空気に呑まれないように → 自分でその環境を作り出すことが大事 戦略⑨:昼休憩は頭を休める → 体を動かしたりして気分転換をする 戦略⑩:試験時に分からない問題は後回し → 分かる問題から解き進めることで時間と心の余裕を確保する 最後に ここまで読んでいただきありがとうございます。 応用情報はかなり出題範囲が広く、網羅するのは根気が必要ですが、「繋げて理解する」ことで効率的に学習を進めていきましょう。 あくまで私の学習方法と戦略ですが、今後応用情報を勉強する方の一助となれば幸いです! 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @fujishiro.ryunosuke 、レビュー: @handa.kenta ( Shodo で執筆されました ) table { width: 100% !important; border-collapse: collapse; } td { border: 1px solid #000; padding: 8px; word-wrap: break-word; } td:first-child { background-color: #d3d3d3; font-weight: bold; } blockquote { border-left: 5px solid #388e3c !important; background: #e8f5e9; padding: 10px; }
こんにちは。 エンタープライズ 第一本部の新人、佐藤悠です はじめに 質問しまくる新人の私 タスクは思考の過程から文字に起こす新人の私 RAGとは Bedrock knoeledgebasesでRAGを作成してみた 参考資料 はじめに 質問しまくる新人の私 私は現在、先輩社員の手を煩わせながら日々の業務を行っています。 先輩は質問を歓迎していますが、将来自分が同じ立場になった際に同じ振る舞いができる気がしないので今から対策をしようと思いつきました。 仕事で分からないことは当然のようですが2つに分けることができると思っています。 調べれば分かること 聞かないと分からないこと 当たり前ですが新人は聞かないと分からないことで質問をします。(私は調べればわかるが聞いた方が早そうなことは聞きますけど...) 業務上ではこのような聞かないと分からないような属人的な知識を扱うことがあります。 現場では、ほとんどが文書化されデータが存在しアクセス可能なところにありますが、規模が大きく複雑化した結果、その文書のありかを知っている人が限られているというような状態にも陥りがちです。 タスクは思考の過程から文字に起こす新人の私 私はあまりワーキングメモリがなく、次々と考えることが増えたときや次の日に持ち越した際に何をすればいいのか分からなくなりやすいので、以下のようにmdファイルでまとめたものがタスクごとに存在しています(実案件のものなので文字は読めないようぼかしてます)。 ここで割とこまめに文書に書き起こす自分の特徴とRAGって相性いいなと感じました。 前置きが長くなりましたが、この記事では業務上で扱う個別具体的な情報を回答できるように、自分がまとめたmdファイルでRAGを作成できるのかを技術的に検証します。 RAGとは 大規模 言語モデル 自体に変更を加えることなく参照する情報を指定することでハルシネーションの回避や特有の知識に対する回答の精度を高めることができます。 今回は以下のような構成を AWS 上で準備することを考えます。 LangChainでRAGを実装することもできますが普段使用している AWS でフルマネジドで作成することができるBedrock Knowledge bases[1]が簡単なので今回はこれを使用します。 Bedrock Knowledge basesでRAGを作成してみた 埋め込むデータは検証なので以下のようなダミーデータにしました。 これをRAGを使用せずに生成AIに案件Bの担当者は誰ですかと聞いても答えることは不可能でしょう。 では、先ほどのmdファイルをデータソースとして使用するためにS3に配置します。 次にBedrock Knowledge basesでこれを埋め込みするソースに指定します。 マネジメントコンソールでBedrockと検索し左のメニューからKnowledgebaseを選択します。 Knowledgebaseを作成を押下すると遷移先の画面でデータソースを指定できます。 次へを押下した遷移先で実際にmdファイルを置いた バケット の URI を指定します。 後は特別な設定をしない場合はアクセス許可をした埋め込み用のモデルを指定して、ベクトルデータベースをクイック作成で完了です。 ストア先は OpenSearch を使用しました。 作成したデータソースを同期します。 では無事に検索するべき情報をコンテキストに渡す準備ができました。 以下の指示にどのような回答が返ってくるかテストします。 いかに....!? 生成AIの思考では出せない一般的ではない名前のデータを出力させることに成功しました。 これで検証を終わります。 社内情報を使用していいのかとかの線引きを含めて超えないといけない壁は複数ありそうですが、技術的にできるのは嬉しいです。 ここまで読んでいただきありがとうございました。 参考資料 [1]How Amazon Bedrock knowledge bases work https://docs.aws.amazon.com/bedrock/latest/userguide/kb-how-it-works.html 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @sato.yu 、レビュー: @nagamatsu.yuji ( Shodo で執筆されました )
こんにちは、クロス イノベーション 本部エンジニアリングテク ノロ ジー センターの小澤英泰です。 本記事では GitHub Discussionsで ADR を管理する方法を紹介します。 はじめに ADRとは 筆者チームのGitHubとの関わり方 ADR導入の目的 ADRに備えたい性質 記載内容 運用 ADRの構成 全体構成 個別の説明 タイトル ステータス コンテキスト 決定 影響 コンプライアンス 参考情報 備考 ADRのステータス管理 ステータスの遷移図 個別のステータス Draft(ドラフト) Proposed(提案中) Review Rejected(却下) Accepted(承認済み) Deprecated(非推奨) Superseded(置き換え) 他のドキュメントとの違い ADRの管理にGitHub Discussionsを採用した理由 比較観点 比較検討 結果 Discussions リポジトリのdocsフォルダ Issues Wiki GitHub Discussionsでの運用で得たTips 無効なADRもOpenのままとする DiscussionとIssueに関連を持たせる アーキテクチャの決定をGitHub Copilotに読ませる さいごに ADRの例 ステータス コンテキスト 決定 結論 採用の選択肢とその理由 GitHub Packages(npm packages) 採用見送りの選択肢とその課題 GitHub Packages(Docker Images) Monorepo Micro Service 影響 コンプライアンス 参考情報 備考 はじめに ADR とは ADR とは Architecture Decision Record の略称で、定義は AWSのADRに関するドキュメント を拝借します。 An architectural decision record ( ADR ) is a document that describes a choice the team makes about a significant aspect of the software architecture they’re planning to build. Each ADR describes the architectural decision, its context, and its consequences. ADRs have states and therefore follow a lifecycle. ADR とは、チームが構築するソフトウェア アーキテクチャ の重要な選択を記述する文書です。 各 ADR には、 アーキテクチャ の決定、その背景、およびその結果を記述します。 ADR には状態とライフサイクルがあります。 Architecture Decision Recordをカタカナで アーキテクチャ ディシジョンレコード と表記する場面もありますが、手短に本ブログでは ADR で統一します。 定義だけでは想像が難しいと思いますので、ご参考までに 本記事の最下部にプロジェクトで管理するADR を記載しました。 筆者チームの GitHub との関わり方 本題に入る前に、筆者チームにおける GitHub の活用方法を紹介します。 私たちは普段5人前後の開発チームでプロダクト開発を行うことが多く、プロダクトオーナーもGit/ GitHub を積極的に活用します。構成管理以外にも下記のようにプロダクト開発で扱うツールを GitHub に集約し、連携することでメリットを最大限に引き出すことを目指しています。 GitHub Actions: CI/CD GitHub Codespaces: 開発環境 GitHub Discussions: 技術に関する議論や ADR 、議事録の管理 GitHub Issues: 課題管理 GitHub Packages: ソフトウェアパッケージの ホスティング GitHub Pages: Storybookや API 仕様書の ホスティング GitHub Projects: プロジェクト管理 ドキュメント管理においては、 GitHub を信頼できる唯一の情報源として位置づけ、他のツールとの分散を避けることで、情報の一元化と信頼性の向上を狙っています。 また、 アーキテクチャ の決定に影響のあるすべてのメンバーが GitHub にアクセスできることを前提とし、透明性を確保しながらプロダクト開発をしています。 ADR 導入の目的 それでは、本題に入っていきましょう。 ADR 導入の目的は 未来のプロジェクトメンバーが当時の アーキテクチャ 決定の トレードオフ まで理解できること です。 特定の課題により採用を見送った アーキテクチャ についても、経緯と判断理由を記録することで、将来のリ アーキテクチャ 時に同様の問題を見落とし、障害やリスクを引き起こすことの未然防止を目的としています。オーラルヒストリーで課題を引き継ぐのは困難を伴うでしょう。 ADR に備えたい性質 次に、上記目的を達成するための ADR に備えたい性質を 記載内容 と 運用 の観点で整理します。 記載内容 採用 アーキテクチャ と採用理由 採用を見送った アーキテクチャ と課題 関連する利用中の技術や業務、組織的な制約 ドキュメントの有効と無効を判別できるステータス 運用 簡潔なテンプレートがある 作成およびメンテナンスのコストが低い 継続的な運用フローがある すべてのプロジェクト関係者がアクセスできる 誰がいつ何を変更したかを追跡できる 他のドキュメントやコードと整合性が取れている 適切にレビューされ、承認されている ADR の構成 上記の目的や性質を踏まえ、 ADR の構成を下記としました。 全体構成 タイトル ステータス コンテキスト 決定 影響 コンプライアンス 参考情報 備考 個別の説明 タイトル アーキテクチャ 決定の簡単な説明 フォーマットは [ADR_番号] タイトル 例、 [ADR_002] 基盤コードの公開方法 ステータス ステータスは6種類あり Draft(ドラフト) Proposed(提案中) Accepted(承認済み) Rejected(却下) Deprecated(非推奨) Superseded(置き換え) ステータスの詳細は後述の ADR のステータス管理 を参照 コンテキスト 決定を下した状況 利用中の既存技術との兼ね合いや組織や体制、ビジネス面の時間的な制約を踏まえる 決定 決定と根拠 他の採用を見送った候補と課題 影響 決定による影響 コンプライアンス 決定が遵守されていることを確認する方法 参考情報 参照すべき一次情報 理解を促すブログ(任意) 備考 その他の備考(任意) ADR のステータス管理 ADR のステータス遷移と、レビューのプロセスを定義します。 Acceptedのステータスが唯一、 ADR が有効であることを示します。 ステータスの遷移図 個別のステータス Draft(ドラフト) 提案者が作成中の状態 他のメンバーへは周知前 Proposed(提案中) 周知済みでありレビュー可能な状態 Review ※ 判断でありステータスではありません。 レビュー完了の場合、承認または却下へ進む 指摘事項ありの場合、修正者へ差し戻す Rejected(却下) レビューを経て採用せず却下とした状態 ADR 作成者は却下の理由を ADR に追記する 決定が無効であることを示す Accepted(承認済み) レビューを経て承認した状態 決定が有効であることを示す Deprecated(非推奨) 承認済みの ADR を技術または業務、その他の理由により推奨しない状態 決定が無効であることを示す Superseded(置き換え) 既存の承認済みの ADR の内容を、更新または代替する新しい ADR を承認した状態 決定が無効であることを示す 承認済みの ADR を随時更新せず、新規 ADR を作成することに注意 他のドキュメントとの違い ADR と類似するドキュメントの 伝統的な アーキテクチャ 記述 や DesignDoc との違いを整理します。 伝統的な アーキテクチャ 記述(Traditional Software Architecture Description) とは、『 Design It! 』にて言及のある、権威的であり成果物に含まれる設計ドキュメントです。膨大で包括的な特徴があります。 DesignDoc とは、特定の機能の設計方針や技術選定をまとめ、開発チーム内での合意形成や意思決定に扱う設計ドキュメントです。 ADR と重複する部分もありますが機能や処理方式に焦点を当てています。DesignDocを作成する場合は、 アーキテクチャ 決定に関する部分を ADR に記載し参照とするのもよいでしょう。 伝統的な アーキテクチャ 記述 DesignDoc ADR 目的 システム全体の アーキテクチャ を記録 特定機能や設計変更の記録 特定 アーキテクチャ 上の決定を記録 スコープ システム全体 特定の機能や コンポーネント 特定の決定やその影響範囲に限定 記録内容 システム全体の構造、依存関係、非機能要件など包括的に記録 機能の設計詳細や技術的 トレードオフ 決定の背景、選択肢、結論、影響を記録 作成タイミング プロジェクトの初期段階から納品までの期間 機能開発前や開発中 機能変更が生じたタイミング 重要な アーキテクチャ 決定が行われたタイミング 利用期間 長期的(システムが稼働する限り) 長期的(機能がある限り) 長期的(決定が有効な間) 更新頻度 低 高 低(承認後の内容は更新せず新たに作成) 更新難易度 高 低 低 形式 権威的で公式 簡潔 簡潔 内容の粒度 詳細かつ包括的 実用的かつ軽量 実用的かつ軽量 主な読者 開発チーム、運用チーム、納品先 開発チーム 開発チーム ADR の管理に GitHub Discussionsを採用した理由 筆者チームのGitHubとの関わり方 のとおり、ツールは GitHub に集約する方針のため、ドキュメント管理も GitHub で運用する前提があります。 GitHub の中でもドキュメントを管理する方法は複数あり、下記4つの候補を検討しました。 Discussions リポジトリ のdocsフォルダ Issues Wiki 比較観点 ADR の GitHub での管理方法の4候補を下記5つの観点で比較します。 構成管理 誰がいつ何を変更したか追跡できるか テンプレートの利用 決まったフォーマットで新規作成できる、または複製できるか 検索性 タイトルや内容を特定ワードで検索できるか フィルターの容易性 他用途のドキュメントと分離できるか ADR の一覧化をできるか ADR にレビューを残せるか レビューコメントをどこに残すか 比較検討 結果 下表の比較結果より、 ADR 管理にはDiscussionsを採用しました。 Discussions リポジトリ のdocsフォルダ Issues Wiki 構成管理 ◎ ◎ ◎ ◎ テンプレートの利用 ◎ ◎ ◎ ◯ 検索性 ◎ ◎ ◎ ◯ フィルターの容易性 ◎ ◯ ◯ ◯ ADR にレビューを残せるか ◎ ◯ ◯ × ◎: 容易に可能 ○: 可能 ×: 不可能または現実的でない Discussions 構成管理(◎) 右上のeditedのプルダウンから追跡可能 ステータス管理の方法から通常のコードと比較して、変更数は少ないため十分と判断 テンプレートの利用(◎) Discussion Templateでテンプレート化可能 .github/DISCUSSION_TEMPLATE/{categoryName}.yaml のようにカテゴリ名の YAML を作成。Issue Templateと異なり YAML のファイル名に規則あり。詳細は公式ページを参照 ディスカッション カテゴリ フォームの作成 検索性(◎) テキスト検索が可能 フィルターの容易性(◎) サイドバーの ADR のカテゴリー選択によるフィルター(1クリック) ラベルでのフィルターも可能 ADR ラベルと ADR のステータスのラベル、関連技術のラベル付与により視認性向上 ADR にレビューを残せるか(◎) Discussion内でのコメントとしてレビュー テーマごとにスレッド化して、スレッド内でリプライ可能 ADR 本体とレビューのコメントが同一ページにあり、思考過程を辿ることができる リポジトリ のdocsフォルダ 構成管理(◎) 明らか テンプレートの利用(◎) テンプレートファイルを用意し、複製利用 検索性(◎) テキスト検索が可能 フィルターの容易性(◯) /docs/ adr 配下に集約することで他のドキュメントと分離 /docs/ adr 配下にフラットに配置するか、 ADR の種類に応じて ディレクト リを切るかは検討の余地ありのため評価は◯ ADR にレビューを残せるか(◯) PRにてレビュー。 ADR から該当のPRを探す手間ありのため評価は◯ GitHub 上からファイルをBlameビューで表示してPRを辿る Issues 構成管理(◎) 右上のEditsのプルダウンから追跡可能 テンプレートの利用(◎) Issue Templateでテンプレート化可能 .github/ISSUE_TEMPLATE/{templateName}.yml でテンプレート化 検索性(◎) テキスト検索が可能 フィルターの容易性(◯) Labelsのプルダウンから ADR ラベルでフィルター(2クリック) Discussionは1クリックのため評価は◯ ADR にレビューを残せるか(◯) スレッド化はできないがフラットにコメント可能なため評価は◯ Wiki 構成管理(◎) revisionsから追跡可能 テンプレートの利用(◯) テンプレートのページを作成し、複製利用 ファイルの複製と比較すると手間があるため評価は◯ 検索性(◯) Wiki 単体に検索機能はないが、 リポジトリ 全体で検索可能なため評価は◯ フィルターの容易性(◯) サイドバーで階層構造を表現できるが手間があるため評価は◯ ADR にレビューを残せるか(×) ADR に追記することでレビューとコメントが可能だが現実的でないため評価は× GitHub Discussionsでの運用で得たTips GitHub Discussionsを用いて、 ADR 管理をシンプルに運用することができます。運用する中で得たTipsを紹介します。 無効な ADR もOpenのままとする ADR のステータスがDeprecated、Rejected、Supersededに変化し、無効な ADR となってもDiscussionはOpenのままで運用します。これは GitHub Discussionsのデフォルトのフィルター条件がOpenなDiscussionのみ表示のためです。無効な ADR 含め一覧で見たいため、無効な ADR もCloseしません。 DiscussionとIssueに関連を持たせる Discssionに記述した ADR がIssueの課題に関連を持つ場合は辿れるように相互にリンクを貼ります。 Discussionsページの検索窓からはIssueは検索範囲外です。Issueやコードを含めて検索したい場合は、 リポジトリ 全体で検索しましょう。 アーキテクチャ の決定を GitHub Copilotに読ませる 2025年3月時点では、 GitHub Copilotは GitHub Discussionsのドキュメントを読み取ることはできないようです。 アーキテクチャ の決定を GitHub Copilotに読ませたい場合は、必要な箇所を リポジトリ のdocsやREADME、copilot-instructions.mdに記載しましょう。 さいごに ADR の目的から構成やステータスを定め、 GitHub Discussionsを用いて ADR を管理する方法を紹介しました。今後の運用で新たな気づきがあれば、改めて記事を投稿したいと思います。 プロジェクトによって ADR の最適な管理方法は異なりますが、1つの例として参考になれば幸いです。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト ADR の例 タイトル: [ ADR _002] 基盤コードの公開方法 ステータス Proposed コンテキスト 案件カスタマイズをする際に基盤のコードを利用し、容易に案件カスタマイズを実施できるようにしたい。 基盤のコードをどのようにパッケージングし、公開するかを検討する。 決定 結論 以下の候補を検討し、 GitHub Packages(npm packages)として公開することとする。 GitHub Packages npm packages Docker Images Monorepo Micro Service 評価の観点は以下。 独立性 基盤コードと案件コードが独立しているか 利用容易性 案件側から容易にパッケージを利用できるか パッケージのインターフェースは便利か カスタマイズ性 案件側で振る舞いを変更できるか 案件側で振る舞いを上書きできるか 拡張性 基盤コードはメンテナンスしやすいか 基盤コードは機能追加しやすいか 方法 独立性 利用容易性 カスタマイズ性 拡張性 GitHub Packages(npm packages) ◯ △ ◯ ◯ GitHub Packages(Docker Images) ◯ △ × △ Monorepo × ◯ ◯ × Micro Service ◯ × ◯ ◯ 採用の選択肢とその理由 GitHub Packages(npm packages) 独立性(◯) - 基盤コードと案件コードで リポジトリ を分割可能 パッケージはバージョニングできるため、基盤コードのバージョン間でも独立している 利用容易性(△) ユーザはnpm installで利用可能 実装にもよるがライブラリ形式のためある程度の利便性 コンポーネント の組み合わせ相当の実装は呼び出し側の責務となり、多少実装コストがある カスタマイズ性(◯) 引数やpropsによって振りまいを変更可能 利用しにくい コンポーネント は独自 コンポーネント で差し替えることが可能 メンテナンス・拡張性(◯) 新しい コンポーネント を追加したり、 コンポーネント のpropsを増やしたりし、機能追加が可能 採用見送りの選択肢とその課題 GitHub Packages(Docker Images) 独立性(◯) リポジトリ を分割できる バージョニングできる 利用容易性(△) Docker Image形式で利用可能 呼び出し側はDocker実行時のパラメータを変更するのみ パラメータが大量になる可能性あり カスタマイズ性(×) パラメータを変更することで振る舞いを変更可能 振る舞いの上書きはできない パラメータ以上の振る舞い変更は不可能 拡張性(△) 実行時パラメータを増やすことで拡張可能 カスタマイズの数だけ実行時パラメータが増えてしまう 引数が大量にあるDocker Imagesは基盤側にとっても案件側にとっても便利ではないと予想 Monorepo 独立性(×) ディレクト リ相当のため、独立性があるかと言われると微妙 案件担当者が基盤コードを直接参照したり、修正できたりする バージョニングできない 利用容易性(◯) npm workspaceなどを使ったライブラリの形式になる ライブラリ形式のため GitHub Packages(npm packages)と同程度か コードのコピペも可能 カスタマイズ性(◯) パラメータを変更することで振る舞いを変更可能 パラメータ以上の振る舞い変更は不可能 メンテナンス・拡張性(×) - バージョニングができないため、基盤コードの修正とリリースが簡単に実施できない Micro Service 独立性(◯) リポジトリ の分割ができる バージョニングができる 利用容易性(×) API を通した呼び出しになる バックエンド機能の共有には便利だが、フロントエンドコードの共有は難しい カスタマイズ性(◯) API のパラメータを変更することで振る舞いを変更可能 API を利用せず、独自実装を用いることで振る舞いを上書き可能 メンテナンス・拡張性(◯) API を拡張していく方式になる 影響 GitHub リポジトリ を新しく作り、その リポジトリ でパッケージング用のビルド スクリプト を書き、 GitHub PackagesにpushするCIフローを書く 公開の際のバージョニングの方法を別途検討する コンプライアンス 基盤コードの リポジトリ を分割し、その リポジトリ からパッケージを公開することで、 GitHub Pacakges(npm packages)経由での利用を案件側に強制することが可能。 基盤コードの リポジトリ についてはアクセス制限を厳密に実施する。 外部メンバーにはwrite, read程度の権限を付与し、mainブランチはブランチプロテクションで制限し、自分たちの知らないところで基盤コードを変更されないようにする。 基盤コードを案件開発者が閲覧し、案件コードにコピペすることは許容する。 参考情報 https://tech.dentsusoken.com/entry/2025/02/25/_%E8%A3%BD%E5%93%81%E3%81%AE%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%9C%80%E9%81%A9%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC 備考 別途案件カスタマイズ時の初期セットアップをサポートするために、Template リポジトリ を作りたい 執筆: @ozawa.hideyasu 、レビュー: @takami.yusuke ( Shodo で執筆されました )
はいどーもー! エンタープライズ 第一本部の宮澤響です! 本記事では、私が運営チームリーダーとして運営を主導した弊社の社内イベントである「AHEAD AWARD 2024」についてご紹介します! (イベントの詳細には社外秘の情報も含まれますが、当然そのような内容は記載できないため、全体的にあっさりめの表現となっています…ご容赦ください…!) (こんなイベントがあるんだな、こんな組織風土なんだな、というようなことを感じ取っていただけたら幸いです…!) (その意味では、弊社について情報収集している就活生やキャリア入社検討中の方向けの記事かなと思います…!) AHEAD AWARDとは? どんなことをするの? 運営チームリーダーをやってみての感想など おわりに AHEAD AWARDとは? AHEAD AWARDとは、「弊社の 行動指針 である『AHEAD』を体現し、弊社や弊社のお客様への貢献度の高い活動を、社員投票によって選定する、社員による社員のためのアワード」とされています。 噛み砕いていえば、2024年に実施されたあらゆる活動の中から自薦形式でノミネートを募り、プレゼンテーションや全社投票を経て受賞活動を決定・表彰するイベントです。 そのため、2025年開催ではあるものの、イベント名はAHEAD AWARD 2024 となります。 なお、他社様においては、フューチャー株式会社の「Best Project of the Year」などが近しいイベントかなと思います。 どんなことをするの? AHEAD AWARD 2024の大まかな流れは以下でした。 (内容は年々アップデートされていきますので、こちらはあくまで今回の内容です!) エントリー AHEAD AWARD 2024にエントリーする活動を、活動代表者の方からの自薦形式で募集します。 対象となる活動は上述のとおり2024年に実施されたあらゆる活動であり、対外的な有償案件だけでなく、自社内の施策や取り組みなども含まれます。 応募にあたっては、活動代表者の方にPRシートと呼ばれる資料を提出していただきます。 PRシートには、活動の概要やアピールポイントなどを記載していただきます。 ノミネート活動選定 運営チームなどが中心となって、エントリーされた活動の中からノミネート活動を選定します。 ノミネート活動に選定された活動は、これ以降の投票やプレゼンテーションに駒を進められます。 事前投票 ノミネート活動のPRシートやPR動画を公開し、全社投票を実施します。 社員のみなさまには、「AHEAD」を体現していると感じる活動に投票してもらいます。 プレゼンテーション ノミネート活動の代表者や関係者がプレゼンテーションを実施します。 プレゼンテーションはオンラインでも配信されるため、現地/オンラインを問わず視聴できます。 当日投票 プレゼンテーションを踏まえた上で、改めて全社投票を実施します。 PRシートやPR動画だけでは分からなかった長所や魅力が反映された投票となります。 表彰 事前投票と当日投票の票数を合算して、受賞活動を決定します。 AHEAD AWARD 2024では、Gold Prize、Silver Prize、Bronze Prizeの3つの賞がありました。 それぞれの賞を受賞した活動に対しては、トロフィーや副賞が贈呈されます。 後夜祭 最後は後夜祭と称した立食形式のミニパー ティー を開催します。 こちらはノミネート活動関係者に限らずどなたでも参加可能です。 弊社の社内同好会である 電通 総研Jazz部のみなさまによる生演奏も行われました。 運営チームリーダーをやってみての感想など まず第一に、運営チームメンバーやノミネート活動関係者のみなさまとの本部・事業部の枠を越えた繋がりができたことが大きな財産になったと感じています。 いわゆる通常の業務ではどうしても同じ部署のメンバーや同じ案件に携わっているメンバーとしか関わりがない状態になりがちなのですが、今回の活動を通して社内の垣根を越えた繋がりを構築できました。 また、弊社の活動を知る良い機会にもなったと感じています。 普段から他部署がどんなことをやっているのかを把握できているわけではなかったため、PRシートやプレゼンテーションなどを通じて他部署の活動内容を知ることができ、弊社全体の業務に対する理解が深まりました。 なお、現在はAHEAD AWARD 2025の運営メンバーに向けた引き継ぎ資料を作成中です。 というのも、AHEAD AWARDの運営チームは、リーダーやサブリーダーは前年の運営メンバーから選出されるものの、基本的にメンバーが毎年入れ替わります。 そのため、ただ開催して終わりというわけではなく、その後の振り返りや引き継ぎが重要となります。 このあたりも最後まできっちりこなしていく所存です。 おわりに 本記事では、弊社の社内イベントであるAHEAD AWARD 2024についてご紹介しました! 本業の傍ら、このようなイベント運営にも手を挙げられるような働き方に興味がある、という方は、チラ見だけでも結構ですので、弊社の 新卒採用サイト や キャリア採用サイト をご覧いただければと思います。 最後までお読みいただき、本当にありがとうございました! 私たちは共に働いていただける仲間を募集しています! みなさまのご応募、お待ちしています! 株式会社電通総研 新卒採用サイト 株式会社電通総研 キャリア採用サイト 執筆: @miyazawa.hibiki 、レビュー: @iwasaka.emari ( Shodo で執筆されました )
注意: 2025年2月現在、WhiskおよびImageFXの商用利用について、 Google は公式な規約を発表していません。 本記事は個人的な検証を行うものであり、現時点では実際のビジネスでの利用は想定しておりません。 生成された画像については私的利用の範囲内に限定します。また、本記事には画像生成AIによって作成されたイラストが多く含まれます。 二次利用 はお控えください。また、本記事で紹介した手法により発生したいかなるトラブルについても弊社は一切の責任を負いません。あらかじめご了承ください。 こんにちは。 エンタープライズ 第一本部 戦略ソリューション 1 部の英です。 普段はWebアプリや スマホ アプリの案件などを担当しています。あと、趣味でAIを勉強しています。 最近登場したWhiskが面白そうなので触ってみます。 Whisk は2025年2月12日から試運転が始まったばかりの新しいサービスです。 1:Whiskについて 2:前置き 3:今回の検証内容について 4:検証 補足:モデルを作るときのプロンプトサンプル さいごに 1:Whiskについて まず、Whiskは Google が提供するこんなサービスです。 詳細についてはコチラの リンク をご参照ください。 冒頭でお伝えした通り、 著作権 や利用範囲に関する明確な記述がないのが現状です。 そのため、本記事を参考としたビジネスシーンでの利用につきましては、利用するご本人様の責任でお願いいたします。 弊社は一切の責任を負いませんので、あらかじめご了承ください。 Whiskでは、スタイルと背景を指定し、その範囲内でモデルを描くことができます。 これまでの画像生成AIではプロンプトを用いて 自然言語 でスタイルや背景を細かく指示していました。 自然言語 でそれらを完璧に表現することが難しく、同じプロンプトでも生成するたびに絵柄が変わってしまうというのがあるあるでした。 今回のWhiskではその「絵柄」を画像ファイルから指定できるようになったと捉えていただければと思います。 この機能を使えば、同じ「絵柄」の画像を量産できるのではないか? そんな野望が芽生えたので、会社のテックブログで消化します。 2:前置き 今回は画像生成AIを取り扱うため、前置きが長めです。お付き合いください。 さて、世の中に画像生成AIが登場して からし ばらく経ちました。 これまで 著作権 についてたくさんの議論が起こっては消滅し、また新たな火種が投下されては論争が起こる。 そんな日々がもう何年も続いています。 個人的な考えですが、日本国内に限定した話ならば、国が定める ガイドライン が絶対的なルールです。これは各自で調べてください。その次に参照すべきは各生成AIツールが定める規約だと思います。 ビジネスマンとして、最低限これらのルールは遵守して利用しなければなりません。 とはいえ、ルールの中でカバーしきれていない倫理的な問題を抱えているのも事実で、これらが「感情論」の一言で片づけられている今の世の中にも問題があるとは思います。個人的なクリエイターの目線でもそう思います。 新しい技術には否定的な意見が付き物です。様々な声を聴きながら技術は少しずつ進歩します。 もしかしたら10年後には新しいルールが策定され、この記事で書いてあることがすべて違法なんてことにもなるかもしれません。その時はその時です。その時になったら、その時の最新のルールの中で最適な判断を下しましょう。 ここはドライに考えないと、価値の創造が止まってしまいます。 3:今回の検証内容について 皆さんはプレゼン資料に差し込む画像素材ってどこで調達しているでしょうか。 商用フリーの素材サイトもあれば、買い切りの素材サイトなど色々ありますよね。 今回はWhiskを活用して、欲しい素材を自分で作る実験をしてみます。 もう一度言います。実験です。 前述の通り、Whiskでは「絵柄」の指定ができます。 有名な素材サイトだと「いらすとや」という素晴らしいサービスがありますが、イラストの絵柄が特徴的ですよね。 この絵柄を継承した「AIいらすとや」というサービスがあります。 では、その「AIいらすとや」が生成した画像の 著作権 についてはどうか。 これはサービスの規約にこのように明記されています。 ※引用: AIいらすとや これも当然かと思います。 なぜならばプロンプトを書くのはサービスの利用者であり、プロンプトに基づいて新しい画像が生成されます。 プロンプトという自由入力に対して、サービス側が責任を持つことはあまりにも荷が重すぎます。 例を挙げるとするなら、AIいらすとやを開いて、ピ〇チュウとでも入力してみてください。 危ない。ほんとに危ない。 周りの可愛いやつらはまだよいですが、モザイクをかけた部分なんてほぼピ〇チュウです。 人間が描いた絵も、AIが描いた絵も、アウトプットが既存の著作物に類似しているかという観点が重要です。 私が手書きで ピカチュウ のイラストを描いて1枚100円で売ったら明らかに 著作権侵害 ですし、AIで ピカチュウ のイラストを描いて1枚100円で売っても 著作権侵害 です。手法が違うだけで犯している問題は同じ。 もし、このような問題に対してサービス側が責任を負うならば、 絶対に安全な画像しか生成されない定型文 を何度も検証し、ユーザーはその定型文から選択するだけみたいなUI/UXに縛らないといけません。 そんな仕様では、t2iのサービスとしては破綻してしまいます。誰も使わず寂れていくだけでしょう。 だからこそ使い方には制限をかけず、生成された成果物に対する責任の考え方について規約で明確にしているのだと察します。 ちなみに、Sunoのような音楽生成のサービスでも同じようなルールが採用されています。自己責任だということです。 ※引用: Suno さて、ではWhiskはどうでしょうか。 Whiskにはこのように記載があります。 規約のリンク先では 生成してはいけないもののリスト が公開されています。そして、生成におけるコン トロール の主体はユーザーだと言っています。つまり、生成されたものが著作物に似すぎたり、グロすぎたり、性的だったりしたらユーザーが責任をもってプロンプトで指示内容を調整しないといけません。 例えば、Whiskのスタイルに 鳥山明 先生のイラスト、背景にディズニー映画、モデルにピ〇チュウの画像を指定して画像を生成したとしましょう。これを商用利用してしまった日には大炎上確定です。 確定演出で画面が虹色に輝いて、スピーカーからキュインキュイン音が鳴るでしょう。ついでにクビになります。 ※ほんとに見せられません 4:検証 今回はできるだけ安全に使いたいので、手書きのイラストをベースにします。 私が5分で描きました。このイラストの 著作権 は私にあります。 ビジネス向けのイラストってだいたいこんな顔してますよね。 これをスタイルに差し込んで、背景は無地を指定します。 プロンプトをいじりながらいくつか画像を生成してみましょう。 1.サッカーをしている少年 ※モデルはプロンプトにより生成(A simple, monochrome, single-line flat illustration of a young boy playing soccer. He has short, slightly messy hair and is wearing a sports jersey and shorts. He is kicking a soccer ball with one foot, with motion lines around the ball to emphasize movement. His expression is focused and energetic. The illustration is minimalistic, using clean, continuous black lines on a white background, without shading or extra details.) 2.何かをひらめいたビジネスマン ※モデルはプロンプトにより生成(A simple, monochrome, single-line flat illustration of a young boy playing soccer. He has short, slightly messy hair and is wearing a sports jersey and shorts. He is kicking a soccer ball with one foot, with motion lines around the ball to emphasize movement. His expression is focused and energetic. The illustration is minimalistic, using clean, continuous black lines on a white background, without shading or extra details.) 3.ランチを食べている女性 ※私の絵と似ていないものはモザイクをかけています ※モデルはプロンプトにより生成(A simple, monochrome, single-line flat illustration of a woman eating lunch. She has shoulder-length hair and is wearing a casual outfit or business attire. She holds a lunch box, sandwich, or bowl in one hand and a utensil in the other. Her expression is relaxed and content. The illustration is minimalistic, using clean, continuous black lines on a white background, without shading or extra details.) 4.運転をしている男性 ※私の絵と似ていないものはモザイクをかけています ※モデルはプロンプトにより生成(A simple, monochrome, single-line flat illustration of a man driving a car. He has short hair and is wearing a casual shirt or suit. He grips the steering wheel with both hands, looking forward with a neutral or focused expression. The illustration is minimalistic, using clean, continuous black lines on a white background, without shading or extra details.) 5.プレゼンをしている男性 ※モデルはプロンプトにより生成(A simple, monochrome, single-line flat illustration of a man giving a presentation. He has short hair and is wearing a suit with a tie. He is standing confidently, gesturing with one hand while holding a pointer or remote control in the other. A simple presentation board or screen with minimal bar charts or graphs is in the background. The illustration is minimalistic, using clean, continuous black lines on a white background, without shading or extra details.) 補足:モデルを作るときのプロンプトサンプル 目的 プロンプト 効果 白黒の線画にする black and white line art, high contrast, pen and ink style, no grayscale グレーの階調を徹底的に排除し、ペン画風のメリハリある線画を得やすくなる。 一本の線で描くようにする single continuous line drawing, one-line art, minimal detail 一本の流れるような線で描いたシンプルなイラストを生成しやすくなる。 フラットなデザイン flat vector-style illustration, minimal shading, no gradients 奥行きや立体感を抑え、 ベクター アートのようなフラットな仕上がりを得やすくなる。 描き込みを減らす ultra-minimalist design, reduce extraneous details, simple lines 余計な装飾を削ぎ落とし、シンプルで視認性の高いイラストを得やすくなる。 さいごに けっこう期待していたのですが、全体的に「なんとなく絵柄が似ているかもな」くらいの印象です。 これは私の手書きイラストのクオリティが低かったことが原因だと思います。 画力に自信のある人は手元の環境でぜひ試してみてください。 まだ実験段階とはいえ、無料でこのクオリティのサービスを提供する Google には頭が上がりませんね。 これを悪用して素材サイトで販売しようかな?とか思わない方がよいです。 今後、画像生成AIに関する世の中の考えかたや法律がどのように変わっていくか静観しましょう。 これからも AWS やAI関連の検証記事をたくさん書いていきます。 ↓ のスターを押していただけると嬉しいです。励みになります。 最後まで読んでいただき、ありがとうございました。 エンタープライズ 第一本部では一緒に働いてくださる仲間を募集中です。以下のリンクからお願いします。 私たちは一緒に働いてくれる仲間を募集しています! 中途採用-エンタープライズ第一本部 新卒採用-エンタープライズ第一本部 執筆: 英 良治 (@hanabusa.ryoji) 、レビュー: @nakamura.toshihiro ( Shodo で執筆されました )
こんにちは。 エンタープライズ 第一本部の新人、佐藤悠です。 はじめに 筆者について AIFの概要 AIFで問われるAWSサービス Amazon SageMaker [2] Amazon SageMaker Clarify [3] Amazon SageMaker Canvas [4] Amazon Bedrock [5] Amazon Bedrock ガードレール [6] その他のサービス AIFで問われる概念 責任あるAI [7] 機械学習の手法 LLMに関して 学習教材 CloudLicense Hands on for Beginers Amazon Bedrock Overview まとめ 参考にしたサイト はじめに 表題の通り AWS Certificated AI Practitioner(以下:AIF)に合格しました。 AIFは最近できた試験で問題集や調べて出てくる情報も少ないため概要や問われたサービス群、おすすめの学習方法を記します。 筆者について 学部は文系で情報を一切やっていない 大学院ではAIに関して研究 AWS 触り始めて半年 AIFの概要 AIFとは AWS 認定の公式ページ[1]によると以下のような知識を問う資格です。 AWS Certified AI Practitioner は、 人工知能 (AI)、 機械学習 (ML)、生成 AI の概念と ユースケース に関する需要の高い知識を実証します。 AIを活用する際にどのような手法を用いるべきかということが主に問われます。AIの活用はLLMが登場してから、さらに活発に行われてきた背景があり、この資格自体も最近できた比較的新しいものになります。 AIFで問われる AWS サービス 試験で問われる主な AWS サービスを紹介します。 Amazon SageMaker [2] 広く採用されている AWS の 機械学習 と分析機能をまとめた Amazon SageMaker は、分析と AI のための統合エクス ペリエ ンスを、すべてのデータに対する統合アクセスとともに提供します Amazon SageMaker Clarify [3] モデルの評価とモデル予測の説明 Amazon SageMaker Canvas [4] ビジュアル インターフェイス を使用して非常に正確な ML モデルを構築します Amazon Bedrock [5] 基盤モデルを使用して生成 AI アプリケーションを構築およびスケーリングする最も簡単な方法 LLMの文脈で問われた際にはこのサービスがほぼ必ず問われます。 頻繁に問われる内容としてはLLMの出力調整はプロンプトで行う点であったり、温度(Temparature)が回答のランダム性を生み出したりする点などがあげられます。 また、課金は基本的に トーク ンという言語をAIで扱う際の基本単位で決まるため入力や出力できる文字数の制限もでき、こちらも問われました。 トップPは確率的にとりうる選択肢を絞ります。 トップKは選択肢を上から指定した数だけ絞ります。 これらは生成される文章の多様性に影響します。 Amazon Bedrock ガードレール [6] Amazon Bedrock ガードレールには、生成 AI アプリケーションを大規模に安全に構築するのに役立つ設定可能な保護手段が用意されています これに関して例を挙げると子ども向けのLLMを構築する際に不適切な内容を表示しないようにするには?というような ユースケース でこのサービスを活用する方法が問われました。 その他のサービス 機械学習 (ML)と生成AI(LLM)の文脈で設問が設定されている時には以上のサービスに加えて OCR の Amazon Textractや感情分析の Amazon Comprehendなどが問われていました。これはAIの文脈以外でも頻繁に耳にするサービスではあるのでCloud Practitionerを取得した人ならば理解できる範囲の内容だとは思います。 この他にはAIそのものではないですが、生成AIエンドポイントにアクセスしたログの取得にCloud Trail,データの保存にS3,データの読み出しができない場合のポリシーの設定などもAI関連のソリューション提供の際に考えられる課題の一種で出題されました。 AIFで問われる概念 次にサービスとは異なる観点で出題される内容です。 責任あるAI [7] 公平さ 説明可能性 プライバシーとセキュリティ 制御性 正確性と堅牢性 ガバナンス 透明性 特に公平さと透明性に関して問われることが多かったです。 機械学習 の手法 線形回帰 ロジスティック回帰 サポートベクターマシン 決定木 ニューラルネットワーク 敵対的生成ネットワーク(GAN) k-means これは AWS のサービスには関係なく 機械学習 を使用する例においてどの手法を使用するべきかということを選択する形式の問題が出題されました。 どのような分析に使用され、どのような結果を出すかをセットでわかっていれば良いというレベルで数学的な観点は問われないので過度な心配は不要です。各手法について軽く調べてみてください。 LLMに関して トーク ン 埋めこみ プロンプトエンジニアリング RAG 近年、流行りのLLMに関する背景知識と応用の手法を問われます。 トーク ンや埋め込みLLMの基礎に関してはTransformerが登場した論文、(Attention Is All You Need)とBERTの論文、(BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding)などを読むと分かります。 有名な論文なので解説記事は山ほどあります。是非そちらも参考にしてみてください。 プロンプトエンジニアリングに関しては、期待する質問と回答のセットを渡すと回答の精度が向上する手法few-shotなどが出題されました。LLMを用いてどうやったら期待した回答を生成させれるか試してみると遊びながら勉強になるので良いと思います。 学習教材 CloudLicense https://cloud-license.com/ 他の資格に比べて学習できる問題数は少ないのでAIFのためだけに有料プランに加入するのはややもったいない感じもしますが、他の資格をすでにこちらで勉強していた人にはおすすめです。私はこれを一周し間違った問題のみを二周しました。 Hands on for Beginers https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-AIML-2022-reg-event.html?trk=aws_introduction_page 初学者向けのハンズオンです。AI/MLに関するリソースを実際に作成し操作することで理解が深まります。 Amazon Bedrock Overview https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2024_Amazon-Bedrock-Overview_v1.pdf 分かりやすくBedrockの概要をつかむことができます。ここで マッピング した知識をもとに公式ドキュメントを読みに行くと、さらに理解が深まります。 まとめ AWS リソースだけでなくAIに関する基本的な概念を理解できる良い試験でした。 今後も必須になってくるAIと クラウド にこの試験から入門してみませんか? 受験を控えている人は参考になれば幸いです。 参考にしたサイト [1] https://aws.amazon.com/jp/certification/certified-ai-practitioner/ [2] https://aws.amazon.com/jp/sagemaker/ [3] https://aws.amazon.com/jp/sagemaker-ai/clarify/ [5] https://aws.amazon.com/jp/bedrock/ [6] https://aws.amazon.com/jp/bedrock/guardrails/ [7] https://aws.amazon.com/jp/ai/responsible-ai/ 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 新卒採用サイト 執筆: @sato.yu 、レビュー: @nagamatsu.yuji ( Shodo で執筆されました )
こんにちは、グループ経営ソリューション事業部でエンジニアをしている大浦です。 今回は、製品開発と切っても切れないアドオンの実現方法と、その選択がもたらす影響についてお話します。 製品におけるアドオン アドオンは本当に必要か? アドオンの実現方法 方法1. 製品のコードベースを直接編集する(モディフィケーション) 特徴 モディフィケーションの例 補足 考察 方法2. アドオンしたい機能のコードをコピーして別機能として作成する(コピーカスタマイズ) 特徴 コピーカスタマイズの例 考察 方法3. アプリケーションを拡張可能にし、実装を追加する(プラグイン) 特徴 プラグインの例 元コードへの拡張ポイント作成 拡張ポイントとして追加されたApproverProviderFactoryの実装 考察 アドオン方式選定まとめ 製品におけるアドオン アドオンとは、製品の標準機能を補完・拡張する追加要素です。 特定の顧客にとって重要だが標準機能では実現出来ない要件を実現する場合に選択肢となります。 アドオンは本当に必要か? いきなり結論を覆すように聞こえるかもしれませんが、まず強調したいのは、 「製品にアドオンすることが本当に最善の解決策かを十分に検討することの重要性」 です。 アドオンがもたらす影響として以下のようなものがあります。 複雑性の増加: アドオンを追加することで製品のコードベースは複雑になり、メンテナンスが困難になります。 サポートの負荷増: 顧客ごとのカスタマイズは、サポートチームにとっても大きな負担となります。 ドキュメントの不足: アドオンは製品標準の機能に比べてドキュメントが不十分になりがちです。 バグの特定が困難: 問題が発生した際に、製品固有の問題なのかアドオンの問題なのか判別が必要であり、切り分けが難しくなります。 できる限り、製品標準の機能で顧客の課題を解決できないかを模索しましょう。 もし顧客固有の要望を、適切に抽象化し標準機能として取り込めれば、製品の価値向上が期待でき、顧客にも喜ばれます。 しかし、現実には製品標準だけでは顧客の重要な課題を解決できない場合もあります。 製品開発において標準機能で実現する可能性は考えつくしたけれど、様々な理由で無理だと分かった場合に、どのようにアドオンを実現すべきかを考えてみましょう。 アドオンの実現方法 アドオンの実現方法は色々考えられます。 製品のコードベースを直接編集する(モディフィケーション) アドオンしたい機能のコードをコピーして別機能として作成する(コピーカスタマイズ) アプリケーションを拡張可能にし、実装を追加する( プラグイン ) etc(マイクロサービス化、イベント駆動による拡張、 API 連携、...) 私はアドオンの実現方法はソフトウェア アーキテクチャ の一部だと考えています。 書籍「ソフトウェア アーキテクチャ の基礎」には、以下の原則が書かれています。 ソフトウェア アーキテクチャ は トレードオフ が全て 「どうやって」よりも「なぜ」の方がずっと重要 (引用: ソフトウェアアーキテクチャの基礎 ) アドオンの実現方法も、どの方法が良いかはコンテキストに依存します。 製品のアドオン実装担当になった場合には、自身の置かれているコンテキストを考慮して判断することが必要です。 以下でそれぞれの方法の特徴を見ていきます。 方法1. 製品のコードベースを直接編集する(モディフィケーション) 1つ目は、製品のコードベースに直接必要な変更を行うモディフィケーションです。 特徴 Pros: 開発が迅速に行うことができ、あらゆる変更が可能 (○短期的な開発効率, パフォーマンス) Cons: コードベースが複雑化し、顧客数やバージョンが増えるごとに管理が困難 (×保守性, 拡張性) モディフィケーションの例 例えば、経費精算申請の例を考えてみます。(架空のコードです)。 以下のような Java コードで申請処理が実現されているとします。 public KeihiService { public void apply(KeihiRequest request) { // 申請内容の確認 checkRequest(request); // 合計金額の計算 calculateTotal(request); // 申請承認者の設定 setApprover(request); // 申請実施 submitRequest(request); } } ここで、今回アドオン要望としてA社から来た「申請者自身がマネージャの時は承認者を役員にする」という機能をモディフィケーションで実現します。 public KeihiService { public void apply(KeihiRequest request) { // 申請内容の確認 checkRequest(request); // 合計金額の計算 calculateTotal(request); // 承認者の設定 // A社アドオン: 申請者自身がマネージャの時は承認者を役員にする String applicantRole = request.getApplicant().getRole(); if ( "Manager" .equals(applicantRole)) { setExectiveApprover(request); } else { setApprover(request); } // 申請実施 submitRequest(request); } } 少しコードからいやな臭いがしてきましたが、実装自体はサクッと終わります。 次に、B社から続けて「プロジェクトを指定した場合は、承認者をプロジェクト管理者にする」という要望が来たとします。 A社に続きB社の要件もモディフィケーションで対応してみます。 public KeihiService { public void apply(ExpenseRequest request, Project project) { // 申請内容の確認 checkRequest(request); // 合計金額の計算 calculateTotal(request); // 承認者の設定 // A社アドオン: 申請者自身がマネージャの時は承認者を役員にする String applicantRole = request.getApplicant().getRole(); if ( "Manager" .equals(applicantRole)) { setExectiveApprover(request); // B社アドオン: プロジェクトを指定した場合は、承認者をプロジェクト管理者にする } else if (project != null ) { setProjectOwnerApprover(request, project); } else { setApprover(request); } // 申請実施 submitRequest(request); } } B社アドオンの実装者が実装しようとした際、コードには既に「A社アドオン」が実装されています。 実装者はそれを壊さないように実装しなければなりません。 補足 今回お話したい内容と少しずれてしまいますが、上記コードには気になる点があります。 B社の環境においてA社のアドオンの機能が動いてしまうかもしれない。 → これがB社にとって意図しない振る舞いとして現れた場合、顧客からの問合せとして顕在化します。 applyの引数にB社のアドオンでしか利用しないprojectが追加されている。 → B社のアドオン実装のみにフォーカスして実装するとこのような変更をしてしまうことがあります。この変更が妥当かは十分な議論が必要です。 実装者もレビューアも、上記のような観点を持つ必要があります。 Feature Toggle(機能の切り替え機構)や、条件分岐の整理のためにStrategyパターンの適用を検討すると意図しない副作用を減らせる可能性があります。 考察 モディフィケーションでの実現は短期的には効果的ですが、長期的には技術的負債を増やすリスクがあります。 新機能の追加やバージョンアップ時に大きな障害となる可能性が高いです。 方法2. アドオンしたい機能のコードをコピーして別機能として作成する(コピーカスタマイズ) 2つ目は、アドオンしたい機能のコードを顧客ごとに全てコピーし、別機能として作るコピーカスタマイズです。 特徴 Pros: 製品標準のコードは維持される、他の顧客向けに影響が出にくくなる (〇独立性, パフォーマンス) Cons: 冗長性が増し、差分管理しなければならないコードが多くなる(×保守性, 拡張性) コピーカスタマイズの例 モディフィケーションの例と同じ要件がA社、B社からそれぞれ来た場合にコピーカスタマイズで実現する場合を考えます。 A社アドオン「申請者自身がマネージャの時は承認者を役員にする」 public KeihiServiceForCompanyA { public void apply(KeihiRequest request) { // 申請内容の確認 checkRequest(request); // 合計金額の計算 calculateTotal(request); // 承認者の設定 // A社アドオン: 申請者自身がマネージャの時は承認者を役員にする String applicantRole = request.getApplicant().getRole(); if ( "Manager" .equals(applicantRole)) { setExectiveApprover(request); } else { setApprover(request); } // 申請実施 submitRequest(request); } } B社:「プロジェクトを指定した場合は、承認者をプロジェクト管理者にする」 public KeihiServiceForCompanyB { public void apply(ExpenseRequest request, Project project) { // 申請内容の確認 checkRequest(request); // 合計金額の計算 calculateTotal(request); // 承認者の設定 // B社アドオン: プロジェクトを指定した場合は、承認者をプロジェクト管理者にする if (project != null ) { setProjectOwnerApprover(request, project); } else { setApprover(request); } // 申請実施 submitRequest(request); } } モディフィケーションとの違いは、KeihiServiceクラスをコピーし、それぞれA社向け経費精算申請(KeihiServiceForCompanyA), B社向け経費精算申請(KeihiServiceForCompanyB)というクラスを作成してそれぞれ実装している所になります。 これにより、モディフィケーションの時に不安になった、「B社で動作する際のA社アドオンの影響」を軽減することが出来ます。 考察 複数社のアドオン実装が同一コードに入り乱れる複雑さは防げますが、管理するコードベースの量は増えます。これはモディフィケーションとは違ったコードベース管理の煩雑さ(例えば、Gitのブランチ運用やCI/CDパイプラインでの対処など)が発生します。 方法3. アプリケーションを拡張可能にし、実装を追加する( プラグイン ) 3つ目は、拡張ポイントを製品側に作り、その実装を追加することで実現する プラグイン です。 特徴 Pros: 必要な部分だけを拡張でき、アドオン機能を持続的に維持しやすい (○保守性, 拡張性, 再利用性) Cons: 拡張ポイントの設計が難しく、開発初期のコストが高くなります。(×開発効率, 複雑性, パフォーマンス) プラグイン の例 ここではあらかじめ「承認者の設定ロジックには顧客毎に違った要件が出る可能性が高い」ということが見えている前提でお話します。(このような観点はビジネスサイドが持っていることが多いです。) 元コードへの拡張ポイント作成 以下のように、元のコードにおける申請承認者の設定処理を、ApproverProviderFactoryというクラスを利用することで、実際の処理をApproverProviderに委譲します。 (注: 今回のコードでは、 Java で広く使われている Spring Framework の依存性注入を利用しています。) @Service public KeihiService { @Autowired private ApproverProviderFactory approverProviderFactory; public void apply(KeihiRequest request) { // 申請内容の確認 checkRequest(request); // 合計金額の計算 calculateTotal(request); // 申請承認者の設定(拡張可能な実装) approverProviderFactory.get().setApprover(request); // 申請実施 submitRequest(request); } } 拡張ポイントとして追加されたApproverProviderFactoryの実装 元コードに埋め込んだApproverProviderFactoryの実装です。 少し複雑ですが、get()では以下のルールの通り、ApproverProviderインターフェースの実装クラスの数を見て、適切なApproverProviderの実装クラスを返却しています。 ApproverProviderの実装クラスが1つの場合には、デフォルトの実装(DefaultApproverProvider)を返却します。 ApproverProviderの実装クラスが2つの場合には、デフォルト でない 実装を返却します。 @Component public class ApproverProviderFactory { @Autowired private ApplicationContext applicationContext; public ApproverProvider get() { // ApproverProvider インターフェースを実装している全ての Bean を取得 Map<String, ApproverProvider> beans = applicationContext.getBeansOfType(ApproverProvider. class ); int count = beans.size(); if (count == 1 ) { // 実装が1つしかなければ、アドオンは無いのでDefaultApproverProviderを使う return applicationContext.getBean(DefaultApproverProvider. class ); } if (count == 2 ) { // 実装が2つあれば、アドオン実装があるとみなし、DefaultApproverProviderでない実装を使う for (ApproverProvider provider : beans.values()) { if (!(provider instanceof DefaultApproverProvider)) { return provider; } } } throw new IllegalStateException( "Unexpected number of ApproverProvider implementations: " + count); } } 製品標準の機能としては、ApproverProvider実装としてDefaultApproverProviderクラスを実装しておきます。もし振る舞いを変えたい場合は、期待するアドオンの動作を別のApproverProviderの実装クラスとして定義します。ApproverProvierのアドオン実装が存在する場合には、実装クラスが2つになるため、アドオンした実装クラスが使われます。 こうすることで、元のコードに変更を加えることなく振る舞いの変更を実現できます。 今までの例で言えば、A社向け、B社向けそれぞれの振る舞いをするApproverProviderの実装クラスを作成します。それらの実装クラスを製品とは別のjar(以下、アドオンjar)として切り出し、製品コードの起動時に顧客に対応するアドオンjarを読み込むことで、製品コードに手を入れることなく、最小限の差分のみを管理することでアドオンを実現することができます。(=SOLID原則の1つであるオープン・クローズド原則に従い、新たな機能追加を既存コードの変更なしに実現できる点が大きなメリットです。) 考察 プラグイン は、設計と実装には高度な技術が必要ですが、その分将来的な拡張性と保守性が向上します。一方、上手く プラグイン 化出来たとしても、その箇所に変更があまり入らない場合は、余計な複雑さを埋め込んでしまいます。 アドオン方式選定まとめ 得られる特性 (〇) 失われる特性 (×) モディフィケーション 短期的な開発効率, パフォーマンス 保守性, 拡張性 コピーカスタマイズ 独立性, パフォーマンス 保守性, 拡張性 プラグイン 保守性, 拡張性, 再利用性 開発効率, 複雑性, パフォーマンス ここまで、3つのアドオン実現手法を紹介しました。 繰り返しになりますが、どの方法が良いかはコンテキストに依存します。 今回はモディフィケーションだと辛くなり、 プラグイン が有効となりそうなコードを例として書きました。ですが例えば「実現したいアドオン機能は後ほど製品の標準機能に取り込む可能性が高い」ということが分かっている場合は、迅速に実現できるモディフィケーションを選択することが妥当となるケースは十分に考えられます。 また「顧客ごとの完全なカスタマイズが求められ、他の顧客への影響を避けたいケース」であれば、コピーカスタマイズが最も良い選択肢となるかもしれません。 ここに挙げていない方式が妥当であることもあり、様々なメンバーと議論しながら妥当なものを選ぶことが重要です。 エンタープライズ アプリケーションの製品開発はビジネスサイドまで含めたコンテキストを加味した判断の連続です。 これからも、 トレードオフ を意識して議論し判断しながら、今後も製品開発を推進していきたいと考えています。 最後までお読みいただき、ありがとうございます。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @oura.osamu 、レビュー: @nakamura.toshihiro ( Shodo で執筆されました )
はじめに クロス イノベーション 本部 クラウド イノベーション センター新卒2年目の宮崎です。 先日、 AWS のre:Inventに参加させていただきました。 個人的にハンズオンやGameDayに参加し、手を動かすことで スキルアップ しようと思い参加しましたので、参加して面白かったワークショップについてご紹介します。 re:Inventとは 下記記事に記載しております、ご興味がある方はご覧ください。 AWS re:Invent 2024とAWS GameDayについて ワークショップとは ワークショップは、約2時間程度のハンズオン型セッションです。各自のPCを使って新機能やサービスに実際に触れながら学べる場となっています。短時間で実践的にスキルを習得できるため、普段触れない技術に初めて挑戦する絶好の機会でもあります。 AWS re:Inventでは、新しいサービスを活用したワークショップが多く開催されていました。 一方で、JP Contents Hubというものに、多くのハンズオン・ワークショップがまとめられており、非常に便利です。 既存のサービスについて、机上の知識だけでなく実際に触れて動かしてみたい方には特におすすめのコンテンツになっていますので、ご興味がある方は手を動かしてみてください。 JP Contents Hub 英語ワークショップ情報 今回紹介するワークショップ 題名:SUP303 | Amazon Q を使用して運用および セキュリティインシデント の再発を防ぐ 内容(翻訳) AWS サポートケース、 AWS Trusted Advisor の推奨事項、 AWS Health 通知などの AWS 運用データを使用して、 Amazon Q Business の機能を見るもの。 冒頭で述べた各データを Amazon Q Business に取り込むことで、複雑なデータモデルを理解しなくても、 自然言語 での会話、根本原因の解明を行うことが可能になる。 AI アシスタント( Amazon Q Business)は、基礎となるデータソースへの直接リンクに裏打ちされたコンテキストに応じた回答を提供し、必要に応じてさらに調査できるようにする。 このワークショップでは、環境からのデータの収集、 Amazon Q Business アプリケーションの作成、データのインデックス作成、IT サービス管理 (ITSM) システム (ServiceNow、Jira、Zendesk など) との統合についても説明があった。 これにより、独自のプレイブック/ナレッジベースを使用してコンテキストに応じた推奨事項を受け取り、それらの推奨事項を実行して、パフォーマンスと信頼性に優れた AWS 環境を実現できるという内容。 前提知識 AWS には、サポートケースや Trusted Advisor、 AWS Health など、様々なデータが存在します。 これらを活用しようとしても、データがアカウントごとに散在していたり、適切な分析手段がなかったりすると、なかなか思うように可視化・活用できません。 そこで登場するのが、QSI (Support Insights with Amazon Q) です。 Amazon Q Business の生成 AI 機能を活用することで、選択したアカウント全体のサポートケース、Trusted Adviso、Healthデータから洞察や推奨事項を得て、可視化や情報の活用につなげることができるソリューションです。 QSI (Support Insights with Amazon Q) ※実態はCloud Formationで AWS リソースが作成できるテンプレートが含まれているものです、詳細は アーキテクチャ 図の部分で解説します。) QSI (Support Insights with Amazon Q) の詳細 参考: https://github.com/aws-samples/support-insights-with-amazon-q?tab=readme-ov-file 実際の アーキテクチャ 図は下記です。 ハンズオンではこの仕組みづくりを行いました。 Amazon Q Business を活用して AWS サポートデータを分析する仕組み 図からわかるQSIの構成要素 各アカウントの役割 ○DataCollection Account側(上部) スコープ内すべてのアカウントから、S3へそれぞれの情報を格納する中央集権アカウント。 ○Linked Account DataCollectionアカウント以外のアカウントで、 AWS サポートデータ( AWS サポートケース、Trusted Advisor、Health)を持っているアカウント。 参考情報 AWS Support AWS Trusted Advisor AWS Health 機能構成 ■ Amazon Q Business コンポーネント ユーザーがチャット形式でデータにアクセスし、 自然言語 で対話的に洞察を得られる環境。 Amazon Q Business アプリケーションと Web エクス ペリエ ンス モジュールが含まれている。 参考リンク ○ Amazon Q Web インターフェース チャットボットが稼働するウェブ画面。ユーザーはブラウザ上で “英語 or 日本語” (現時点では日本語対応無し)などの 自然言語 で質問し、リアルタイムに回答や推奨事項を得ることができる。 ○ Q Business Application Q Web インターフェースの背後にあるコアのアプリケーション。データソースや生成 AI エンジンとの連携を担っている。 ■ AWS Support Collectorモジュール 組織内の各 AWS アカウント(Linked Account)から、サポートケース/Trusted Advisor/ AWS Health といったデータを定期的に収集し、中央アカウント(Data Collection Account)の S3 バケット へアップロードする仕組みのモジュールです。 参考リンク ○ AWS Lambda & EventBridge リンクされたアカウントから定期的に各情報を取得するためのもの。 Lambda 関数と EventBridge (Scheduler) を組み合わせてスケジューリングして実行している。 ○ S3 バケット それぞれのデータソース(サポートケース、Trusted Advisor、Health)から収集した JSON 形式のサポートデータは、中央の Data Collection Account にある S3 バケット へアップロード。そこから Q アプリケーションが読み取り、インデックス化してチャットボットの応答に活用していく。 ハンズオンではQSI を構成する大きく これらの部分をデプロイしました。 ハンズオンを始める前の前提条件 ハンズオンを開始する前に、以下の前提条件があり下記の内容を実施しました。 IAM Identity Center の有効化の確認 SAML 2.0 に対応した IdP(Identity Provider)として IAM Identity Center が設定されている必要があります。また、少なくとも1人以上のユーザー(有効なメールアドレス)がプロビジョニングされている必要があります。 詳細については下記を参照してください。 https://docs.aws.amazon.com/singlesignon/latest/userguide/get-set-up-for-idc.html Amazon Q Business の対応リージョンの確認 Amazon Q Business を使用する場合は、対応するリージョンで操作を行う必要があります。 対応リージョンの一覧は下記を参照してください。 注意:日本(東京リージョン)は現時点では対応リージョンに含まれていません。 Amazon Qを触ってみたい方は、日本リージョン以外の対応リージョンを選択して操作を進めてください。 対応リージョンの一覧: https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/quotas-regions.html IAM Identity Center で多要素認証(MFA)の有効化 IAM Identity Center の多要素認証(MFA)はデフォルトで無効化されています。そのため設定を行い有効化します。 アイデンティティ ストアへのユーザー作成 IAM Identity Center インスタンス 内で少なくとも1人のユーザーが必要です。そのため、 アイデンティティ ストアにユーザーを作成します。 Q Business アプリケーションへのユーザー割り当て 前手順で作成したユーザーを Q Business アプリケーションに割り当てる必要があります。これを行わない場合、 Amazon Q Web エクス ペリエ ンスにアクセスしようとした際に「アクセスが拒否されました」というメッセージが表示されます。 S3 バケット の準備 管理アカウント(または Data Collection Account)に、 AWS サポートデータを格納するための S3 バケット を作成しておきます。 ※実際のAmazonQへログイン後の画面 ・IAM アイデンティティ センターで作成したユーザをQアプリに割り当てることで、そのユーザー情報でQアプリにアクセスすることができました。 デプロイ手順 CloudFormation テンプレートを入手 GitHub から以下のファイルをダウンロードします: https://github.com/aws-samples/support-insights-with-amazon-q/blob/main/src/q_application/amazon-q-cfn.yaml CloudFormation スタックの作成 https://console.aws.amazon.com/cloudformation/home を開き、リージョンを Amazon Q Business 対応リージョン に設定します。 「スタックの作成」 → 「新しいリソースを使用」 を選択し、ダウンロードした amazon -q-cfn. yaml をアップロード。 スタックの名前を例として amazon -q-cfn とし、以下のパラメータを入力 ①IAMIdentityCenterARN: IAM Identity Center インスタンス の ARN (IAM Identity Center コンソール → [設定に移動] → ARN コピー) ②QBusinessApplicationName: Q アプリケーション名 (任意) ③S3DataSourceBucket: サポートデータを置く S3 バケット 名 (例: qsi-app-data-ACCOUNT_ID) 最終画面で IAM ロール作成に同意し、スタックを作成。 スタックのステータスが CREATE_COMPLETE になるまで待機(約10分)。 ここで作成されたリソース 構成図の部分で前述した各リソースが作成されました。 Amazon Q Business コンポーネント AWS Support Collectorモジュール S3データソースコネクタ Web エクス ペリエ ンス (チャットインターフェース) インデックスユニット(初期は20,000件までのドキュメントを登録可能) データソースの同期 本テンプレートで作成したデータソース(サポートケース、Trusted Advisor、Health)は、毎日 UTC 深夜に S3 バケット 内のデータを同期するようにスケジューリングされています。 バケット 内にサポートデータ(あるいは合成データの zip 解凍結果)を配置すると、下記の手順で即時同期も可能です。 Amazon Q コンソール を開き、先ほど作成した Q アプリケーション名 を選択。 「データソース」のメニューから、S3データソースを手動で同期 (Sync) できます。 同期が完了すると、サポートデータがインデックス化され、Q Business 上で検索対象となる。 ユーザーのアクセス設定 Identity Center 上で Q Business へのアクセスが許可されたユーザー(またはグループ)を追加しておく。 CloudFormation の展開時に指定した IAM Identity Center ARN と連携されているため、Q Business 側から Identity Center のユーザー/グループを簡単に検索・割り当て可能。 Amazon Q Businessへのアクセス ここまで完了すると、 Amazon Q Business のWeb エクス ペリエ ンス(チャット画面)にアクセスできるようになりました。 手順 AWS マネジメントコンソール → Amazon Q Business → Q アプリケーション → Web エクス ペリエ ンスURL を開く。 Identity Center の認証画面でメールアドレス・パスワードなどを入力。 ログイン後、チャット画面が表示されるので質問が可能になります。 質問に対して Q Business が回答し、サポートケースの詳細や Trusted Advisorの推奨事項など、実際のサポートデータをもとにした洞察が返されます。 実際に質問してみた 試しに直近のイベントについて聞いてみました。 直近のHealthイベントに何があるかを聞く質問をすると、下記画像にあるように実際のイベントソースに基づいて回答を出力してくれました。 得られた回答の翻訳 データソースに基づき、最近報告されたヘルスイベントが2つあります: AWS MediaPackageに運用上の問題が発生し、ライブおよびオンデマンドコンテンツのビデオ再生が断続的に中断され、遅延が増加し、バッファリング時間が長くなっています。この問題は部分的に解決しており、24時間以内に完全に回復する見込みです。 また、2024年9月26日から29日にかけてWorkDocs API に問題が発生し、 API 操作に影響が出ましたが、WorkDocsサービス全体の可用性や既存のドキュメントのセキュリティには影響しませんでした。この期間中も、ユーザーはウェブ・ インターフェイス やデスクトップ・アプリケーションを通じてコンテンツにアクセスすることができました。 さらに、サポート・ケースによると、us-west-2リージョンにおけるRDSのバックアップに継続的な問題があり、自動バックアップが指定されたバックアップ・ウィンドウ内で完了せず、手動スナップショットが「バックアップ・ジョブ・キュー」ステータスで立ち往生しているとのことです。サポートチームは、これらのバックアップの失敗を積極的に調査し、影響を受ける顧客に トラブルシューティング の手順を提供しています。 優先順位が高く、対応が必要な5つの項目についても聞いてみました。 翻訳:データソースに基づき、取り組むべき優先事項のトップ5は以下のとおりである: セキュリティとアクセス制御: セキュリティ・グループ・ルールとネットワーク・アクセス・コン トロール ・リスト(NACL)を見直し、強化し、必要なインバウンド・ トラフィック のみを許可するようにする。 システムのアップデートと監視: インスタンス が最新のオペレーティング・システム・アップデートとセキュリティ・パッチを実行していることを確認し、包括的なセキュリティ・ロギングと監視を有効にして、 潜在的 な脅威を プロアクティブ に検出して対応する。 バックアップとストレージの管理: ストレージの割り当てを確認し、自動バックアップが正常に完了するのに十分な空き領域を確保することで、RDSのバックアップの失敗に対処します。 ヘルスチェックの実装: アプリケーションの健全性を正確に反映する適切な健全性チェックを構成し、イン フラリ ク エス トの完了と不健全な インスタンス の削除のバランスをとるために適切な登録解除遅延を設定する。 高可用性と耐障害性: インスタンス のマルチ アベイラビリティ ゾーン ディストリビューション を実装し、不健康な インスタンス を自動的に置き換えるためにオートスケーリングを利用し、可用性とパフォーマンスを向上させるために AWS Global Acceleratorの実装を検討する。 個人的に他にも下記のような質問ができると思いました。 「過去3か月で一番多かったサポートケースの内容は?」 「Trusted Advisor のコスト最適化に関する推奨事項を一覧で教えて」 「頻繁に発生している AWS Healthイベントの原因は?」 まとめ QSI (Support Insights with Amazon Q) は、 AWS サポートデータ(サポートケース、Trusted Advisor、Health)を特定のアカウントへ集約し、生成 AI と 会話型インターフェースによって高度な分析と推奨事項を得られるソリューションです。 実際のハンズオンでは、この仕組みの中核となる Amazon Q Business アプリケーション と AWS Support Collectorモジュールをデプロイし、ユーザーがチャットで簡単にサポート情報へアクセスできる環境を構築しました。 過去のサポートケースから発生しがちなインシデント傾向を素早く把握すること。 Trusted Advisor のリソース最適化情報をもとにコスト削減や信頼性向上など AWS の推奨に従った取り組みを検討する。 AWS Health のステータスを踏まえ、サービスイベントに プロアクティブ に対応していく。 上記のこれらを 1 つの対話型インターフェース で実現できるメリットは非常に大きいと思います。 クラウド 運用の効率化のために、ぜひ今後QSI を導入してみてはいかがでしょうか。 ※日本のリージョンではこれから対応されていくと思います。 また、今回ワークショップで使用した Amazon Qのアップデートには他にも様々あり、今後の日本語対応にも期待できる生成AIソリューションであるため、皆様もぜひ触ってみてください。 Amazon Q関連情報 Amazon Q Amazon Q Developer とは? Amazon Qを深めるハンズオン(このワークショップでもおすすめされていました) https://catalog.workshops.aws/amazon-q-business/en-US 私たちは一緒に働いてくれる仲間を募集しています! 株式会社 電通総研 新卒採用サイト 執筆: @miyazaki.hirotoshi 、レビュー: @miyazawa.hibiki ( Shodo で執筆されました )
こんにちは。クロス イノベーション 本部 クラウド イノベーション センターの柴田です。 ここ数年、生成 AI サービスが非常に注目を集めていますね。 電通 総研でも Know Narrator シリーズや minnect AI アシスト などのソリューションを提供しています。 さて。私はプロンプトを書くとき、まず Visual Studio Code で書いてから、それをブラウザの生成 AI サービスにコピー&ペーストしています。慣れ親しんだエディタの方が文章(プロンプト)を書きやすいからです。しかしあるときこう思いました。 「エディタからブラウザへプロンプトをコピー&ペーストするのが面倒だな🤔」「 Visual Studio Code から直接生成 AI サービスを呼び出せないかな🤔」 と。 そこで Visual Studio Code から生成 AI サービスを直接呼びだす方法を考えてみました。本記事ではその方法を紹介します。なお生成 AI サービスには Amazon Bedrock を使用します。 ※この記事では Visual Studio Code から AWS CLI を使って Amazon Bedrock の Converse API を呼びだす方法をご紹介します。 特定の 拡張機能 ( Cline など)を使った Visual Studio Code と生成 AI サービスの高度な連携については扱いません。 ご承知おきください。 必要なもの 前提条件 設定方法 実行方法 解説 おわりに 必要なもの Visual Studio Code AWS CLI 前提条件 以下は事前に完了しているものとします。 AWSCLI のセットアップ Amazon Bedrock の基盤モデルへのアクセス許可の設定 設定方法はそれぞれのユーザーガイドをご参照ください。 Configuring settings for the AWS CLI - AWS Command Line Interface Add or remove access to Amazon Bedrock foundation models - Amazon Bedrock 設定方法 Visual Studio Code から Amazon Bedrock を呼びだすための設定をします。 Visual Studio Code を起動します。 コマンドパレットを開きます。 Tasks: Open User Tasks と入力します。すると tasks.json が開きます。 tasks.json に以下の内容を入力して保存します。 { " version ": " 2.0.0 ", " tasks ": [ { " label ": " bedrock ", " type ": " shell ", " command ": " aws ", " args ": [ " bedrock-runtime ", " converse ", " --model-id ", " anthropic.claude-3-5-sonnet-20240620-v1:0 ", " --messages ", " \" $(jq -csR '[{ \" role \" : \" user \" , \" content \" :[{ \" text \" :.}]}]' < '${file}') \" ", " --query ", " output.message.content[*].text ", " --output ", " text " ] , " presentation ": { " clear ": true , " close ": false , " echo ": false , " focus ": true , " showReuseMessage ": false } , " problemMatcher ": [] } ] } 実行方法 では実際に Visual Studio Code から Amazon Bedrock を呼び出してみます。 Visual Studio Code を起動します。 空のテキストファイルを作成し、生成 AI へ送信するプロンプトを記述します。例として以下の内容を prompt.txt という名前で保存します。 素数を小さい方から5個教えてください。 先ほどの prompt.txt を開いたままコマンドパレットを開きます。 Tasks: Run Task と入力します。 bedrock を選択します。すると prompt.txt の内容が Amazon Bedrock へ送信されます。しばらく待つと Amazon Bedrock からレスポンスが返ってきて表示されます。 はい、素数を小さい方から 5 個お教えします。 1. 2 2. 3 3. 5 4. 7 5. 11 これらが最小の 5 つの素数です。 補足説明: - 素数とは、1 とその数自身以外に約数を持たない自然数のことです。 - 1 は慣習的に素数とは見なされません。 - 2 は唯一の偶数の素数です。 - これらの数以降の素数は 13, 17, 19, 23...と続きます。 解説 何を行っているのか解説します。 Visual Studio Code には外部ツールを呼びだす機能があります。これを使って AWS CLI を実行しています。 Tasks in Visual Studio Code 実行されるコマンドは以下のとおりです。 aws bedrock-runtime converse \ --model-id anthropic.claude-3-5-sonnet-20240620-v1:0 \ --messages "$(jq -csR '[{\"role\":\"user\",\"content\":[{\"text\":.}]}]' < '${file}')" \ --query output.message.content[*].text \ --output text aws bedrock-runtime converse は Amazon Bedrock の Converse API を呼びだすためのコマンドです。 --model-id には使用する基盤モデルの ID を指定します。 今回は Claude 3.5 Sonnet を使用しています。利用可能な基盤モデルは Supported foundation models in Amazon Bedrock - Amazon Bedrock をご参照ください。 --messages には Converse API に送信するメッセージを指定します。 ${file} は Visual Studio Code によって現在開いているファイルのパスに置換されます。詳しくは Visual Studio Code Variables Reference をご参照ください。 jq を使って現在開いているファイルの中身を Converse API に送信するメッセージへ変換します。例えば先ほどの実行例の場合、以下のようなメッセージに変換されます。 [ { " role ": " user ", " content ": [{ " text ": " 素数を小さい方から5個教えてください。 " }] } ] --query output.message.content[*].text --output text で aws bedrock-runtime converse コマンドの実行結果のうち基盤モデルによって生成されたテキストメッセージのみを抜き出して表示しています。 おわりに この記事では Visual Studio Code から AWS CLI を使って Amazon Bedrock の Converse API を呼びだす方法をご紹介しました。これによりエディタからブラウザの生成 AI サービスへプロンプトをコピー&ペーストする手間を省くことができます。 残念ながらこの方法では生成 AI との単発の受け答えしか行えません。もし生成 AI との対話(複数回の受け答え)が必要な場合は従来通りブラウザから生成 AI サービスを利用するのがよいでしょう。 また今は生成 AI サービスを利活用したエディタ(例: Cursor )や Visual Studio Code 拡張機能 (例: GitHub Copilot 、 Cline )も存在します。エディタと生成 AI サービスをより高度に連携させたい場合はそれらの利用を検討するとよいでしょう。 最後までお読みいただき、ありがとうございました。 私たちは一緒に働いてくれる仲間を募集しています! 電通総研 キャリア採用サイト 電通総研 新卒採用サイト 執筆: @shibata.takao ( Shodo で執筆されました )