はじめに
OpenAI Realtime API を利用した ChatBot を Amazon ECS(Fargate) にデプロイする方法を確認した。できるだけシンプルな構成で実装し、以下のステップを通じて実際に動作させる
- ローカル環境で OpenAI Realtime API を使った ChatBot を動作させる
- Amazon ECR にリポジトリを作成する
- ChatBot の Docker イメージを Amazon ECRリポジトリにプッシュする
- Amazon ECSで ChatBot の Docker を起動する
- AWS にデプロイした ChatBot の動作確認
1. ローカル環境で OpenAI Realtime API を使った ChatBot を動作させる
ソースコードを取得する
git clone https://github.com/aRaikoFunakami/hello-cdk.git
Dockerコンテナの作成
cd hello-cdk/samples/
docker build -t my-realtime-chat .
コンテナを起動する
docker run --rm -p 3000:3000 --name chat-container --env OPENAI_API_KEY=$OPENAI_API_KEY my-realtime-chat
別のターミナルで wscat を使ってアプリの動作を確認する
wscat -c ws://localhost:3000/ws
出力例
Connected (press CTRL+C to quit)
> こんにちはChatGPT
< こんにちは!何かお手伝いできることはありますか?
> 私の名前はrairaiiです。あなたの名前は?
< 私の名前はChatGPTです。何かご質問やお話ししたいことがあれば、どうぞ教えてください。
> 私の名前わかりますか?
< あなたのお名前はrairaiiですね。どうぞよろしくお願いします。
> なぜおぼえているの?
< 会話の流れを理解し、適切に応答するために、先ほど教えていただいた情報を一時的に覚えています。会話が終了すると、情報は保持されませんのでご安心ください。
コンテナの終了
Ctrl-C で終了する。
Dockerプロセスが残っていないか確認
docker ps -a
明示的にKILL
docker kill chat-container
2. Amazon ECR にリポジトリを作成する
公式サイトを参考にした
Amazon ECR コンソール (https://console.aws.amazon.com/ecr/repositories) を開いて下記の作業を行う
- ナビゲーションバー から、リポジトリを作成する リージョン を選択する
- [リポジトリ] ページで、[プライベートリポジトリ] を選択し、[リポジトリの作成] を選択する
- [リポジトリ名] に、リポジトリの一意の名前を入力する
- [Tag immutability] (タグの不変性) で、このリポジトリのタグの変更可能性の設定を選択する
- [暗号化設定] では、[AES-256] または [AWS KMS] のいずれかを選択する
- [Create] (作成) を選択
3. ChatBot の Docker イメージを Amazon ECRリポジトリにプッシュする
aws configure での設定は終了しているものとする
(1) Docker クライアントの認証
イメージをプッシュする先の Amazon ECRレジストリに対して Docker クライアントを認証する。
Amazon ECRレジストリに対して Docker を認証するには、 aws ecr get-login-password コマンドを実行する。
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
(2) プッシュするDockerイメージを確認
プッシュするイメージを確認するために、 docker images コマンドを実行し、システム上のコンテナイメージを一覧表示する
docker images
出力例
REPOSITORY TAG IMAGE ID CREATED SIZE
my-realtime-chat latest 38ac3d587110 11 hours ago 437MB
(3) プッシュするDockerイメージにタグ付け
Amazon ECRレジストリ、リポジトリ、およびオプションのイメージタグ名の組み合わせを使用してイメージにタグを付けする。レジストリ形式は .dkr.ecr..amazonaws.com とする。
docker tag <REPOSITORY>:<TAG> <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<ECR_REPOSITORY>:<NEW_TAG>
次のパラメーターと値でタグ付けする
パラメータ | 値 |
---|---|
REPOSITORY | my-realtime-chat |
TAG | latest |
aws_ account_id | xxxxxxxxxxxx |
ECR_REPOSITORY | my-realtime-chat |
NEW_TAG | latest |
docker tag my-realtime-chat:latest xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/my-realtime-chat:latest
タグ付けの確認
docker images
出力例
REPOSITORY TAG IMAGE ID CREATED SIZE
xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/my-realtime-chat latest 38ac3d587110 12 hours ago 437MB
(4) Docker イメージをECRにプッシュする
タグ付けされたイメージをECRにプッシュする
docker push xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/my-realtime-chat:latest
(5) プッシュしたイメージを確認する
aws ecr list-images --repository-name my-realtime-chat --region us-east-1
出力例
imageIds:
- imageDigest: sha256:522cc5d1b874816fb23b6791cbfd2c1e497296416b3a2de2113b173285720939
imageTag: latest
4. Amazon ECSで ChatBot の Docker を起動する
(1) クラスターを作成
- Amazon ECS コンソールを開く
- [クラスター] のページで [クラスターの作成] を選択する
- [クラスター名] を入力する
- 画面下部の [作成] を選択しクラスターを作成する
(2) タスク定義を作成
- [タスク定義] のページで [新しいタスク定義の作成] を選択する
- [タスク定義ファミリー] を入力する
- [オペレーティングシステム/アーキテクチャ] で [Linux/ARM64] を選択する
ARM CPUを搭載したMacで作成したDockerを起動させるためには Linux/ARM64 を選択する
-
[コンテナ -1] の [ポートマッピングの設定] を行う
- [コンテナポート] : 3000
- [プロトコル] : TCP
- [アプリケーションプロトコル] : HTTP2
- [環境変数] に OPENAI_API_KEY を追加
(3) クラスタにサービスをデプロイ
- [クラスター] のページで [作成したクラスタ名] を選択する
- [サービス] の [作成] を選択する
- [デプロイ設定] の [ファミリー] で作成したタスクを設定する
- [デプロイ設定] の [サービス名] を設定する
- [デプロイ設定] の [ネットワーキング] の [セキュリティグループ] で [新しいセキュリティグループの作成] を選択する
- [セキュリティグループ名] を設定する
-
[セキュリティグループのインバウンドルール] を設定する
- タイプ : カスタムTCP
- プロトコル:TCP
- ポート範囲:3000
- ソース : Anywhere
- [作成ボタン] を設定してサービスを作成する
- 数分かかるのでしばらく待つ
5. AWS にデプロイした ChatBot の動作確認
(1) タスクの Public IP を取得
動作確認のためにデプロイして ChatBot が動作している Docker のIPアドレスを取得する
- [クラスター] から作成した [サービス] を選択し、[タスク] タブを開く
- 実行中の [タスク] を選択する
- [ネットワーキング] のタブを開く
- パブリック IP のIPアドレスを確認する
(2) wscat で動作確認を行う
wscat -c ws://<パブリック IP>:3000/ws
出力例
Connected (press CTRL+C to quit)
> Hello, ChatGPT
< Hello! How can I assist you today?
> What's your name
< You can just call me ChatGPT. How can I assist you today?
> My name is rairaii.
< Nice to meet you, Rairaii! How can I assist you today?
> Do you know my name?
< Yes, you mentioned that your name is Rairaii. How can I help you today?
> Why do you remember me?
< I don't have memory of past interactions, so I only know what you tell me during our current conversation. How can I assist you now?
AWSにデプロイして動作することが確認できた
トラブルシューティング
macOS で docker pushが失敗する場合
Error saving credentials: error storing credentials - err: exec: "docker-credential-osxkeychain": executable file not found in $PATH, out: ``
docker-credential-helperをインストールする
brew install docker-credential-helper
リファレンス