Amazon BedrockのCode Interpretationの実行環境に思いをはせる

:::note info
Agents for Amazon Bedrock の Code Interpretation は 7/14 時点で Preview 中の機能です。将来的に動作や仕様が変更される可能性があります。
:::

## はじめに
Code Interpretation は Agents for Amazon Bedrock に追加された新しい機能です。ユーザーが要求したタスクを実行するためのコードスぺニットを安全なサンドボックス環境で生成、実行し、結果を提供します。

詳細は以下の記事が参考になります。

https://qiita.com/moritalous/items/50aa76ea4c65841eed45

## 実行環境の調査
安全なサンドボックス環境とはどんな環境なんでしょう。恐らく独立したコンテナ環境等と推測されますが、 Code Interpretation さんにお願いしていろいろ情報を確認してみました。

### 基本情報
プロンプト
```
platform モジュールで実行環境の情報を表示して
```

Code Interpretation が生成したコードはエージェントのトレースから確認できます。
```py
import platform

print("OS Name:", platform.system())
print("OS Release:", platform.release())
print("OS Version:", platform.version())
print("Architecture:", platform.architecture())
print("Machine:", platform.machine())
print("Processor:", platform.processor())
```

実行結果
```
OS Name:       Linux
OS Release:    5.10.216-225.855.amzn2.aarch64
OS Version:    #1 SMP Wed May 8 19:03:06 UTC 2024
Architecture:  ('64bit', '')
Machine:       aarch64
Processor:     aarch64
```

ARM アーキテクチャで動作する Amazon Linux 2 環境であるようです。

### ディスク
プロンプト
```
os.popen で df -h を実行して
```

生成されたコード
```py
import os

cmd = "df -h"
output = os.popen(cmd).read()
print(output)
```

実行結果
```
Filesystem               Size  Used Avail Use% Mounted on
overlayfs:/overlay/root  2.0G  8.3M  1.8G   1% /
/dev/root                1.4G  1.4G     0 100% /rom
devtmpfs                 494M     0  494M   0% /dev
/dev/vdb                 2.0G  8.3M  1.8G   1% /rom/overlay
tmpfs                    495M     0  495M   0% /dev/shm
tmpfs                    495M  6.4M  489M   2% /run
tmpfs                     99M     0   99M   0% /run/user/0
```

ルートファイルシステムとして OverlayFS がマウントされていることから、やはりコンテナ環境である可能性が高そうです。サイズは 2 GB でした。

### CPU
プロンプト
```
os.open で lscpu を実行して
```

生成されたコード
```py
import subprocess

cmd = "lscpu"
process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
print(output.decode())
```

実行結果
```
Architecture:        aarch64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           1
NUMA node(s):        1
Vendor ID:           ARM
Model:               1
Model name:          Neoverse-N1
Stepping:            r3p1
BogoMIPS:            243.75
L1d cache:           64K
L1i cache:           64K
L2 cache:            1024K
L3 cache:            32768K
NUMA node0 CPU(s):   0
Flags:               fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp ssbs
```

コア数は 1。Model name が Neoverse-N1 であることから、AWS Graviton2 と推測されます。

### メモリ
プロンプト
```
os.popen で /proc/meminfo を実行して
```

生成されたコード
```py
import os

cmd = "cat /proc/meminfo"
output = os.popen(cmd).read()
print(output)
```

実行結果
```
MemTotal:        1013372 kB
MemFree:          631388 kB
MemAvailable:     655916 kB
Buffers:            2896 kB
Cached:           204228 kB
SwapCached:            0 kB
Active:            42580 kB
Inactive:         307740 kB
Active(anon):        140 kB
Inactive(anon):   151488 kB
Active(file):      42440 kB
Inactive(file):   156252 kB
Unevictable:           4 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                72 kB
Writeback:             0 kB
AnonPages:        139340 kB
Mapped:            78716 kB
Shmem:              8424 kB
KReclaimable:      12120 kB
Slab:              22604 kB
SReclaimable:      12120 kB
SUnreclaim:        10484 kB
KernelStack:        1600 kB
PageTables:         1532 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      506684 kB
Committed_AS:     334264 kB
VmallocTotal:   135290159040 kB
VmallocUsed:        1912 kB
VmallocChunk:          0 kB
Percpu:              120 kB
AnonHugePages:     65536 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
```

メモリは 1 GB でした。

### 環境変数
プロンプト
```
osモジュールで環境変数の一覧を取得して
```

生成されたコード
```py
import os

env_vars = os.environ

for key, value in env_vars.items():
    print(f"{key}={value}")
```

