🎉

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セットアップ

  1. npm installします。
npm install -g @anthropic-ai/claude-code
  1. 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起動

  1. 修正したいプロジェクトに移動します。
$ cd your-project-directory
  1. Claude Codeを起動します。
claude
  1. 画面の指示に従い各種設定を行います。

  2. 以下のような画面が出たら環境です。
    ClaudeCode起動

各種機能を試す

プロジェクトの説明

このプロジェクトを要約してとプロンプトで指示します。

要約プロンプト

結果が返ってきました。

コードの作成(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はそれぞれ独立したクラスを用意してください。

独立したクラスで作成するように指示

問題なく作成されました。
Controllerの作成結果

Yesを指定すると今度はResponse Beanも続けて生成してくれました。

ResponseBeanの作成結果

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