Use Cases

Claude Code × Amazon Bedrock Guide Complet | Déployer Claude en Production sur AWS

Guide complet pour utiliser Amazon Bedrock avec Claude Code. De l'authentification IAM, le streaming, l'intégration Lambda, l'implémentation RAG jusqu'à l'optimisation des coûts — basé sur l'expérience de production réelle de Masa.

« Je veux utiliser l’API Claude en production, mais la gestion des clés API me préoccupe » ou « Notre politique de sécurité interne interdit que les données quittent AWS » — pour ces problèmes, Amazon Bedrock est la solution idéale.

Lorsque j’intégrais de l’IA dans un serveur API sur ECS pour un projet professionnel, j’utilisais initialement l’API Anthropic directement. Mais un audit de sécurité a identifié la « gestion des clés API pour les services externes » comme un problème. Après la migration vers Bedrock, l’authentification est entièrement gérée via des rôles IAM — fini la gestion des clés API. Cet article couvre tout, de l’implémentation de Bedrock avec Claude Code jusqu’à l’exploitation en production.


Qu’est-ce qu’Amazon Bedrock ?

Amazon Bedrock est un service de modèles d’IA managé d’AWS. Il permet d’appeler plusieurs modèles — Claude (Anthropic), Llama (Meta), Titan (Amazon) — via une API unifiée.

Pourquoi utiliser Bedrock ?

AspectAPI AnthropicAmazon Bedrock
AuthentificationClé APIRôle IAM AWS
FacturationDirectement chez AnthropicIntégrée à la facturation AWS
Support VPCAucunEntièrement privé avec PrivateLink
Conservation des donnéesPolitique d’AnthropicPolitique d’AWS
ConformitéSOC2, etc.SOC2 / ISO27001 / HIPAA, etc.

L’API Anthropic est pratique pour les projets personnels, mais pour les cas d’usage entreprise, finance et santé, Bedrock devient de plus en plus le seul choix.


Étape 1 : Configuration initiale

Demander l’accès au modèle

D’abord, demandez l’accès aux modèles Claude dans la console AWS.

# Obtenir la liste des modèles disponibles
aws bedrock list-foundation-models \
  --by-provider anthropic \
  --region us-east-1 \
  --query 'modelSummaries[].{id:modelId, name:modelName}'

# Exemple de sortie
[
  {"id": "anthropic.claude-opus-4-5",     "name": "Claude Opus 4.5"},
  {"id": "anthropic.claude-sonnet-4-6",   "name": "Claude Sonnet 4.6"},
  {"id": "anthropic.claude-haiku-4-5-20251001", "name": "Claude Haiku 4.5"}
]

Important : Les régions principales disponibles sont us-east-1 (Virginie) et us-west-2 (Oregon). La région Tokyo peut être utilisée via la Cross-region inference.

Installation du SDK

npm install @anthropic-ai/sdk @aws-sdk/client-bedrock-runtime

Étape 2 : Implémentation de base

Utiliser le support Bedrock intégré du SDK Anthropic (Recommandé)

Le SDK officiel Anthropic dispose d’un support Bedrock intégré. Comme la syntaxe est presque identique à l’API Anthropic ordinaire, le coût de migration depuis le code existant est minimal.

// src/lib/bedrock-client.ts
import Anthropic from "@anthropic-ai/sdk";

// Pas de credentials nécessaires quand le rôle IAM est utilisé (ex. Lambda/ECS)
const bedrock = new Anthropic.AnthropicBedrock({
  awsRegion: process.env.AWS_REGION ?? "us-east-1",
  // Le profil AWS CLI est utilisé automatiquement en développement local
});

export async function generateText(
  prompt: string,
  options: { model?: string; maxTokens?: number } = {}
): Promise<string> {
  const { model = "anthropic.claude-sonnet-4-6", maxTokens = 1024 } = options;

  const response = await bedrock.messages.create({
    model,
    max_tokens: maxTokens,
    messages: [{ role: "user", content: prompt }],
  });

  return response.content[0].type === "text" ? response.content[0].text : "";
}

Les IDs de modèle Bedrock diffèrent de l’API Anthropic :

API Anthropic: claude-sonnet-4-6
Bedrock:       anthropic.claude-sonnet-4-6  (préfixe ajouté)

Support du streaming

Le streaming est indispensable pour les longues réponses.

// src/lib/bedrock-stream.ts
export async function* streamText(
  prompt: string,
  model = "anthropic.claude-sonnet-4-6"
): AsyncGenerator<string> {
  const stream = await bedrock.messages.stream({
    model,
    max_tokens: 4096,
    messages: [{ role: "user", content: prompt }],
  });

  for await (const chunk of stream) {
    if (
      chunk.type === "content_block_delta" &&
      chunk.delta.type === "text_delta"
    ) {
      yield chunk.delta.text;
    }
  }
}

