Use Cases

Claude Code × Amazon Bedrock Panduan Lengkap | Menjalankan Claude di Produksi dengan AWS

Panduan lengkap menggunakan Amazon Bedrock dengan Claude Code. Dari autentikasi IAM, streaming, integrasi Lambda, implementasi RAG, hingga optimasi biaya — berdasarkan pengalaman produksi nyata Masa.

“Saya ingin menggunakan Claude API di produksi, tapi khawatir dengan pengelolaan API key” atau “Kebijakan keamanan internal tidak mengizinkan data keluar dari AWS” — untuk masalah ini, Amazon Bedrock adalah jawabannya.

Ketika saya mengintegrasikan AI ke server API di ECS untuk pekerjaan, awalnya saya menggunakan Anthropic API secara langsung. Namun, audit keamanan menandai “pengelolaan API key untuk layanan eksternal” sebagai masalah. Setelah beralih ke Bedrock, autentikasi selesai hanya dengan IAM role dan saya terbebas dari pengelolaan API key. Artikel ini menjelaskan segalanya, mulai dari implementasi Bedrock dengan Claude Code hingga operasi produksi.


Apa itu Amazon Bedrock?

Amazon Bedrock adalah layanan model AI terkelola dari AWS. Anda dapat memanggil berbagai model — Claude (Anthropic), Llama (Meta), Titan (Amazon) — melalui API terpadu.

Mengapa Menggunakan Bedrock?

AspekAnthropic APIAmazon Bedrock
AutentikasiAPI keyAWS IAM role
PenagihanLangsung ke AnthropicTerintegrasi dalam penagihan AWS
Dukungan VPCTidak adaSepenuhnya privat dengan PrivateLink
Retensi dataKebijakan AnthropicKebijakan AWS
KepatuhanSOC2, dll.SOC2 / ISO27001 / HIPAA, dll.

Anthropic API memang praktis untuk proyek pribadi, namun untuk kasus penggunaan enterprise, keuangan, dan kesehatan, Bedrock semakin menjadi satu-satunya pilihan.


Langkah 1: Pengaturan Awal

Meminta Akses Model

Pertama, minta akses ke model Claude di konsol AWS.

# Periksa daftar model yang tersedia
aws bedrock list-foundation-models \
  --by-provider anthropic \
  --region us-east-1 \
  --query 'modelSummaries[].{id:modelId, name:modelName}'

# Contoh output
[
  {"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"}
]

Penting: Region utama yang tersedia adalah us-east-1 (Virginia) dan us-west-2 (Oregon). Region Tokyo dapat digunakan melalui Cross-region inference.

Instalasi SDK

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

Langkah 2: Implementasi Dasar

Menggunakan Dukungan Bedrock Bawaan SDK Anthropic (Direkomendasikan)

SDK Anthropic resmi memiliki dukungan Bedrock bawaan. Karena sintaksisnya hampir identik dengan Anthropic API biasa, biaya migrasi dari kode yang sudah ada sangat minimal.

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

// Tidak perlu credentials jika IAM role digunakan (mis. Lambda/ECS)
const bedrock = new Anthropic.AnthropicBedrock({
  awsRegion: process.env.AWS_REGION ?? "us-east-1",
  // Saat pengembangan lokal, profil AWS CLI digunakan secara otomatis
});

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 : "";
}

ID model Bedrock berbeda dari Anthropic API:

Anthropic API: claude-sonnet-4-6
Bedrock:       anthropic.claude-sonnet-4-6  (ditambahkan prefix)

Dukungan Streaming

Streaming sangat penting untuk respons panjang.

// 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;
    }
  }
}

// Contoh penggunaan (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" },
  });
}

Langkah 3: Pola Lambda + Bedrock

Arsitektur paling umum untuk menyediakan fitur AI tanpa server.

claude -p "
Implementasikan fungsi Lambda berikut di src/lambda/ai-handler.ts:
- Terima prompt dan maxTokens dari event
- Panggil Bedrock (claude-sonnet-4-6) dan kembalikan hasilnya
- Tangani error: ThrottlingException (retry) dan ValidationException (400)
- Catat waktu eksekusi
- Inisialisasi klien di luar handler (optimasi cold start)
"
// src/lambda/ai-handler.ts
import { Handler, APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda";
import Anthropic from "@anthropic-ai/sdk";

// Inisialisasi di scope modul (di-cache saat container digunakan ulang)
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" }) };
  }
};

