open artifacts for bedrock をdockerコンテナで動かす

## 結論
- ホストになるDockerコンテナをDOOD (Docker Outside of Docker) で起動したら、あとはレポジトリの説明通りにするだけで素直に動いた。

(追記)
- VSCode上のターミナルを使っている前提です。[ポート転送機能](https://forest.watch.impress.co.jp/docs/news/1529993.html)で作業を減らしています。
- pythonの実行環境がうまく動いてない。WLSときは大丈夫だった。→　https://qiita.com/h1day/items/5961fb221c30a2fa51e2
  
- us-east-1を直で書いてある場所がったので、us-east-1でモデルを有効にしとかないと動かない。

https://github.com/aws-samples/open_artifacts_for_bedrock

## 構成
```mermaid
graph TB
    subgraph DockerHost["Docker Host (DOOD)"]
        subgraph NextJS["Next.js Application"]
            UI[UI Components]
            VercelAI[Vercel AI SDK]
            CodeInterceptor[Code Interceptor]
        end
        subgraph Docker["Docker (Inner Container)"]
                PythonEnv[Python 3.10 Environment]
        end
    end
    
    User[User] --> UI
    UI <--> VercelAI
    VercelAI <--> CodeInterceptor
    CodeInterceptor <--> PythonEnv
    
    subgraph AWS["Amazon Web Services"]
        Bedrock[Amazon Bedrock]
        Claude[Claude 3.5 Model]
    end
    
    VercelAI <--> Bedrock
    Bedrock --> Claude
    
    style DockerHost fill:#f0f0f0,stroke:#333,stroke-width:2px
    style AWS fill:#FF9900,stroke:#333,stroke-width:2px
    style NextJS fill:#cce7ff,stroke:#333,stroke-width:2px
    style Docker fill:#d0e9f6,stroke:#333,stroke-width:2px

````
## 手順
最新のLTSのubuntuに docker, Node.js, yarn, gitをインストール。
``` dockerfile
# ベースイメージとして最新のLTS版のUbuntuを使用
FROM ubuntu:latest

# システムのアップデートと必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    curl \
    git \
    build-essential \
    ca-certificates \
    sudo \
    gnupg \
    lsb-release \
    apt-transport-https \
    software-properties-common

# Dockerのインストール（公式Dockerリポジトリを追加して最新バージョンをインストール）
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
    apt-get update && apt-get install -y docker-ce-cli

# Node.jsのインストール (NodeSourceを利用して最新のLTSバージョンをインストール)
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \
    apt-get install -y nodejs

# Yarnのインストール
RUN npm install -g yarn

# Dockerを後でDOOD用に設定する場合のためのディレクトリ作成 (オプション)
RUN mkdir -p /workspace

# コンテナ内で作業するディレクトリを設定
WORKDIR /workspace

# Git、Node.js、Yarn、Dockerのバージョン確認 (デバッグ用)
RUN git --version && node --version && yarn --version && docker --version

# デフォルトのコマンド（必要に応じて変更可能）
CMD [ "bash" ]

```

Dockerイメージをビルド。名前は ubuntu_yarn にしました。
```
docker build -t ubuntu_yarn .
```

Dockerコンテナを実行。名前は OpenArtifactsForBedrock にしました。
DOODの設定を行うため、以下のように、ホストの/var/run/docker.sockをコンテナにマウントして実行します。
```
docker run -it --name OpenArtifactsForBedrock -v /var/run/docker.sock:/var/run/docker.sock ubuntu_yarn
```

インストールの確認。全部バージョン番号が出る。
```
git -v 
node -v
yarn -v
docker -v
```

## 手順2：レポジトリの入手と実行

### open artifacts for bedrock 
レポジトリを好きな場所でclone
```　
git clone https://github.com/aws-samples/open_artifacts_for_bedrock.git
```
中にあるdockerfileをビルド
```　
cd open_artifacts/docker_files 
docker build -t python3.10 .
```

クローンしてできたopen_artifacts_for_bedrockディレクトリに.envファイルを作成。
AWSで入手したBedrockのAPIキーを設定する。AWS_REGIONも東京ならap-northeast-1など変えておく。

このファイルを設定する場合は、USERNAMEとPASSWORDは何か設定しておかないと出来上がったものに入れなかった。

``` .env
AWS_ACCESS_KEY_ID=*******
AWS_SECRET_ACCESS_KEY=******
AWS_REGION=us-east-1
PYTHON_DOCKER_IMAGE=python3.10
MODEL_ID=anthropic.claude-3-5-sonnet-20240620-v1:0
USERNAME=
PASSWORD=
```

実行
```
cd ..
yarn
yarn dev
```

ブラウザで　http://localhost:3000 にアクセスする。
dockerコンテナなのにlocalhostでアクセスできているのは、[ポート転送機能](https://forest.watch.impress.co.jp/docs/news/1529993.html)のおかげ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/04a7068c-14fb-64b1-aa55-f89bb741acb4.png)

## 参考

https://qiita.com/moritalous/items/a8c1d9125634c3aea7e2

https://blog.serverworks.co.jp/open-artifacts-for-amazon-bedrock

https://stackoverflow.com/questions/52135815/yarn-is-having-troubles-with-the-network-connection