Amazon Bedrock × Cloudflare AI Gateway ハンズオン用資料（AWS側設定編）

## 概要
今回の記事はこちらの勉強会用の資料になります。

https://jawsug-sapporo.connpass.com/event/321565/

Amazon Bedrock × Cloudflare AI Gateway ハンズオンを行う予定ですが、本記事はAWS側のお話をメインとさせていただいておりますので、
Cloudflare側の操作に関しては `kameoncloud様`の記事を参照してください。

https://zenn.dev/kameoncloud/articles/ec03482b70d57f

:::note warn
本ハンズオンは、Amazon Bedrockで多少の課金が発生いたします。ご了承ください。
:::

また、今回のハンズオンの構成図は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/96e33642-b878-3def-240e-97f40ea5fce1.png)



## Amazon BedrockとCloudflareのAI Gatewayについて
まず最初に軽く、二つのサービスの概要に触れたいと思います。

### Amazon Bedrockについて
Amazon Bedrockは、AWSが提供する完全マネージド型の生成系AIサービスです。複数の基盤モデル（Foundation Models）を単一のAPIで利用できる点が特徴です。主な特徴は以下の通りです：

1. **多様なモデル**：Anthropic、AI21 Labs、Stability AI、Amazon Titan等、様々なプロバイダーのモデルを利用可能
1. **セキュリティとプライバシー**：データはAWS内で処理され、外部に送信されない
1. **カスタマイズ機能**：一部モデルでは、自社データでファインチューニングすることが可能
1. **使いやすさ**：単一のAPIで複数のモデルにアクセス可能
1. **コスト効率**:従量課金制なので、無駄なコストを抑えることが出来る

Amazon Bedrockを使用することで、開発者は複雑なMLインフラストラクチャの管理なしに、高度なAI機能をアプリケーションに統合できます。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/models-supported.html

また、料金に関してですが、Amazon Bedrockは使用したモデルに応じて加算される料金単価が違います。

https://aws.amazon.com/jp/bedrock/pricing/

### Cloudflare AI Gatewayについて
生成AIのアプリケーションの運用には、ログの分析だったり、コスト・パフォーマンスの管理や最適化、エラー処理などを考えていく必要があるかと思います。CloudflareのAI Gatewayは、これらの課題感を少なめなコード量で適応できるものになっています。

https://developers.cloudflare.com/ai-gateway/

主な特徴をまとめると：
* **分析**: リクエスト数、トークン数、実行コストなどのメトリクスを表示し、アプリケーションの使用状況を可視化できる。
* **リアルタイムログ**: リクエストやエラーの詳細をリアルタイムで確認できる。
* **キャッシュ**: リクエストをCloudflareのキャッシュから提供することで、速度を向上させ、コストを削減できる。
* **レート制限**: 一定時間内に受け取るリクエスト数を制限し、アプリケーションの負荷を管理できる。
* **リクエスト再試行とフォールバック**: エラー発生時に自動でリクエストを再試行し、代替モデルにフォールバックする機能もある。

という感じです。現在対応しているモデルは以下を参照してください。

https://developers.cloudflare.com/ai-gateway/providers/


## ハンズオンの流れ
1. AWSアカウントの作成と管理者権限を持つIAMユーザーの作成
(ハンズオンで使用可能なコンソール操作用のIAMユーザーを所持している方は不要)
1. Amazon Bedrockの設定
3. IAMユーザーの作成
5. Cloudflare側へ
5. お片付け

## 0. AWS側でやることの一覧
* Amazon Bedrockで、`Amazon Titan Text G1 - Express`のモデルを許可しておく
* AWS IAMで`AmazonBedrockFullAccess`のポリシーを持っているIAMユーザー（マネコン不要）を作成して、アクセスキーとシークレットアクセスキーをメモする

以上になります。上記のことがすんなりできる方は、`kameoncloud様`の記事に飛んでください。

https://zenn.dev/kameoncloud/articles/ec03482b70d57f


## 1. AWSアカウントの作成と管理者権限を持つIAMユーザーの作成

:::note info
既にハンズオンで使用可能なコンソール操作のIAMユーザーを所持している方はこのステップを飛ばしてください。
:::

<details><summary>クリックすると手順の詳細が展開されます。</summary>