Kebijakan IAM Lambda

// Konfigurasi IAM dengan 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`,
  ],
}));

Langkah 4: Implementasi RAG (Retrieval-Augmented Generation)

Pola di mana Claude membaca dokumen internal atau informasi produk untuk menjawab pertanyaan.

claude -p "
Implementasikan sistem RAG menggunakan Bedrock Knowledge Base.

Arsitektur:
- Simpan dokumen di S3
- Pengindeksan vektor dengan Bedrock Knowledge Base
- Ambil dokumen berdasarkan pertanyaan pengguna
- Buat jawaban dengan Claude Sonnet

Implementasikan dengan TypeScript + AWS SDK v3.
Dapatkan ID Knowledge Base dari variabel lingkungan 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 };
}

Langkah 5: Optimasi Biaya

// Utilitas pemilihan model
type TaskType = "classify" | "extract" | "summarize" | "generate" | "complex";

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

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

Kurangi Biaya Input dengan Prompt Caching

// Prompt caching juga tersedia di 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 selama 5 menit
    },
  ],
  messages: [{ role: "user", content: userQuery }],
});

5 Jebakan Umum

1. Region tidak didukung

Claude on Bedrock tidak tersedia di semua region. Per 2026, us-east-1 dan us-west-2 adalah region utama. Untuk menggunakannya dari Tokyo, aktifkan Cross-region inference.

// Gunakan ARN model untuk Cross-region inference
const crossRegionModelArn = 
  "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6";

2. Lupa meminta akses model

Di Bedrock, Anda harus meminta “Model access” untuk setiap model yang ingin digunakan. Memanggil model tanpa permintaan akses akan menghasilkan AccessDeniedException. Selalu minta akses sebelum mulai coding dengan Claude Code.

3. Timeout Lambda terlalu singkat

Respons Claude bisa memakan waktu 10–30 detik. Default Lambda 3 detik pasti akan timeout. Atur ke minimal 30 detik, dan 60–300 detik untuk generasi yang lebih panjang.

4. Mengacaukan ID model Bedrock dengan ID Anthropic API

❌ Menggunakan ID Anthropic API langsung: "claude-sonnet-4-6"
✅ ID Bedrock: "anthropic.claude-sonnet-4-6"

5. Tidak memperhitungkan latensi Cross-region inference

Memanggil model di us-east-1 dari Tokyo menambahkan latensi jaringan pulang-pergi sekitar 100–200 ms. Untuk aplikasi yang sensitif terhadap latensi, gunakan streaming untuk mengurangi keterlambatan yang dirasakan.


Ringkasan

TugasKontribusi Claude Code
Implementasi dasarMenghasilkan klien AnthropicBedrock dan fungsi
Integrasi LambdaMenghasilkan handler dan kebijakan IAM bersama
Implementasi RAGMenghasilkan kode integrasi Knowledge Base secara otomatis
Optimasi biayaMerancang logika pemilihan model berdasarkan jenis tugas
Pemecahan masalahMengidentifikasi penyebab dan menyarankan perbaikan dari log error

Kembangkan dengan Claude Code, operasikan di produksi dengan Bedrock — kombinasi ini memenuhi semua persyaratan keamanan, biaya, dan skalabilitas. Mulailah dengan uji coba gratis Bedrock, dan saat siap untuk produksi, cukup konfigurasikan IAM role.

Artikel Terkait

Referensi

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

Tingkatkan alur kerja Claude Code kamu

50 template prompt yang sudah teruji, siap copy-paste ke Claude Code sekarang juga.

Gratis

PDF Gratis: Cheatsheet Claude Code dalam 5 Menit

Cukup masukkan emailmu dan kami akan langsung mengirim cheatsheet PDF A4 satu halaman.

Kami menjaga data pribadimu dengan aman dan tidak pernah mengirim spam.

Masa

Tentang Penulis

Masa

Engineer yang aktif menggunakan Claude Code. Mengelola claudecode-lab.com, media teknologi 10 bahasa dengan lebih dari 2.000 halaman.