実行結果
```
XDG_SESSION_ID=c2
HOSTNAME=localhost
PYENV_ROOT=/home/runtime/.pyenv
TERM=unknown
SHELL=/usr/bin/bash
HISTSIZE=1000
PYENV_VERSION=3.11.8
USER=runtime
PYENV_DIR=/opt/amazon/ci-repl-agent/var/files
PYENV_VIRTUALENV_INIT=1
PATH=/home/runtime/.pyenv/versions/3.11.8/bin:/home/runtime/.pyenv/libexec:/home/runtime/.pyenv/plugins/python-build/bin:/home/runtime/.pyenv/plugins/pyenv-virtualenv/bin:/home/runtime/.pyenv/plugins/pyenv-update/bin:/home/runtime/.pyenv/plugins/pyenv-doctor/bin:/home/runtime/.pyenv/plugins/pyenv-virtualenv/shims:/home/runtime/.pyenv/shims:/home/runtime/.pyenv/bin:/home/runtime/.pyenv/plugins/pyenv-virtualenv/shims:/home/runtime/.pyenv/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/runtime/.local/bin:/home/runtime/bin
MAIL=/var/spool/mail/runtime
PWD=/opt/amazon/ci-repl-agent/var/files
LANG=en_US.UTF-8
PYENV_HOOK_PATH=/home/runtime/.pyenv/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks:/home/runtime/.pyenv/plugins/pyenv-virtualenv/etc/pyenv.d
HISTCONTROL=ignoredups
HOME=/home/runtime
SHLVL=1
PYENV_SHELL=bash
LOGNAME=runtime
LESSOPEN=||/usr/bin/lesspipe.sh %s
```
Python のバージョンは v3.11.8 であるようです。

### インストール済みの Python ライブラリ
プロンプト
```
os.popen で pip list を実行して
```

生成されたコード
```py
import os

cmd = "pip list"
stream = os.popen(cmd)
output = stream.read()
print(output)
```

実行結果
```
Package             Version
------------------- ------------
absl-py             2.1.0
aiosignal           1.3.1
annotated-types     0.7.0
anyio               4.4.0
asgiref             3.8.1
astor               0.8.1
asttokens           2.4.1
attrs               23.2.0
backoff             2.2.1
bcrypt              4.1.3
beautifulsoup4      4.12.3
blinker             1.8.2
blis                0.7.11
bokeh               2.4.3
branca              0.7.2
cachetools          5.3.3
catalogue           2.0.10
certifi             2024.6.2
cffi                1.16.0
chardet             5.2.0
charset-normalizer  3.3.2
click               8.1.7
click-plugins       1.1.1
cloudpathlib        0.16.0
cloudpickle         3.0.0
confection          0.1.5
contourpy           1.2.1
cryptography        40.0.2
cssselect2          0.7.0
cycler              0.12.1
cymem               2.0.8
decorator           4.4.2
distro              1.9.0
Django              5.0.6
dnspython           2.6.1
duckdb              0.8.1
email_validator     2.1.1
entrypoints         0.4
et-xmlfile          1.1.0
executing           2.0.1
Faker               19.13.0
fastapi             0.111.0
ffmpeg-python       0.2.0
ffmpy               0.3.2
filelock            3.14.0
Flask               3.0.3
Flask-Cors          4.0.1
Flask-Login         0.6.3
fonttools           4.53.0
frozenlist          1.4.1
fsspec              2024.5.0
future              1.0.0
gensim              4.3.2
greenlet            3.0.3
gTTS                2.5.1
gunicorn            22.0.0
h11                 0.14.0
h2                  4.1.0
hpack               4.0.0
httptools           0.6.1
Hypercorn           0.17.3
hyperframe          6.0.1
idna                3.7
imageio             2.34.1
imageio-ffmpeg      0.5.1
imgkit              1.2.3
importlib_metadata  7.1.0
importlib_resources 6.4.0
ipython             8.25.0
itsdangerous        2.2.0
jedi                0.19.1
Jinja2              3.1.4
joblib              1.4.2
kiwisolver          1.4.5
langcodes           3.4.0
language_data       1.2.0
lazy_loader         0.4
loguru              0.7.2
lxml                5.2.2
marisa-trie         1.1.1
markdown-it-py      3.0.0
markdown2           2.4.13
markdownify         0.12.1
MarkupSafe          2.1.5
matplotlib          3.9.0
matplotlib-inline   0.1.7
matplotlib-venn     0.11.10
mdurl               0.1.2
mizani              0.9.3
moviepy             1.0.3
mpmath              1.3.0
multidict           6.0.5
murmurhash          1.0.10
mutagen             1.47.0
networkx            3.3
nltk                3.8.1
numexpr             2.10.0
numpy               1.26.4
openai              1.33.0
opencv-python       4.10.0.82
openpyxl            3.1.3
orjson              3.10.3
packaging           24.0
pandas              1.5.3
pandasai            1.5.3
parso               0.8.4
patsy               0.5.6
pdf2image           1.17.0
pdfkit              1.0.0
pdfminer.six        20231228
pdfplumber          0.11.0
pdfrw               0.4
pexpect             4.9.0
pillow              10.3.0
pip                 24.0
platformdirs        4.2.2
plotly              5.22.0
plotnine            0.12.4
pooch               1.8.1
preshed             3.0.9
priority            2.0.0
proglog             0.1.10
prompt_toolkit      3.0.45
psycopg2-binary     2.9.9
ptyprocess          0.7.0
pure-eval           0.2.2
pycparser           2.22
pydantic            1.10.15
pydantic_core       2.18.4
pydub               0.25.1
Pygments            2.18.0
pymongo             4.7.2
PyNaCl              1.5.0
pyodbc              5.1.0
pyOpenSSL           23.2.0
pyparsing           3.1.2
PyPDF2              3.0.1
pypdfium2           4.30.0
pypng               0.20220715.0
pyshp               2.3.1
python-dateutil     2.9.0.post0
python-dotenv       1.0.1
python-multipart    0.0.9
pytz                2024.1
PyWavelets          1.6.0
pyxlsb              1.0.10
PyYAML              6.0.1
pyzbar              0.1.9
qrcode              7.4.2
rarfile             4.2
redis               5.0.4
regex               2024.5.15
reportlab           4.2.0
retrying            1.3.4
rich                13.7.1
scikit-image        0.23.2
scikit-learn        1.5.0
scipy               1.13.1
seaborn             0.13.2
setuptools          65.5.0
shapely             2.0.4
shellingham         1.5.4
six                 1.16.0
smart-open          6.4.0
sniffio             1.3.1
soupsieve           2.5
spacy               3.7.4
spacy-legacy        3.0.12
spacy-loggers       1.0.5
SQLAlchemy          1.4.52
sqlparse            0.5.0
srsly               2.4.8
stack-data          0.6.3
starlette           0.37.2
statsmodels         0.14.2
svglib              1.5.1
svgwrite            1.4.3
sympy               1.12.1
tenacity            8.3.0
text-unidecode      1.3
textblob            0.18.0.post0
thinc               8.2.3
threadpoolctl       3.5.0
tifffile            2024.5.22
tinycss2            1.3.0
torch               2.3.0
torchaudio          2.3.0
torchvision         0.18.0
tornado             6.4
tqdm                4.66.4
traitlets           5.14.3
typer               0.9.4
typing_extensions   4.12.1
tzdata              2024.1
ujson               5.10.0
uvicorn             0.30.1
uvloop              0.19.0
Wand                0.6.13
wasabi              1.1.3
watchfiles          0.22.0
wcwidth             0.2.13
weasel              0.3.4
webencodings        0.5.1
Werkzeug            3.0.3
wordcloud           1.9.3
wsproto             1.2.0
xarray              2023.8.0
xgboost             2.0.3
XlsxWriter          3.2.0
xml-python          0.4.3
xyzservices         2024.4.0
yarl                1.9.4
zipp                3.19.1
zopfli              0.2.3
```