### 1-1 AWSアカウントの作成
サインアップまでの手順は公式のほうで説明されておりますので、こちらを参照していただければと思います。

https://aws.amazon.com/jp/register-flow/

### 1-2 管理者権限を持つIAM ユーザーの作成
rootユーザーでの作業は安全性の観点から推奨されません。そこで、管理者権限を持つ IAM ユーザーを作成し、以降の作業はこのユーザーで行います。

1. AWSマネジメントコンソールに rootユーザーでログインします。
![png1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/c51190ac-4faf-bc05-d098-1807b6570587.png)

1. 画面上部の検索バーで「IAM」と入力し、表示されたサービスの「IAM」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/9ea9ed7a-0a21-111c-36d1-c6b9446a1f36.png)
1. 左側のメニューから「ユーザー」を選択し、「ユーザーの作成」をクリックします。
1. ユーザー名を入力します（例：「admin-user」）。
1. 「AWS マネジメントコンソールへのユーザーアクセスを提供する」にチェックを入れ、「パスワードの設定」で「自動生成されたパスワード」または「カスタムパスワード」を選択します。
1. 「次へ」をクリックします。
1. 「ポリシーを直接アタッチする」を選択し、検索バーに「AdministratorAccess」と入力します。表示された「AdministratorAccess」ポリシーにチェックを入れ、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/ec83539d-554c-32b7-842f-1bd98d00ff14.png)
1. 設定内容を確認し、「ユーザーの作成」をクリックします。
1. 「.csv ファイルのダウンロード」をクリックし、認証情報をダウンロードします。このファイルは安全な場所に保管してください。
1. 「ユーザーリストに戻る」をクリックしてユーザー作成プロセスを完了します。

### 1-3 新しい管理者ユーザーでログイン

1. AWSマネジメントコンソールからサインアウトします。
1. ログイン画面で、先ほどダウンロードした .csv ファイルに記載されている「コンソールサインイン URL」をクリックします。
1. ユーザー名とパスワードを入力してログインします。
1. 初回ログイン時にパスワードの変更を求められるので、新しいパスワードを設定します。

これで、管理者権限を持つ IAMユーザーの作成とログインが完了しました。以降の手順は、このユーザーを使用して実行してください。

:::note warn
セキュリティのため、rootユーザーの認証情報は安全に保管し、日常的な操作には使用しないでください。また、多要素認証（MFA）を有効にすることを強くお勧めします。
:::


</details>

## 2. Amazon Bedrockの設定について
Amazon Bedrockを利用するための設定手順を説明します。
### 2-1 Amazon Titan Text G1 - Expressを有効にする
まず、Amazon Titan Text G1 - Expressのモデルを有効にします。
1. AWSマネジメントコンソールにログインします。
1. リージョンは「**東京**」を選択してください。
1. 画面上部の検索バーで「Bedrock」と入力し、選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/025bef1c-5532-cdef-40f7-f42149766dd8.png)
1. 左側のメニューから「モデルアクセス」を選択してください。
1. 「Enable specific models」をクリックし「Amazon Titan Text G1 - Express」を選択し「Next」、「Submit」を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/a737378f-e0ab-3b0c-72bb-1e683f572e8e.png)

6. アクセスが許可されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/e70df0e5-126d-bd46-9218-649ed266a086.png)


### 2-2 modelIDを確認する
今回Cloudflare AI Gatewayとの連携にAmazon Bedrockのエンドポイントの情報が必要になります。エンドポイントの形式は、
`https://bedrock-runtime.<region>.amazonaws.com/model/<modelID>/invoke`
となるため、使用するmodelIDの情報が必要となります。その確認方法は以下の手順です。

1. Bedrockコンソールの左側メニューから「ベースモデル」を選択し、検索窓に`Titan`を入力し、検索窓下に表示される「モデル名 = Titan Text G1 - Express」選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/3f29d843-0f7b-bd38-d1ce-fd2ca0618780.png)

1. 表示されたモデル名をクリックし詳細画面へ遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/528f544c-e3fa-53a8-3740-fffeca42f25b.png)


1. 画面下部の「API リクエスト」内の「modelId」を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/90db86e3-4b12-2836-a530-873a098f0234.png)

