Amazon Bedrock で LINE Chat Bot を構築する

## 概要
Amazon Bedrock と LINE を組み合わせてチャットボットを作成する手順（東京リージョン版）を紹介します！
この構成では、Amazon Bedrockを使用して AI の応答を生成し、LINE Messaging API を通じてユーザーとやり取りを行いたいと思います。
![名称未設定ファイル.drawio-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/914d7634-b158-d079-9426-492898c1cd65.png)

## 手順の概要
1. Amazon Bedrock のセットアップ
2. AWS Lambda の設定（Bedrock との連携）
3. LINE Messaging API のセットアップ
4. AWS API Gateway の設定（LINE と Lambda の接続）
5. ボットの実装とデプロイ

---

## 1. Amazon Bedrock のセットアップ
### ① Amazon Bedrock を有効化
- AWS マネジメントコンソール にログイン
- Amazon Bedrock サービスを開く
- リージョンを `ap-northeast-1（東京）` に変更
-  Amazon Bedrock Model Access Request (生成AIのモデル利用の手続き)
    - 初めて利用する場合は利用申請をする
![スクリーンショット 2025-02-02 11.20.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/d9c60b16-33af-8fbe-9e6f-57559996d0aa.png)

### ② 利用可能なモデルを確認
以下の AWS CLI コマンドを実行すると、利用可能なモデル ID を確認できます。
#### 今回はClaude 2.1を使用していきます。

```sh
aws bedrock list-foundation-models --region ap-northeast-1
```
#### モデル ID（2025年時点）
- **Claude 3 Sonnet（推奨）**: `anthropic.claude-3-sonnet-20240229-v1:0`
- **Claude 3 Haiku（高速軽量）**: `anthropic.claude-3-haiku-20240307-v1:0`
- **Claude 3 Opus（高性能）**: `anthropic.claude-3-opus-20240229-v1:0`
- **Amazon Titan Text**: `amazon.titan-text-lite-v1`
- **Amazon Titan Embeddings**: `amazon.titan-embed-text-v1`
---

## 2. AWS Lambda の設定（Bedrock との連携）
### ① Lambda 関数を作成
- AWS Lambda コンソールを開く
- 新しい関数を作成
  - **名前**: `BedrockLineBot`
  - **ランタイム**: `Python 3.10`
  - **実行ロール**: `基本的なLambdaアクセス権限で新しいロールを作成` 
![スクリーンショット 2025-02-02 12.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/d9fbec8a-7518-1e05-f009-97994035cca2.png)

### ② Bedrock のアクセスロールを追加
- AWS IAM コンソールを開く
- Lambda の実行ロールを編集
- `AmazonBedrockFullAccess` ポリシーをアタッチ
![スクリーンショット 2025-02-02 12.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/db533baa-2a78-e378-70ce-0b2e27cadc6c.png)

### ③ Lambda レイヤーの設定（requests モジュール追加）
今回はPythonのrequestsモジュールの利用が必要になります。
1. **AWS Lambda コンソール** → **Lambda レイヤー** を開く
2. 「レイヤーを作成」をクリック
3. **レイヤー名**: `requests-layer`
4. ZIP ファイル（`requests_layer.zip`）をアップロード
5. **ランタイム**: `Python 3.10`
6. 作成をクリック

### ④ Lambda コード（Bedrock + LINE）
```python
import boto3
import json
import requests

# Amazon Bedrock クライアント（東京リージョン）
bedrock = boto3.client("bedrock-runtime", region_name="ap-northeast-1")

# LINE のアクセストークン（LINE Developers から取得）
LINE_ACCESS_TOKEN = "YOUR_LINE_ACCESS_TOKEN"

def lambda_handler(event, context):
    try:
        body = json.loads(event['body'])
        user_message = body['events'][0]['message']['text']
        reply_token = body['events'][0]['replyToken']

        response = bedrock.invoke_model(
            modelId="anthropic.claude-3-sonnet-20240229-v1:0",
            body=json.dumps({"prompt": f"\n\nHuman: {user_message}\n\nAssistant:", "max_tokens": 200})
        )
        result = json.loads(response["body"].read())
        ai_reply = result.get("completion", "エラー: 応答を取得できませんでした")

        send_line_message(reply_token, ai_reply)
        return {"statusCode": 200, "body": json.dumps({"message": "Success"})}
    except Exception as e:
        print(f"Error: {e}")
        return {"statusCode": 500, "body": json.dumps({"error": str(e)})}

def send_line_message(reply_token, text):
    url = "https://api.line.me/v2/bot/message/reply"
    headers = {"Content-Type": "application/json", "Authorization": f"Bearer {LINE_ACCESS_TOKEN}"}
    data = {"replyToken": reply_token, "messages": [{"type": "text", "text": text}]}
    requests.post(url, headers=headers, json=data)
```

---

## 3. LINE Messaging API のセットアップ
1. LINE Developers コンソールで新規プロバイダーを作成
2. 新しいチャネル（Messaging API） を作成
3. **Channel ID**, **Channel Secret**, **LINE Access Token** を取得
4. **Webhook URL** を後で設定（AWS API Gateway の URL）
5. Webhook の利用を「オン」にする
![スクリーンショット 2025-02-02 12.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/8df70b72-1a57-0f41-ffaf-e917ceb770b9.png)
![スクリーンショット 2025-02-02 19.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/00450197-c5f2-e4f6-66dd-d033e7ae2e10.png)

---

## 4. AWS API Gateway の設定（LINE と Lambda の接続）
1. API Gateway で新しい API を作成
2. HTTP API を作成し、統合ターゲットに Lambda を指定
3. CORS 設定を有効化
4. デプロイしてエンドポイント URL を取得
5. LINE Developers コンソールに Webhook URL を設定
![スクリーンショット 2025-02-02 19.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/81e257cc-5599-93a4-9636-0fd0bbafcb20.png)
![スクリーンショット 2025-02-02 19.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/1bfa3105-d493-0fd0-3704-3e14161ada04.png)
```sh
https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/webhook
```
![スクリーンショット 2025-02-02 19.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/0024a705-8d0d-aeb2-a465-5f6e4edb7a74.png)
---

## 5. ボットの実装とデプロイ
1. Lambda コードを保存し、デプロイ
2. API Gateway 経由で LINE からリクエストが来たときに Bedrock に問い合わせる よう設定
3. LINE で動作確認
![IMG_5846 2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/2b92a9a7-a4ba-846b-97e3-2d47482b5cc3.png)

---

以上で Amazon Bedrock と LINE を連携したチャットボットの構築が完了です！