Claude CodeをBedrockに接続して利用する
Claude CodeをBedrockと接続して利用してみます。
Bedrock事前準備
Claude Codeを利用する場合には、2025/3/1時点ではClaude 3.7 SonnetとClaude 3.5 Haikuへのアクセスが必要となるため、Bedrockでアクセス付与をします。
2025/3/1時点ではClaude 3.7は東京リージョンでは対応していませんのでご注意ください。
Claude Codeセットアップ
- npm installします。
npm install -g @anthropic-ai/claude-code
- Bedrockを利用するように環境変数をセットします。
# Bedrockを利用する設定
$ export CLAUDE_CODE_USE_BEDROCK=1
# Modelの指定
$ export ANTHROPIC_MODEL='us.anthropic.claude-3-7-sonnet-20250219-v1:0'
# プロンプトキャッシュを有効化
$ export DISABLE_PROMPT_CACHING=1
もしdefaultプロファイル以外を利用したい場合は以下のように設定することで変更可能です。
export AWS_PROFILE=your_aws_profile_name
もし対象プロファイルがMFA必須の場合は2025/3/1時点でClaude Codeが未対応と思われるため、ACCESS_TOKENを取得してそれをセットしてください。
$ aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/xaccounts3access \
--serial-number arn:aws:iam::123456789012:mfa/user \
--role-session-name session_name \
--duration-seconds 3600 \
--token-code 123456 \
--region ap-northeast-1
$ export AWS_ACCESS_KEY_ID=xxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=yyyyyyyy
$ export AWS_SESSION_TOKEN=zzzzzzzz
Claude Code起動
- 修正したいプロジェクトに移動します。
$ cd your-project-directory
- Claude Codeを起動します。
claude
-
画面の指示に従い各種設定を行います。
-
以下のような画面が出たら環境です。
各種機能を試す
プロジェクトの説明
このプロジェクトを要約して
とプロンプトで指示します。
結果が返ってきました。
コードの作成(REST API)
クエリパラメータnameを受け取って、レスポンスのjson内contentカラムにHello ${name}をセットして返すREST APIを作って
とプロンプトで指示します。
期待通りの結果が返ってきました。
提案されたコード
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Edit file │
│ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ src/main/java/com/example/ai_agent_poc/AiAgentPocApplication.java │ │
│ │ │ │
│ │ 2 │ │
│ │ 3 import org.springframework.boot.SpringApplication; │ │
│ │ 4 import org.springframework.boot.autoconfigure.SpringBootApplication; │ │
│ │ 5 import org.springframework.web.bind.annotation.GetMapping; │ │
│ │ 6 import org.springframework.web.bind.annotation.RequestParam; │ │
│ │ 7 import org.springframework.web.bind.annotation.RestController; │ │
│ │ 8 │ │
│ │ 9 @SpringBootApplication │ │
│ │ 10 public class AiAgentPocApplication { │ │
│ │ ... │ │
│ │ 11 } │ │
│ │ 12 │ │
│ │ 13 } │ │
│ │ 14 │ │
│ │ 15 @RestController │ │
│ │ 16 class GreetingController { │ │
│ │ 17 │ │
│ │ 18 @GetMapping("/greeting") │ │
│ │ 19 public GreetingResponse greeting(@RequestParam(value = "name", defaultValue = "World") String name) { │ │
│ │ 20 return new GreetingResponse("Hello " + name); │ │
│ │ 21 } │ │
│ │ 22 } │ │
│ │ 23 │ │
│ │ 24 class GreetingResponse { │ │
│ │ 25 private final String content; │ │
│ │ 26 │ │
│ │ 27 public GreetingResponse(String content) { │ │
│ │ 28 this.content = content; │ │
│ │ 29 } │ │
│ │ 30 │ │
│ │ 31 public String getContent() { │ │
│ │ 32 return content; │ │
│ │ 33 } │ │
│ │ 34 } │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
内容は問題ないですが、SpringBootApplication
と同じファイルにあると良くないため独立したクラスで作成してほしいので、No, and tell Claude what to do differently (esc)
を選択し追加のプロンプトを指示します。
コードは良いですが、コントローラとBeanはそれぞれ独立したクラスを用意してください。
問題なく作成されました。
Yes
を指定すると今度はResponse Beanも続けて生成してくれました。
curlしてみます。無事に動きました!
$ curl "http://localhost:8080/greeting?name=yuta"
{"content":"Hello yuta"}
テストコードの作成
先ほど作成したクラスのテストコードを書いてみます。
GreetingControllerのテストコードを書いてください
とプロンプトで指示します。
提案されたコード
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Edit file │
│ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ src/test/java/com/example/ai_agent_poc/controller/GreetingControllerTest.java │ │
│ │ │ │
│ │ 1 package com.example.ai_agent_poc.controller; │ │
│ │ 2 │ │
│ │ 3 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; │ │
│ │ 4 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; │ │
│ │ 5 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; │ │
│ │ 6 │ │
│ │ 7 import org.junit.jupiter.api.Test; │ │
│ │ 8 import org.springframework.beans.factory.annotation.Autowired; │ │
│ │ 9 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; │ │
│ │ 10 import org.springframework.boot.test.context.SpringBootTest; │ │
│ │ 11 import org.springframework.test.web.servlet.MockMvc; │ │
│ │ 12 │ │
│ │ 13 @SpringBootTest │ │
│ │ 14 @AutoConfigureMockMvc │ │
│ │ 15 public class GreetingControllerTest { │ │
│ │ 16 │ │
│ │ 17 @Autowired │ │
│ │ 18 private MockMvc mockMvc; │ │
│ │ 19 │ │
│ │ 20 @Test │ │
│ │ 21 public void shouldReturnDefaultGreeting() throws Exception { │ │
│ │ 22 mockMvc.perform(get("/greeting")) │ │
│ │ 23 .andExpect(status().isOk()) │ │
│ │ 24 .andExpect(jsonPath("$.content").value("Hello World")); │ │
│ │ 25 } │ │
│ │ 26 │ │
│ │ 27 @Test │ │
│ │ 28 public void shouldReturnCustomizedGreeting() throws Exception { │ │
│ │ 29 String name = "Spring"; │ │
│ │ 30 mockMvc.perform(get("/greeting").param("name", name)) │ │
│ │ 31 .andExpect(status().isOk()) │ │
│ │ 32 .andExpect(jsonPath("$.content").value("Hello " + name)); │ │
│ │ 33 } │ │
│ │ 34 } │ │
│ │ 35 \ No newline at end of file │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
テストコードを実行してみても一発でGreenになりました。
まとめ
簡単なコードではありますが、Bedrockと接続したClaude CodeでSpringBootアプリケーションを作成することができました。
Bedrockと接続する際に、profileを変更する方法やMFAが必要な場合の実行方法がわからず混乱しましたが無事動かすことができたので良かったです。
Discussion