
30人分のClaudeCode体験環境を用意した話
こんにちは(U・ω・U)
人材ソリューション部プロダクトマネージャーのしゅんです。
本記事は、クラスメソッド AI駆動開発 Advent Calendar 2025 22日目の記事です。
クラスメソッドではAI駆動開発を推進するための取り組みを行っており、クラスメソッド社員も実際に日常的にAIを使って開発を行っています。
もしAI駆動開発の最先端を知りたい方は、ぜひ本アドベントカレンダーをチェックしてみてください。
ClaudeCode勉強会
このブログは以下のイベントで約30名ほどの方に対しClaudeCodeを体験いただくため、環境を用意したお話です。あんまり業務等でこういうことはないかと思うので参考にならないところも多々あるかもしれませんが読み物としてお楽しみいただけると幸いです。
上記イベントページでご紹介している通り参加者の皆さんには事前準備不要で、ノートPCのみをご持参いただきました。
勉強会は簡単なAI駆動開発に関するセッションをお話しさせていただいた後に、ハンズオン形式でClaudeCodeを体験するという進行でした。ハンズオンの内容はこんな感じです。
- ClaudeCodeの基本機能を確認
- costコマンドによるトークン数やコストの確認
- helpコマンドの確認
- statusコマンドによるモデル確認
- 画像の読み込み体験
- permissionsコマンドによるファイルアクセス権限の挙動確認
- TODOアプリ作成体験
- プランモードの体験
- サーバとアプリを立ち上げ挙動の確認
- security reviewコマンドの体験
用意した環境
提供したものとしてはVisual Studio Code (VS Code) のサーバ版ことcode-server とClaudeCodeがインストールされた環境です。これらをDockerコンテナに梱包し参加者1人に対し1コンテナを使ってもらう形で用意しました。
構成としては極力シンプルにしたかったので以下構成図のようにしました。