numpy や pandas 以外にもいろいろ入っていますね。インストール済みのライブラリから何ができそうかを考えてもよさそうです。beautifulsoup4 もインストールされていますが、Code Interpretation の実行環境はインターネットアクセスがないため、スクレイピングのコードを生成しても実行することはできません。

### 追加のライブラリをインストール
前述のとおりインターネットアクセスがないため、ネットワークエラーになります。

プロンプト
```
boto3 で EC2 インスタンスをリストして
```

生成されたコード1
```py
import boto3

# EC2クライアントを作成
ec2 = boto3.client('ec2')

# インスタンスの一覧を取得
response = ec2.describe_instances()

# 各インスタンスの情報を表示
for reservation in response['Reservations']:
    for instance in reservation['Instances']:
        print(f"Instance ID: {instance['InstanceId']}")
        print(f"Instance Type: {instance['InstanceType']}")
        print(f"State: {instance['State']['Name']}")
        print("---")

```

実行結果1
```
Traceback (most recent call last):
  File "/home/runtime/.pyenv/versions/3.11.8/lib/python3.11/site-packages/IPython/core/interactiveshell.py", line 308, in raise_error
    raise self.error_in_exec
  File "/home/runtime/.pyenv/versions/3.11.8/lib/python3.11/site-packages/IPython/core/interactiveshell.py", line 3577, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-1-8cbf83ebfd09>", line 1, in <module>
    import boto3
ModuleNotFoundError: No module named 'boto3'

"エラーが発生しました。boto3がインストールされていないようです。
boto3はAWS SDKのPythonバージョンで、別途インストールする必要があります。
pipを使ってboto3をインストールしてから、もう一度コードを実行してみましょう。",
```


生成されたコード2
```
!pip install boto3
```

実行結果2
```
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0xffffa48dd790>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/boto3/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0xffffa48dda10>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/boto3/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0xffffa48d0290>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/boto3/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0xffffa48d09d0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/boto3/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0xffffa48d1490>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/boto3/
ERROR: Could not find a version that satisfies the requirement boto3 (from versions: none)
ERROR: No matching distribution found for boto3

"boto3のインストールに失敗しているようです。
このコード実行環境ではインターネット接続ができていないため、pipでパッケージをインストールできないようです。
別の方法として、boto3がインストール済みの仮想環境を用意するか、AWSの認証情報を設定する必要があります。
しかし、この実行環境ではそれらの操作ができないため、EC2インスタンスの一覧を取得することはできません。"
```

以上です。