### 2-3 モデルをちょっとだけ試してみる。
1. Bedrockコンソールの左側メニューから「プレイグラウンド」の「チャット」をクリックしてください。
1. 「モデルを選択」を押して、Titan Text G1 - Expressを選択して「適用」を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/da7b9ba9-f80e-1fa8-9ea8-85fdc566d9a0.png)
1. あとは何か入力して試してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/9a780bf3-0adc-8fd5-a285-7f3899b19635.png)

## 3. IAMユーザーの作成について
Cloudflare AI GatewayとAmazon Bedrockを連携するために、IAMユーザーを作成します。このユーザーには、Bedrockのモデルを呼び出すための権限を付与します。

### 3-1 IAMユーザーの作成手順
1. AWSマネジメントコンソールにログインし、「IAM」サービスを選択します。
1. 左側のメニューから「ユーザー」を選択し、「ユーザーを作成」をクリックします。
1. ユーザー名を入力します。
    ```ユーザー名
    cloudflare-handson-20240712
    ```
1. 今回はマネジメントコンソールへのアクセスは**必要ない**ので、そのまま「次へ」をクリックします。
1. 「ポリシーを直接アタッチする」を選択し、`AmazonBedrockFullAccess`を検索してチェックを入れ、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/248fe1c6-bb85-cdef-3fa9-d87016f58e69.png)

1. 「ユーザーの作成」をクリックします。
1. ユーザーが作成されたら、ユーザー名を選択し「セキュリティ認証情報」をクリックし「アクセスキーの作成」を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635880/4faa7042-29a1-8e2e-b95c-0292a0799d5b.png)
1. ユースケースに「コマンドラインインターフェイス (CLI)」を選択し、「上記のレコメンデーションを理解し、アクセスキーを作成します。」にチェックをつけ「次へ」をクリックします。
1. 説明タグは任意で入力可能ですが、今回はそのまま入力せずに「アクセスキーを作成」をクリックします。
1. 表示された認証情報（アクセスキーとシークレットアクセスキー）をダウンロードまたはメモしてください。
 *これらの認証情報は非常に重要です。安全に保管してください。

:::note info
補足情報
ポリシー的にはInvokeModelをAllowしておけばいいので、AmazonBedrockFullAccessを使用したくない場合はこちらを利用してください。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BedrockInvokeModelPolicy",
            "Effect": "Allow",
            "Action": "bedrock:InvokeModel",
            "Resource": "arn:aws:bedrock:*::foundation-model/*"
        }
    ]
}
```
:::




## 4. Cloudflare AI Gatewayとの連携に必要な情報の整理
Cloudflare AI Gatewayとの連携に必要な情報は以下の通りです。

#### IAMユーザーの アクセスキー:
形式: 20文字の英数字（例：AKIAOAOSAIKOUEXAMPLE）
場所: ユーザー作成時にダウンロードしたCSVファイル、または認証情報画面に表示

#### IAMユーザーの シークレットアクセスキー:

形式: 40文字の英数字（例：wJalrXUtnHOGE/DEMOENG/uHbRfiCYEXAMPLEKEY）
場所: ユーザー作成時にダウンロードしたCSVファイル、または認証情報画面に表示

#### Amazon Bedrockのモデルを許可したAWSのリージョン:

形式: us-east-1、ap-northeast-1など
確認方法: AWSマネジメントコンソールの右上に表示されているリージョンを確認
備考: 今回は東京の「**ap-northeast-1**」を使用

#### Amazon Bedrockのエンドポイント:

形式: `https://bedrock-runtime.<region>.amazonaws.com/model/<modelID>/invoke`
確認方法: モデルIDに関しては、Bedrockコンソールの「ベースモデル」から、使用するモデルを選択し確認できます。または、以下のページを参照してください。

https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns

エンドポイントに関しては下記を参照してください。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/bedrock.html


備考：今回は、Amazon	Titan Text G1 - Expressを使用するので、
```
https://bedrock-runtime.ap-northeast-1.amazonaws.com/model/amazon.titan-text-express-v1/invoke
```
こちらになります。

以上で、AWS側の設定手順は完了です。次に、Cloudflare AI Gatewayの設定手順に進みましょう。

## 5. Cloudflare側へ

こちらのURIに飛んでください。

https://zenn.dev/kameoncloud/articles/ec03482b70d57f


## 6. お片付け
* 作成したIAMユーザーの`cloudflare-handson-20240712`を削除