// Exemple d'utilisation (Next.js App Router)
export async function POST(req: Request) {
  const { prompt } = await req.json();
  const encoder = new TextEncoder();

  const stream = new ReadableStream({
    async start(controller) {
      for await (const text of streamText(prompt)) {
        controller.enqueue(encoder.encode(text));
      }
      controller.close();
    },
  });

  return new Response(stream, {
    headers: { "Content-Type": "text/event-stream" },
  });
}

Étape 3 : Schéma Lambda + Bedrock

L’architecture la plus courante pour fournir des fonctionnalités d’IA sans serveur.

claude -p "
Implémente la fonction Lambda suivante dans src/lambda/ai-handler.ts :
- Recevoir prompt et maxTokens depuis l'événement
- Appeler Bedrock (claude-sonnet-4-6) et retourner le résultat
- Gérer les erreurs : ThrottlingException (retry) et ValidationException (400)
- Enregistrer le temps d'exécution
- Initialiser le client en dehors du handler (optimisation du cold start)
"
// src/lambda/ai-handler.ts
import { Handler, APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda";
import Anthropic from "@anthropic-ai/sdk";

// Initialisation au scope du module (mis en cache lors de la réutilisation du conteneur)
const bedrock = new Anthropic.AnthropicBedrock({
  awsRegion: process.env.AWS_REGION,
});

export const handler: Handler<APIGatewayProxyEvent, APIGatewayProxyResult> = async (event) => {
  const startTime = Date.now();

  try {
    const { prompt, maxTokens = 512 } = JSON.parse(event.body ?? "{}");

    if (!prompt) {
      return { statusCode: 400, body: JSON.stringify({ error: "prompt is required" }) };
    }

    const response = await bedrock.messages.create({
      model: "anthropic.claude-sonnet-4-6",
      max_tokens: maxTokens,
      messages: [{ role: "user", content: prompt }],
    });

    const duration = Date.now() - startTime;
    console.log(JSON.stringify({
      level: "INFO",
      duration_ms: duration,
      input_tokens: response.usage.input_tokens,
      output_tokens: response.usage.output_tokens,
    }));

    return {
      statusCode: 200,
      body: JSON.stringify({
        text: response.content[0].type === "text" ? response.content[0].text : "",
        usage: response.usage,
      }),
    };
  } catch (error: any) {
    if (error.name === "ThrottlingException") {
      console.warn("Rate limited by Bedrock, client should retry");
      return { statusCode: 429, body: JSON.stringify({ error: "Rate limited, please retry" }) };
    }
    console.error("Bedrock error:", error);
    return { statusCode: 500, body: JSON.stringify({ error: "AI generation failed" }) };
  }
};

Politique IAM Lambda

// Configuration IAM avec CDK
import * as iam from "aws-cdk-lib/aws-iam";

lambdaFunction.addToRolePolicy(new iam.PolicyStatement({
  effect: iam.Effect.ALLOW,
  actions: [
    "bedrock:InvokeModel",
    "bedrock:InvokeModelWithResponseStream",
  ],
  resources: [
    `arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6`,
    `arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-haiku-4-5-20251001`,
  ],
}));

Étape 4 : Implémentation RAG (Retrieval-Augmented Generation)

Un schéma où Claude lit des documents internes ou des informations produit pour répondre aux questions.

claude -p "
Implémente un système RAG avec Bedrock Knowledge Base.

Architecture :
- Stocker les documents dans S3
- Indexation vectorielle avec Bedrock Knowledge Base
- Récupérer des documents basés sur les questions de l'utilisateur
- Générer des réponses avec Claude Sonnet

Implémenter avec TypeScript + AWS SDK v3.
Obtenir l'ID de Knowledge Base depuis la variable d'environnement KNOWLEDGE_BASE_ID.
"
// src/lib/rag.ts
import {
  BedrockAgentRuntimeClient,
  RetrieveAndGenerateCommand,
} from "@aws-sdk/client-bedrock-agent-runtime";

const agentClient = new BedrockAgentRuntimeClient({ region: "us-east-1" });

export async function ragQuery(question: string): Promise<{
  answer: string;
  citations: string[];
}> {
  const response = await agentClient.send(
    new RetrieveAndGenerateCommand({
      input: { text: question },
      retrieveAndGenerateConfiguration: {
        type: "KNOWLEDGE_BASE",
        knowledgeBaseConfiguration: {
          knowledgeBaseId: process.env.KNOWLEDGE_BASE_ID!,
          modelArn: `arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6`,
          retrievalConfiguration: {
            vectorSearchConfiguration: { numberOfResults: 5 },
          },
        },
      },
    })
  );

  const answer = response.output?.text ?? "";
  const citations = (response.citations ?? [])
    .flatMap((c) => c.retrievedReferences ?? [])
    .map((r) => r.location?.s3Location?.uri ?? "")
    .filter(Boolean);

  return { answer, citations };
}

Étape 5 : Optimisation des coûts

// Utilitaire de sélection de modèle
type TaskType = "classify" | "extract" | "summarize" | "generate" | "complex";

const MODEL_MAP: Record<TaskType, string> = {
  classify: "anthropic.claude-haiku-4-5-20251001",  // $0,80/1M tokens d'entrée
  extract:  "anthropic.claude-haiku-4-5-20251001",
  summarize: "anthropic.claude-sonnet-4-6",          // $3,00/1M tokens d'entrée
  generate: "anthropic.claude-sonnet-4-6",
  complex:  "anthropic.claude-opus-4-5",             // $15,00/1M tokens d'entrée
};

export function selectModel(task: TaskType): string {
  return MODEL_MAP[task];
}

Réduire les coûts d’entrée avec la mise en cache des prompts

// La mise en cache des prompts est également disponible dans Bedrock
const response = await bedrock.messages.create({
  model: "anthropic.claude-sonnet-4-6",
  max_tokens: 1024,
  system: [
    {
      type: "text",
      text: longSystemPrompt,
      cache_control: { type: "ephemeral" },  // Cache pendant 5 minutes
    },
  ],
  messages: [{ role: "user", content: userQuery }],
});

5 pièges courants

1. La région n’est pas supportée

Claude sur Bedrock n’est pas disponible dans toutes les régions. En 2026, us-east-1 et us-west-2 sont les régions principales. Pour l’utiliser depuis Tokyo, activez la Cross-region inference.

// Utiliser l'ARN de modèle pour la Cross-region inference
const crossRegionModelArn = 
  "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6";

2. Oublier de demander l’accès au modèle

Dans Bedrock, vous devez demander un « Model access » pour chaque modèle que vous souhaitez utiliser. Appeler un modèle sans demande d’accès entraîne une AccessDeniedException. Faites toujours la demande avant de commencer à coder avec Claude Code.

3. Timeout Lambda trop court

Les réponses de Claude peuvent prendre 10 à 30 secondes. La valeur par défaut de Lambda de 3 secondes causera certainement un timeout. Configurez-le à au moins 30 secondes, et de 60 à 300 secondes pour les générations longues.

4. Confondre les IDs de modèle Bedrock avec les IDs de l’API Anthropic

❌ Utiliser directement l'ID de l'API Anthropic : "claude-sonnet-4-6"
✅ ID Bedrock : "anthropic.claude-sonnet-4-6"

5. Ne pas tenir compte de la latence de Cross-region inference

Appeler des modèles dans us-east-1 depuis Tokyo ajoute une latence aller-retour d’environ 100 à 200 ms. Pour les applications sensibles à la latence, utilisez le streaming pour réduire le délai perçu.


Récapitulatif

TâcheContribution de Claude Code
Implémentation de baseGénère le client AnthropicBedrock et les fonctions
Intégration LambdaGénère le handler et la politique IAM ensemble
Implémentation RAGGénère automatiquement le code d’intégration Knowledge Base
Optimisation des coûtsConçoit la logique de sélection de modèle par type de tâche
Résolution de problèmesIdentifie la cause et suggère une solution depuis les logs d’erreur

Développer avec Claude Code, opérer en production sur Bedrock — cette combinaison satisfait toutes les exigences de sécurité, coût et évolutivité. Commencez par l’essai gratuit de Bedrock et, lorsque vous êtes prêt pour la production, il suffit de configurer le rôle IAM.

Articles connexes

Références

#claude-code #aws #bedrock #anthropic #typescript #generative-ai

Passez votre flux Claude Code au niveau supérieur

50 modèles de prompts éprouvés, prêts à être copiés-collés dans Claude Code.

Gratuit

PDF gratuit : aide-mémoire Claude Code en 5 minutes

Laissez simplement votre e-mail et nous vous enverrons immédiatement l'aide-mémoire A4 en PDF.

Nous traitons vos données avec soin et n'envoyons jamais de spam.

Masa

À propos de l'auteur

Masa

Ingénieur passionné par Claude Code. Il gère claudecode-lab.com, un média tech en 10 langues avec plus de 2 000 pages.