シンプルですね。参加者1人に対し1コンテナなのでAWS Fargateコンテナが30台ほど立ち上がっている状態になります。ここから環境を用意するにあたってやったことや意識したことなどを説明していきます。
Dockerコンテナの用意
Dockerfileとしては以下の通りです。
FROM node:24
ARG CLAUDE_CODE_VERSION=latest
ARG CODE_SERVER_PASSWORD=xxxxxxxxxxxxx
ENV XDG_DATA_HOME=/home/node
ENV LANG=ja_JP.UTF-8
RUN apt-get update && apt-get install -y curl locales && \
echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
locale-gen ja_JP.UTF-8
RUN curl -fsSL https://code-server.dev/install.sh | sh
ENV PASSWORD=${CODE_SERVER_PASSWORD}
# Ensure default node user has access to /usr/local/share
RUN mkdir -p /usr/local/share/npm-global && \
chown -R node:node /usr/local/share
# Create workspace and config directories and set permissions
RUN mkdir -p /home/node/workspace /home/node/.claude && \
chown -R node:node /home/node/workspace /home/node/.claude
# Copy src folder contents to /workspace
COPY src/ /home/node/workspace/
USER node
# Install global packages
ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
ENV PATH=$PATH:/usr/local/share/npm-global/bin
# Set the default shell to zsh rather than sh
ENV SHELL=/bin/bash
# Set the default editor and visual
ENV EDITOR=nano
ENV VISUAL=nano
RUN echo 'export PATH=$PATH:/usr/local/share/npm-global/bin' >> /home/node/.bashrc
RUN npm install -g @anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}
# Install Japanese Language Pack for code-server
RUN code-server --install-extension MS-CEINTL.vscode-language-pack-ja
# Configure code-server to use Japanese locale
RUN mkdir -p /home/node/.local/share/code-server/User && \
echo '{"locale":"ja"}' > /home/node/.local/share/code-server/User/argv.json && \
chown -R node:node /home/node/.local
他のイベント準備もあり改善までは手が回らなかったんですがリファクタリングの余地はあるんだろうなとは思っています。ベースとして参考にしたのはClaudeが公式で出しているDevContainerのDockerfileでした。
DevContainer自体はVSCode上で安全に開発を行うためClaudeCodeを使用した開発環境をコンテナとして隔離する拡張機能です。ClaudeCodeが誤ってファイルなどを削除してもリスクを最小限にするためのものですが、ClaudeCodeのコンテナ環境を提供したい今回のユースケースにおいてとても参考になりました。余談ですが、ベースイメージがnodeだったのでハンズオンで作ったTODOアプリの方もその環境で動作させやすいTypeScriptによる開発に寄せました。
これに加えてcode-serverのインストールとハンズオンで使うファイル等をコンテナに入れています。code-serverは以下のコマンドでインストール可能です。
curl -fsSL <https://code-server.dev/install.sh> | sh
環境変数PASSWORDで設定した文字列がログイン時のパスワードになります。
ARG CODE_SERVER_PASSWORD=xxxxxxxxxxxxx
〜〜〜
ENV PASSWORD=${CODE_SERVER_PASSWORD}
インフラはcdkで定義したのですが、タスク定義は以下のように定義しました。
taskDefinition.addContainer('aixc-handson-container', {
image: ecs.ContainerImage.fromEcrRepository(props.ecrRepository, 'latest'),
command: ['code-server', '--bind-addr', '0.0.0.0:8080', '--locale', 'ja', '/home/node/workspace'],
environment: {
'AWS_REGION': 'ap-northeast-1',
'ANTHROPIC_MODEL': 'jp.anthropic.claude-sonnet-4-5-20250929-v1:0',
'CLAUDE_CODE_USE_BEDROCK': '1',
'CLAUDE_CODE_MAX_OUTPUT_TOKENS': '4096',
'MAX_THINKING_TOKENS': '1024'
},
logging: ecs.LogDrivers.awsLogs({
streamPrefix: 'app'
}),
portMappings: [
{
containerPort: 8080, // アプリのポート
protocol: ecs.Protocol.TCP
},
{
containerPort: 8000, // 追加ポート
protocol: ecs.Protocol.TCP
}
]
});
code-serverはそのままcode-serverコマンドで立ち上げることができます。--bind-addrで起動時のポート番号、引数でワークスペースフォルダを指定することで開くフォルダを指定できます。環境変数周りについては今回Amazon Bedrock(以降、Bedrock)を採用した理由と共にお話ししていきます。ちなみにコンピューティングリソースとしては1vCPU、メモリ2GBで十分でした。
ClaudeCodeのバックエンドについて
今回のバックエンドとしてはBedrockを採用しました。ClaudeCodeはCLAUDE_CODE_USE_BEDROCK環境変数にて1を指定することでバックエンドをBedrockにすることができます。理由としてはデプロイ先がAWSだったので、バックエンドの技術スタック(リソース)をできるだけAWSに寄せたかったというのと認証認可をIAMでコントロールできるのがいいなと思ったためです。一方で懸念としては参加人数分のアクセス(モデル操作)がBedrockに集中するためクォータ制限が気になりました。Bedrockは1分あたりのトークン数や1分あたりのリクエスト数といった分間利用で上限が設けられています。設定値はモデルやリージョンによって異なりますので詳しくは以下の公式ドキュメントを参照ください。
AWSアカウントを分散(例えば10人で1アカウントとして、イベントは30人参加なので3アカウントを用意する等)するのも考えたのですが今回は準備が間に合いませんでした。そこで以下2つの対策を導入しました。(ちなみにプロンプトキャッシュはClaudeCodeでデフォルトで有効になっているので今回説明は割愛します。プロンプトキャッシュについてはこちらのブログを参照ください。)
- クロスリージョン推論の活用
- max_tokensパラメータによる制限
Bedrockにはクロスリージョン推論と呼ばれる機能があり、これを使うと複数のAWSリージョンにまたがってモデル推論リクエストを自動的にルーティングすることができます。複数リージョンのキャパシティプールを活用することでクォータが分散されます。クロスリージョン推論については以下のブログが分かりやすいので是非参照ください。 設定方法としてはClaudeCodeのモデル設定にクロスリージョン推論のエンドポイントを記述するだけです。ANTHROPIC_MODELという環境変数に書き込めば設定可能です。今回は色々と故あって日本国内クロスリージョン推論を採用しました。
次の対策はmax_tokensパラメータによる制限です。Bedrockではリクエストの開始時に入力トークンとmax_tokensで設定されたトークンの合計を1分あたりの利用可能トークン数(TPM)、1日あたりの利用可能トークン数(TPD)から差し引く(予約する)という挙動になっています。 つまりmax_tokensの設定が適切になっていないとクォータ制限にかかりやすくなってしまう可能性があります。そのためCLAUDE_CODE_MAX_OUTPUT_TOKENS環境変数を設定し制限を設けました。これとCaludeの公式ドキュメントではパフォーマンスの観点でMAX_THINKING_TOKENS環境変数も設定することが推奨されているので、推奨されているままの設定値を入れておきました。
当日のオペレーション
当日はイベント参加者の皆さんにIPアドレスとログイン情報が書かれた紙を渡させていただき、持ち込んでいただいたPCのブラウザよりcode-server & ClaoudeCode環境のコンテナにログインしてハンズオンをしました。プロンプト情報などもお渡しする必要があったのですが、こちらはslidoというイベント向けコミュニケーションツールを使ってテキストコミュニケーションを取りました。他にもQAの受付なども行い、いつもイベントを主催させていただく際にはお世話になっています。
最後に
今回用意した環境で先述のclaudecode勉強会は無事に乗り切ることができました。ハンズオン形式だったので、入力するプロンプトをこちらでうまくコントロールできたことも功を奏した要因だったのかもしれません。コスト的にはコンピューティングリソースも含め$80くらいにおさまりました。当日は本ハンズオン内容の検討や当日のサポートで多くの仲間が協力してくれました。改めて本当にありがとうございました。今後はcodexなども同様の環境で用意してやってみても面白いかもと思っています。
本活動はAI Experience Centerの一環でご提供させていただきました。AI Experience Centerとはクラスメソッドが設立したAI技術の社会実装を加速させることを目的とした専門組織です。これまでお客様にAI技術を導入させていただいた実績やAWS最上位パートナーとしての技術力を活かし最新のAI技術に関するセミナーやワークショップを通じて、日本企業の競争力強化と社会課題解決に貢献していくことを目的としています。詳しくは以下のページをご覧ください。
今後も先端技術を使ったワクワクするイベントを企画していけたらと思いますのでお気軽に遊びに来てください!!
以上、しゅんでした!







